测试过程当中,咱们通过发现脚本执行的时候展示出来的效果都是很快结束了,为了观察执行效果咱们会增长一个等待时间来观察一下执行效果。这种等待时间咱们只是为了咱们便于观察,这种状况下是否包含等待时间不会影响咱们的执行结果,可是有一种状况会直接影响咱们的执行结果。在咱们打开一个网站的时候须要因为环境的因素致使页面没有下载完成时,去定位元素此时没法找到元素,这个时候会影响到咱们,这个时候咱们增长一个等待时间就会显得万分重要。python
selenium 主要提供Explicit Waits和Implicit Waits两种模式的等待,可是python time 模块也提供了一种非智能的sleep()等待,这个设置之后必须强制等待设置的时间,只有等待时间结束之后才会继续执行,这种模式我通常会用到观察执行的效果时候,而Explicit Waits和Implicit Waits 这两种我会在实际自动化测试中使用。web
下面咱们了解一下这种三种等待模式测试
1.强制等待网站
强制等待属于python time模块的一种等待,使用时须要引入time模块才可使用,下面咱们看一断代码ui
#-*- coding:utf-8 -*- import time from datetime import datetime print (datetime.now()) #获取当前时间 time.sleep(10) #设置等待时间10s print(datetime.now()) #再次获取当前时间
代码很简单,主要是获取当前时候后设置了一个等待时间,而后在等待时间后面设置一个事物,这个事物来查看等待时间结束后的当前时间。经过执行结果咱们很好的看到只有执行完毕等待之后才会再次执行下一步骤。google
2.隐性等待 implicitly_wait()spa
什么是隐性的等待呢?所谓的隐性的等待就是咱们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于咱们设置的最大值。用高考来举个例子,高考的语文是6月7日上午9:00 - 11:30,咱们只能在规定的时间内答题交卷,不能超过11:30 交卷,若是咱们提早答完卷,那么咱们能够提早交卷,那么这里规定的2.5小时是咱们设置的最大等待时间,而咱们能够再任什么时候间答完试卷均去交卷,可是咱们不能超过11:30交卷,也就是说明最大的答卷时间就是2.5h(正好也是由于此时刚刚高考结束,因此我这边也趁下热度)。设计
下来咱们看段代码code
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) #这里设置智能等待10s driver.get('https://www.google.com.hk') print (driver.title) driver.quit()
这里主要采用 implicitly_wait(10)方法来设置等待时间,这里要比time.sleep(10)更加智能一些。blog
说明:首先Implicit Waits默认是等待时间是0,同时隐性等待是对driver起做用,因此只要设置一次便可,没有必要处处设置
3.显示的等待 WebDriverWait()
WebDriverWait()会配合until()和until_not()方法一块儿使用,根据判断条件而进行灵活进行处理时间等待问题,他会不断的根据你设定的条件去判断,直到超过你设置的等待时间,若是设置的条件知足,而后进行下一步操做,若是没有知足会报一个'selenium.common.exceptions.TimeoutException: Message: '错误,使用WebDriverWait首先须要导入from selenium.webdriver.support.ui import WebDriverWait模块,下面咱们看一下实际的代码
#-*- coding:utf-8 -*- from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.maximize_window() try: #为了更好的对比效果,首先咱们设置了一个存在的元素,而后在去找一个不存在的元素,一样设置了10s的等待时间 #kw元素存在时 print(datetime.now()) # element = WebDriverWait(driver,10).until( #until 也属于WebDriverWait,表明一直等待,直到某元素可见,until_not与其相反,判断某个元素直到不存在 EC.presence_of_element_located((By.ID, "kw")) #presence_of_element_located主要判断页面元素kw在页面中存在。 ) #kw111元素不存在时 print(datetime.now()) element = WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID, "kw111")) ) finally: print(datetime.now()) driver.quit()
看下刚才代码的效果
经过运行的结果咱们能够看到,id为kw和kw111两个元素,均设置了10s等待时间,当id为kw的元素找到的时候很快就去执行下一步,,找id 为'kw111'元素时,发现没法找到一直等待下去,期间会不断的去巡查,直到超过咱们设置的链接超时的时间报一个TimeoutException错误。
在使用显示的等待等待时候咱们使用到了Expected Conditions的方法presence_of_element_located,由于该模块设计的内容比较多,我在这里就不详细介绍,后面会单独拿一个专题来介绍该模块。