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 pickle模块用法实例
Apr 14 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
python随机数分布random测试
Aug 27 Python
transform python环境快速配置方法
Sep 27 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
wxPython之wx.DC绘制形状
Nov 19 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
Python自带的IDE在哪里
Jul 01 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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实现的随机广告显示代码
2007/06/14 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
详解vue-cli中配置sass
2017/06/21 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
python的id()函数解密过程
2012/12/25 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python单例模式实例详解
2017/03/01 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python实现自动登录
2018/09/17 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
如何使用Python调整图像大小
2020/09/26 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
领导证婚人证婚词
2014/01/13 职场文书
党建示范点实施方案
2014/03/12 职场文书
九寨沟导游词
2015/02/02 职场文书
共青团员自我评价
2015/03/10 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript