Python selenium如何设置等待时间
作者:kelanmomo 发布时间:2023-08-31 18:53:39
我们前面介绍的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、隐性等待设置一次,即贯穿整个脚本始终,强制等待则必须在每个需要等待之处设置
来源:https://blog.csdn.net/kelanmomo/article/details/82886474


猜你喜欢
- up.htm'::::::: 此程序属扬子原创 ::::::::::::::::::':::::: 在sql2000,200
- 工作中需要根据某个应用程序具体吃了多少内存来决定执行某些操作,所以需要写个小工具来模拟应用程序使用内存情况,下面是我写的一个Python脚本
- 两者在使用效果上没有任何区别,都是为了将实例化后的vue挂载到指定的dom元素中。如果在实例化vue的时候指定el,则该vue将会渲染在此e
- 引入我们在使用mysql数据库时,习惯使用int型作为主键,并设置为自增,这既能够保证唯一,使用起来又很方便,但int型的长度是有限的,如果
- def bytes_to_human(n): symbols = ('K','M','G
- 当数据库的数据量读写频繁的时候,我们就要考虑把数据库的读写分开,以提高数据库的使用效率,(当然还有其他用处比如,备份数据),这个时候我们就要
- MySQL针对不同的用户提供了2种不同的版本:MySQL Community Server:社区版。由MySQL开源社区开发者和爱好者提供技
- 我最近也在研究MySQL性能优化的路上,那么今天也算个学习笔记吧!在小伙伴们开发的项目中,对于MySQL排查问题找出性能瓶颈来说,最容易发现
- Vue.js是一个JavaScript框架,可用于构建Web应用程序的前端框架。特别是在创建复杂功能时,对于每个项目,有必要在我们的应用程序
- 1. 创建主窗口上文中我们建立的图形界面程序 GUIdemo2.py,通过导入图形界面 uiDemo1.py,已经实现了主窗口的创建。1.1
- 一、Python2中的字符存在的解码编码问题如果是现在正在用Python2的人应该都知道存在字符编码问题,就举一个最简单的例子吧:Pytho
- 习惯于使用数据库之前都必须创建一个连接池,即使是单线程的应用,只要有多个方法中需用到数据库连接,建立一两个连接的也会考虑先池化他们。连接池的
- ASP的强大不仅仅局限于接受和显示的交互,更多的是运用ActiveX 组件进行更强大的Web应用。那究竟ActiveX组件为何物?
- 级联查询在ORACLE 数据库中有一种方法可以实现级联查询select * //要查询的字段from table
- jQuery居然都没有JSON的decode和encode,精确类型判断也没有,囧……自己动手写吧!不过这些东西在网上都已经有很好的版本了,
- 本文实例讲述了python判断字符串是否纯数字的方法。分享给大家供大家参考。具体如下:判断的代码如下,通过异常判断不能区分前面带正负号的区别
- 今天在使用pytorch进行训练,在运行 loss.backward() 误差反向传播时出错 :RuntimeError: grad can
- 解释一个机器学习模型是一个困难的任务,因为我们不知道这个模型在那个黑匣子里是如何工作的。解释是必需的,这样我们可以选择最佳的模型,同时也使其
- 前言"胸藏文墨怀如谷,腹有诗书气自华"。 —&mda
- 本文实例讲述了Flask框架使用DBUtils模块连接数据库的操作方法。分享给大家供大家参考,具体如下:Flask连接数据库数据库连接池:D