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日期操作学习笔记
Oct 07 Python
Python解惑之True和False详解
Apr 24 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
python实现UDP协议下的文件传输
Mar 20 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
pandas 数据类型转换的实现
Dec 29 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自动选择 连接本地还是远程数据库
2010/12/02 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
node.js 发布订阅模式的实例
2017/09/10 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
python 等差数列末项计算方式
2020/05/03 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
模具毕业生推荐信
2014/02/15 职场文书
水电站项目建议书
2014/05/12 职场文书
大学生个人总结范文
2015/02/15 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
Python利用capstone实现反汇编
2022/04/06 Python