Python selenium如何设置等待时间


Posted in Python onSeptember 15, 2016

我们前面介绍的Selenium的WebDriver测试方法是基于网页来进行的。之前的例子都是用简单的网页来操作,可能体会不到网页的加载过程,但实际应用过程中,网页加载是要消耗一定的时间的。你的脚本已经开始运行,但你要定位的元素却还没加载出来,此时就会报出一个找不到元素的错误。显然,没有考虑加载时间的脚本不是一个成功的脚本。今天我们就来介绍一下如何设置等待时间。

等待的三种方法

time.sleep(n)

强制等待n秒。Python本身的函数,包含在time包中,使用前需要导入time包。我们之前的实例中经常会使用这种等待,方便大家能看清脚本执行的结果。这种等待方法十分笨拙,无论页面加载得如何,都必须等待n秒,可以说是十分不智能了。

implicitly_wait(n)

最长等待n秒,若n秒内页面加载完成,则提前结束等待。WebDriver提供的等待方法,也被称为隐性等待,比强制等待聪明了一点,但如果页面本身包含一个超大视频之类的文件,就算我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有些弊端。

WebDriverWait(n)

最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在,若存在则提前结束等待。也是WebDriver提供的等待方法,也被称为显性等待,这种等待比隐性等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。

实例

强制等待在之前例子中都有使用过了,我们就来看一看WebDriver提供的两种等待方法

隐性等待

其实隐性等待在之前的介绍中也有使用过,但没有特别提到使用的方法。我们这次来打开网易的首页,这是一个加载内容很多的门户网站,根据网速不同,目测大概要10秒左右才能加载完毕,我们把等待时间设置为60秒,然后计算一下从打开页面到点击页面导航栏中的【公开课】按钮需要多久。

# coding = utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(60) #隐性等待时间60秒
time_start = time.time() #记录打开页面时的时间
driver.get('https://www.163.com/')
driver.find_element_by_id('js_love_url').click()
time_end = time.time() #记录点击按钮后的时间
print('access time is : ', time_end - time_start) #打印时间差,即实际消耗时间
time.sleep(2) #强制等待2秒,为了观察我们确实打开了【公开课】页面
driver.quit()

脚本执行结束可以看到,虽然我们设置了隐性时间为60秒,但5秒左右(看我下面的执行结果)页面已加载完毕,可以点击【公开课】按钮。下面是我的一次执行结果,显示了整个加载时间。

>>>access time is : 5.717327117919922

显性等待

显性等待使用时需要导入selenium.webdriver.support.wait.WebDriverWait类,API如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver:不用说了,你定义的WebDriver浏览器(Chrome,Firefox等)
  • timeout:最长等待时间,单位为秒
  • poll_frequency:间隔查找元素的时间,默认为0.5秒(不设定就是0.5秒),也就是说默认0.5秒去查看一次要查找的元素是否存在,找到了就结束整个显性等待,否则继续等待0.5秒再查找一次
  • ignored_exceptions=None:超时发送的异常信息,默认发送NoSuchElementException

由于显性等待可能需要确认元素是否存在,一般还要配合以下两个方法使用

until(method, message='')
until_not(method, message='')
  • method:until()的method意为将驱动程序提供的方法作为参数调用,直到返回为not False,until_not()的method就是直到返回为False
  • message:超时传的异常信息

注意,method()必须是可调用的方法,要有__call__()方法。上面的例子,我们重新写一下。

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time

driver = webdriver.Chrome()
class button():
 def __call__(self, driver):
  if driver.find_element_by_id('js_love_url'):
   return True
  else:
   return False

driver.implicitly_wait(60)
time_start = time.time()
driver.get('https://www.163.com/')

# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver,2,0.5).until(button()) 
time_end = time.time()
print('access time is : ', time_end - time_start)
time.sleep(2)
driver.quit()

看完这个例子可能会有疑问,我显性等待明明设置了是2秒,为什么没有报错呢。因为我们同时也设置了隐性等待时间,两者时间取最长的等待时间为实际等待时间,因此在这里例子里,等待的时间还是60秒。

总结

1、Selenium可以采取三种等待,最智能的为显性等待WebDriverWait()
2、隐性等待和显性等待同时存在时,取两者中最长的等待时间为有效等待时间
3、显性等待中的until(method())的method()为可调用方法,可以自己定义,也可以用匿名函数等方法,这个我们以后细谈
4、隐性等待设置一次,即贯穿整个脚本始终,强制等待则必须在每个需要等待之处设置

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Supervisor进行进程监控以及自动启动
May 29 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 Python
深入理解pytorch库的dockerfile
Jun 10 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 #Python
Python selenium 三种等待方式详解(必会)
Sep 15 #Python
python使用pymysql实现操作mysql
Sep 13 #Python
python实现可以断点续传和并发的ftp程序
Sep 13 #Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 #Python
Python中操作mysql的pymysql模块详解
Sep 13 #Python
python常用函数详解
Sep 13 #Python
You might like
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
Angularjs 基础入门
2014/12/26 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
基于Python实现一个简单的银行转账操作
2016/03/06 Python
python中的字典操作及字典函数
2018/01/03 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
什么是岗位职责
2013/11/12 职场文书
北京奥运会口号
2014/06/21 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
教师培训简讯
2015/07/20 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
初中历史教学反思
2016/02/19 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python