selenium等待
简介
在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后,
才会将操作权限在交给我们的程序。
但是,由于ajax和各种JS代码的异步加载问题,当一个页面被加载到浏览器时,
该页面内的元素可以在不同的时间点被加载,这就使得元素的定位变得十分困难,
当元素不再页面中时,使用会抛出ElementNotVisibleException异常,为了解决这个问题,
selenium提供了两种等待页面加载的方式,显示等待和隐式等待,
让我们可以等待元素加载完成后在进行操作。
显示等待: 显式等待指定某个条件,然后设置最长等待时间,程序每隔XX时间看一眼,如果条件成立,
则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常(TimeoutException)。
隐性等待:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,
否则一直等到时间截止,然后执行下一步。
显示等待主要使用了WebDriverWait类与expected_conditions模块。
一般写法:WebDriverWait(driver, timeout, poll_frequency, igonred_exceptions).until(method, message)
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: 超时时返回的信息
显式等待
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
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的一个模块,其中包含一系列可用于判断的条件,配合该类的方法,
就能够根据条件而进行灵活地等待了

例子:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
# 等待直到元素可以被点击
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
隐式等待
隐式等待指的是,在webdriver中进行find_element这一类查找操作时,如果找不到元素,则会默认的轮询等待一段时间。
这个值默认是0,可以通过以下方式进行设置:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 单位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
selenium等待的更多相关文章
- python selenium等待特定网页元素加载完毕
selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...
- selenium等待方式之显示等待
有时候,页面元素并未及时加载出来导致后面的步骤无法执行 这里就需要在加载前添加等待时间,让目标元素有足够的时间加载出来 第一种方法:使用time.sleep() 这种方法过于强制,无论元素是否加载出来 ...
- selenium等待机制
等待机制 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...
- selenium等待机制学习笔记
转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...
- selenium等待方式详解
这些方式仅供参考,实际使用体验并不好,最好对find_element()方法进行二次封装. # coding=utf-8 from time import sleep from selenium im ...
- selenium 等待页面加载完成
一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...
- [Selenium]等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的
等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的 /** * Check if the element present with cu ...
- Selenium等待某个元素出现之隐式等待
找不到元素这个问题困扰了两天了,一直怀疑是页面div层次太多,定位不准确.于是就从table开始到最后一层精确定位,仍然找不元素.怎么办,在网上搜索答案,说是可以加个隐式试试,于是在执行前加了一句等待 ...
- 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀
http://blog.csdn.net/pf20050904/article/details/20052485 http://www.cnblogs.com/hellokitty1/p/629584 ...
随机推荐
- Scala 返回多个值
class A{ var c var d def return={ (c,d,"soyo") //以元组形式返回 }}调用: val s=new A var(a1,a2,a3)=s ...
- .net 必看书籍1
我们2个网站运营群,有很多技术高手,同时也有大部分技术新人,如何从传统asp转到.net,从传统table转到div+css布局,从传统技术转到ajax,从小型程序转到高性能并发的大型程序,我花了2小 ...
- Java高质量20问
问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你在一个线程里初始化了一个 ...
- 微信小程序调用微信支付
1,首先我们先缕清支付的整个流程,详见https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3,第一 ...
- 八皇后问题---详解---参考<<紫书>>
在一个8*8的棋盘上 放置八个皇后 , 使得他们互相不攻击(皇后攻击范围为 同行同列同对角线) , 方法一 : 从64个格子中 选一个子集 , 使得 " 子集 中恰好有八个元素 , 且任意 ...
- ssh项目导入报the import javax.servlet cannot be resolved
在做javaWeb项目时,我们经常会出现丢失包的情况,如下图所示的错误,我们应该怎么解决呢? 根据网上教程向工程中加入tomcat的servlet-api.jar和jsp-api.jar的包 此时项目 ...
- C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案
C#连接Sqlite 出现: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接sqlite数据库代码 ...
- Struts2框架实现简单的用户登入
Struts框架汲取了Struts的优点,以WebWork为核心,拦截器,可变和可重用的标签. 第一步:加载Struts2 类库: 第二步:配置web.xml <?xml version=&qu ...
- Java编译器、JVM、解释器
Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译 ...
- SPPNet论文翻译-空间金字塔池化Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
http://www.dengfanxin.cn/?p=403 原文地址 我对物体检测的一篇重要著作SPPNet的论文的主要部分进行了翻译工作.SPPNet的初衷非常明晰,就是希望网络对输入的尺寸更加 ...