本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张 邯
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~
在使用Selenium做测试时,有时候下一步的操作是基于上一步操作成功的基础上,比如说,进入新链接、提交表单等,这时,我们就需要等待,判断上一步操作已经完成,进入下一步操作。
(一)强制等待
使用方法:
import time #导入模块time.sleep(seconds) #等待seconds秒
这就是强制等待,无论页面加载成功与否,总是等待seconds秒,seconds秒之后再进行下一步操作。
优点是操作简单,无需考虑太多,只需两行程序即可。缺点是灵活性差,如果提前加载成功则浪费了时间,如果没有加载成功,则下一步的操作无法正常进行。
示例:
from selenium import webdriverimport timedriver=webdriver.Chrome()url='https://movie.douban.com/'driver.get(url)time.sleep(3) #等待3秒
(二)隐式等待
使用方法:
driver.implicitly_wait(time) #等待time秒
隐式等待是指设置一个最长等待时间,如果在此时间内页面提前加载完成,则进行下一步操作;如果在规定时间内仍然未加载成功,则不再等待,下一步操作无法进行。优点是:这个方式的设置是对于整个driver周期的,所以一般在开头设置一次即可。缺点是:我们有时并不需要页面的全部元素加载成功,所以等待个别非目标元素加载时会浪费一些时间。另外,在打开新的窗口时,需要重新设置隐式等待。
示例:
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitdriver=webdriver.Chrome()driver.implicitly_wait(10) #隐式等待10秒url='https://movie.douban.com/'driver.get(url)
(三)显式等待
使用方法:
from selenium.webdriver.support.ui import WebDriverWait #导入模块WebDriverWait(driver, timeout, poll_frequency=poll_frequency, ignored_exceptions=None)
其中,driver是传入的WebDriver实例,timeout是最长的等待时间,单位是秒,poll_frequency是循环查询的时间间隔,单位是秒,默认为0.5秒,ignored_exceptions是忽略的异常,如果在调用查询时得到的异常在此之内,则忽略掉,继续进行,如果不在此范围内,则报告错误,默认为NoSuchElementException。
一般要配合until和until_not进行使用,它们是用以判断某元素是否存在或者是否不存在。
until(method,message='')until_not(method,message='')
其中,method是在等待期间循环使用的方法,message是在超时时会显示TimeoutException。
method参数一般使用selenium的中一个模块:
from selenium.webdriver.support import expected_conditions as EC
这种方法灵活度高,方法多变,可以配合各种判断条件使用。我们在进行精确的测试时往往采用显式等待。缺点是方法和参数较多,大家在使用时可以自行查阅,无需记忆全部。
示例:
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECurl='https://baidu.com/'driver.get(url)print("开始第一次测试")print(datetime.now())driver_wait = WebDriverWait(driver,5).until(EC.title_is(u"百度一下,你就知道") ,message='页面标题不是“百度一下,你就知道”) #每隔5秒判断一下是否页面的title是“百度一下,你就知道”print(datetime.now())print("开始第二次测试")print(datetime.now())driver_wait = WebDriverWait(driver,5).until(EC.title_is(u"谷歌"),message='页面标题不是“谷歌”') #每隔5秒判断一下是否页面的title是“谷歌”print(datetime.now())
运行结果为:
我们可以得知,第一次测试成功。开始测试的时间是2019-11-22 11:02:40.966795,结束测试的时间是2019-11-22 11:02:40.978788,没有抛出错误信息,程序正常运行。说明页面的标题就是“百度一下,你就知道”。
第二次测试失败。开始测试的时间是2019-11-22 11:02:40.979787,然后得到了TimeoutException:Message: 页面标题不是“谷歌”。没有打印结束测试的时间。说明页面的标题不是“谷歌”,程序抛出错误信息,然后终止运行。
以上就是selenium的三种等待方式,大家可以按需使用。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持! 往期推文推荐实战演练——爱婴医院中莆田系医院数据分析(一)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。 投稿邮箱:[email protected] 投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。