Python +selenium之设置元素等待
注:本文转载http://www.cnblogs.com/mengyu/p/6972968.html
当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难。如果因为在加载某个元素时延迟而造成ElementNotVisibleException 的情况出现,那么就会降低自动化脚本的稳定性,我们可以设置元素等待时间改善这种问题造成的不稳定性。selenium 主要提供Explicit Waits和Implicit Waits两种模式的等待,但是python time 模块也提供了一种非智能的sleep()等待,这个设置以后必须强制等待设置的时间,只有等待时间结束以后才会继续执行,这种模式我一般会用到观察执行的效果时候,而Explicit Waits和Implicit Waits 这两种我会在实际自动化测试中使用。
WebDriver提供了两种类型的等待,显示等待和隐式等待
1.强制等待
强制等待属于python time模块的一种等待,使用时需要引入time模块才可以使用,下面我们看一断代码
#-*- coding:utf-8 -*-
import time
from datetime import datetime
print (datetime.now()) #获取当前时间
time.sleep(10) #设置等待时间10s
print(datetime.now()) #再次获取当前时间
代码很简单,主要是获取当前时候后设置了一个等待时间,然后在等待时间后面设置一个事物,这个事物来查看等待时间结束后的当前时间。通过执行结果我们很好的看到只有执行完毕等待以后才会再次执行下一步骤。
2.隐性等待 implicitly_wait()
什么是隐性的等待呢?所谓的隐性的等待就是我们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于我们设置的最大值。用高考来举个例子,高考的语文是6月7日上午9:00 - 11:30,我们只能在规定的时间内答题交卷,不能超过11:30 交卷,如果我们提前答完卷,那么我们可以提前交卷,那么这里规定的2.5小时是我们设置的最大等待时间,而我们可以再任何时间答完试卷均去交卷,但是我们不能超过11:30交卷,也就是说明最大的答卷时间就是2.5h(正好也是因为此时刚刚高考结束,所以我这边也趁下热度)。
下来我们看段代码
#-*- coding:utf-8 -*-
from selenium import webdriver
from datetime import datetime
print(datetime.now())
driver =webdriver.Firefox()
driver.implicitly_wait(10) #这里设置智能等待10s
driver.get("https://www.baidu.com")
print (driver.title)
print(datetime.now())
driver.quit()
这里主要采用 implicitly_wait(10)方法来设置等待时间,这里要比time.sleep(10)更加智能一些。
说明:首先Implicit Waits默认是等待时间是0,同时隐性等待是对driver起作用,所以只要设置一次即可,没有必要到处设置
3.显示的等待 WebDriverWait()
WebDriverWait()会配合until()和until_not()方法一起使用,根据判断条件而进行灵活进行处理时间等待问题,他会不断的根据你设定的条件去判断,直到超过你设置的等待时间,如果设置的条件满足,然后进行下一步操作,如果没有满足会报一个'selenium.common.exceptions.TimeoutException: Message: '错误,使用WebDriverWait首先需要导入from selenium.webdriver.support.ui import WebDriverWait模块,下面我们看一下实际的代码
#-*- coding:utf-8 -*-
from datetime import datetime
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://www.baidu.com")
driver.maximize_window()
try:
#为了更好的对比效果,首先我们设置了一个存在的元素,然后在去找一个不存在的元素,同样设置了10s的等待时间
#kw元素存在时
print(datetime.now()) #
element = WebDriverWait(driver,10).until( #until 也属于WebDriverWait,代表一直等待,直到某元素可见,until_not与其相反,判断某个元素直到不存在
EC.presence_of_element_located((By.ID, "kw")) #presence_of_element_located主要判断页面元素kw在页面中存在。
)
#kw111元素不存在时
print(datetime.now())
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID, "kw111"))
) finally:
print(datetime.now())
driver.quit()
通过运行的结果我们可以看到,id为kw和kw111两个元素,均设置了10s等待时间,当id为kw的元素找到的时候很快就去执行下一步,,找id 为'kw111'元素时,发现无法找到一直等待下去,期间会不断的去巡查,直到超过我们设置的连接超时的时间报一个TimeoutException错误。
Python +selenium之设置元素等待的更多相关文章
- selenium webdriver——设置元素等待
如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...
- python + slenium自动化测试设置元素等待
WebDriver 提供了两种类型的等待:显式等待和隐式等待. 显式等待 显式等待使 WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常 (TimeoutExcepti ...
- selenium - webdriver - 设置元素等待
隐式等待:implicitly_wait(value), value默认是0 from selenium import webdriverfrom selenium.common.exceptions ...
- Selenium(十一):设置元素等待、上传文件、下载文件
1. 设置元素等待 前面我们接触了几个元素等待方法,sleep.implicitly_wait方法,这一章我们就来整体学一下. 现在大多数Web应用程序使用的都是AJAX技术.当浏览器加载页面时,页面 ...
- Python+Selenium自动化-设置等待三种等待方法
Python+Selenium自动化-设置等待三种等待方法 如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...
- Selenium 2自动化测试实战13(设置元素等待)
一.设置元素等待 若在加载某个元素时延迟而造成的ElementNotVisbleException的情况出现,那么就会降低自动化脚本的稳定性,可以通过设置元素等待改善这种问题造成的不稳定. webdr ...
- selenium学习之元素等待(四)
--为什么要设置元素等待: 目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件.在网页中进行元素定位时, ...
- Python+Selenium自动化-设置浏览器大小、刷新页面、前进和后退
Python+Selenium自动化-设置浏览器大小.刷新页面.前进和后退 1.设置浏览器大小 maximize_window():设置浏览器大小为全屏 set_window_size(500,5 ...
- Selenium 3----设置元素等待
在做Web应用的自动化测试时,定位元素必不可少,这个过程经常出现定位不到元素的情况,常见原因有哪些呢? 1.描述错误 提高编写水平.细心 2.Frame/Iframe框架原因 在元素所在框架里定位该元 ...
随机推荐
- error: field has incomplete type
在头文件使用某一自定义的类的指针或引用时,只需要前置声明该类即可,然而如果该类中有静态成员时,必须包含该类的头文件,而不是使用前置声明.
- Web.config中的设置 forms 中的slidingExpiration的设置
在ASP.NET 网站中,使用 Forms Authentication时,一般的设置是如下的: <authentication mode="Forms"> <f ...
- 一个基于Tp3.2(thinkphp3.2)的工会管理系统
该系统包括11个模块. 会员管理模块 奖惩管理模块 运动会管理模块 新闻管理模块 文档管理模块 经费管理模块 电子提案管理模块 用户管理模块 权限管理模块 系统管理模块 系统的登录 系统主页 这里只是 ...
- HDU 2112 HDU Today Dij+map转化
HDU Today 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并 ...
- Linux 错误集锦
1. CentOS 7 运行yum时出现/var/run/yum.pid已被锁定,PID为xxxx的另一个程序正在运行的问题解决 解决办法: rm -f /var/run/yum.pid,删除文件后再 ...
- 移动构造和移动赋值与std::move
------------------------------------移动构造------------------------------------------ 传统的深拷贝深赋值 对于类中,含有 ...
- 【JOI Camp 2015】IOIO卡片占卜——最短路
题目 [题目描述]K 理事长是占卜好手,他精通各种形式的占卜.今天,他要用正面写着 `I` ,背面写着 `O` 的卡片占卜一下日本 IOI 国家队的选手选择情况.占卜的方法如下:1. 首先,选取五个正 ...
- IOS字符串截取保留小数点后两位
-(NSString*)getTheCorrectNum:(NSString*)tempString { //计算截取的长度 NSUInteger endLength = tempString.len ...
- [Java]ArrayList、LinkedList、Vector、Stack的比较
一.介绍 先回顾一下List的框架图 由图中的继承关系,可以知道,ArrayList.LinkedList.Vector.Stack都是List的四个实现类. AbstractList是一个抽象类,它 ...
- XmlSerilizer序列化出错时,不妨考虑BinaryFormatter
当你使用XmlSerilizer序列化一个结构复杂的类型时出现反射出错 XmlSerilizer并不会告诉你哪个字段属性或者嵌套的字段属性不能被序列号,面对多年前的代码逐一排查很恼人使用BinaryF ...