简介

在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后,

才会将操作权限在交给我们的程序。

但是,由于ajax和各种JS代码的异步加载问题,当一个页面被加载到浏览器时,

该页面内的元素可以在不同的时间点被加载,这就使得元素的定位变得十分困难,

当元素不再页面中时,使用会抛出ElementNotVisibleException异常,为了解决这个问题,

selenium提供了两种等待页面加载的方式,显示等待和隐式等待,

让我们可以等待元素加载完成后在进行操作。


显示等待: 显式等待指定某个条件,然后设置最长等待时间,程序每隔XX时间看一眼,如果条件成立,

      则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常(TimeoutException)。

隐性等待:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,

     否则一直等到时间截止,然后执行下一步。


显示等待主要使用了WebDriverWait类与expected_conditions模块。

一般写法:WebDriverWait(driver, timeout, poll_frequency, igonred_exceptions).until(method, message)

  1. WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))

Driver:传入WebDriver实例。

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 调用until中的方法的间隔时间,默认是0.5秒

ignored_exceptions: 忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待.

Method:可执行方法

Message: 超时时返回的信息


显式等待

例子

  1.  
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC

  5. driver = webdriver.Chrome()
  6. driver.get("http://somedomain/url_that_delays_loading")
  7. try:
  8. element = WebDriverWait(driver, 10).until(
  9. EC.presence_of_element_located((By.ID, "myDynamicElement"))
  10. )
  11. finally:
  12. driver.quit()

在这个例子中,我们在查找一个元素的时候,不再使用find_element_by_*这样的方式来查找元素,

而是使用了WebDriverWait

try代码块中的代码的意思是:在抛出元素不存在异常之前,最多等待10秒。在这10秒中,

WebDriverWait会默认每500ms运行一次until之中的内容,

而until中的EC.presence_of_element_located则是检查元素是否已经被加载,检查的元素则通过By.

ID这样的方式来进行查找。

就是说,在10秒内,默认每0.5秒检查一次元素是否存在,存在则将元素赋值给element这个变量。

如果超过10秒这个元素仍不存在,则抛出超时异常。

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件,配合该类的方法,

就能够根据条件而进行灵活地等待了

例子:

  1. from selenium.webdriver.support import expected_conditions as EC

  2. wait = WebDriverWait(driver, 10)
  3. # 等待直到元素可以被点击
  4. element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
  1.  

隐式等待

隐式等待指的是,在webdriver中进行find_element这一类查找操作时,如果找不到元素,则会默认的轮询等待一段时间。

这个值默认是0,可以通过以下方式进行设置:

  1. from selenium import webdriver

  2. driver = webdriver.Chrome()
  3. driver.implicitly_wait(10) # 单位是秒
  4. driver.get("http://somedomain/url_that_delays_loading")
  5. myDynamicElement = driver.find_element_by_id("myDynamicElement")
  1.  

selenium等待的更多相关文章

  1. python selenium等待特定网页元素加载完毕

    selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...

  2. selenium等待方式之显示等待

    有时候,页面元素并未及时加载出来导致后面的步骤无法执行 这里就需要在加载前添加等待时间,让目标元素有足够的时间加载出来 第一种方法:使用time.sleep() 这种方法过于强制,无论元素是否加载出来 ...

  3. selenium等待机制

    等待机制 ​ 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...

  4. selenium等待机制学习笔记

    转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...

  5. selenium等待方式详解

    这些方式仅供参考,实际使用体验并不好,最好对find_element()方法进行二次封装. # coding=utf-8 from time import sleep from selenium im ...

  6. selenium 等待页面加载完成

    一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...

  7. [Selenium]等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的

    等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的 /** * Check if the element present with cu ...

  8. Selenium等待某个元素出现之隐式等待

    找不到元素这个问题困扰了两天了,一直怀疑是页面div层次太多,定位不准确.于是就从table开始到最后一层精确定位,仍然找不元素.怎么办,在网上搜索答案,说是可以加个隐式试试,于是在执行前加了一句等待 ...

  9. 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀

    http://blog.csdn.net/pf20050904/article/details/20052485 http://www.cnblogs.com/hellokitty1/p/629584 ...

随机推荐

  1. How to: Set Properties of Web Application Projects

    https://msdn.microsoft.com/library/aa983454(v=vs.100).aspx ASP.NET Web application projects share th ...

  2. bzoj1607 [Usaco2008 Dec]Patting Heads 轻拍牛头——暴力

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1607 观察一下数据范围,就是纯粹的暴力. 代码如下: #include<iostrea ...

  3. sizeof中的表达式不执行

    char a = 255;      printf("%d\n",a);    printf("%d\n",sizeof(++a));      printf( ...

  4. Scala 是一门怎样的语言,具有哪些优缺点?

    保罗·格雷厄姆在<黑客与画家>中写道,Java属于B&D(捆绑与束缚)类型的语言.为何束缚手脚?因为要让新手和明星程序员写出类似质量的代 码,尽可能的抹消人的才华对程序的影响.不同 ...

  5. 初步认识kafka

    Kafka是用于日志处理的分布式消息队列,Kafka使用scala语言开发的. 各个开源分布式处理系统Cloudera.Apache Storm.Spark都支持与Kafka集成.其日志处理的一个场景 ...

  6. c# winform控件dock属性停造位置、摆放顺序详解

    dock : [英文释义- 码头.依靠][winform释义- 获取或设置当前控件依靠到父容器的哪一个边缘.] 用途:多数控件都有这个属性,主要用来设置控件的布局. 但对于不太了解这个属性的朋友来说有 ...

  7. 转 方法区(method) )、栈区(stack)和堆区(heap)之JVM 内存初学

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...

  8. [转帖]c++ 面试整理

    1. 继承方式 public    父类的访问级别不变 protected    父类的public成员在派生类编程protected,其余的不变 private        父类的所有成员变成pr ...

  9. 转录组入门(3):了解fastq测序数据

    sra文件转换为fastq格式 fastq-dump -h --split-3 也就是说如果SRA文件中只有一个文件,那么这个参数就会被忽略.如果原文件中有两个文件,那么它就会把成对的文件按*_1.f ...

  10. PHP操作Redis相关函数

    String数据类型 $redis->set('key','TK'); $redis->set('number','1'); //设置值 $redis->setex('key',5, ...