selenium 设置元素等待

自动化测试执行过程是非常迅速的,而有些网站加载页面元素的时间由于各种原因会比较慢,这样就会造成一些错误的bug,例如网页还未加载完成时,测试脚本已经开始执行对某个未加载完的元素的操作,然后在控制台报错,未找到该元素。

为了避免快速执行造成的结果的不稳定性,我们在测试中增加“元素等待”控制。

在以往的测试用例中,小编用的都是做简单的方式:

#导入时间设置的库
import time
#设置等待3秒
time.sleep(3)

接下来小编要介绍2种“高阶”等待:显式等待,隐式等待

  • 显式等待:即webdriver等待某个条件成立时继续执行,达到最长时间限制时,抛出异常
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.Firefox()
driver.get("https://www.baidu.com/")

#设置等待
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
element.send_keys("selenium")

#WebDriverWait()参数
'''
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver              驱动
timeout             最长时间,超过后报错,单位s
poll_frequency      间隔时间,默认为0.5s
ignored_exceptions  超时后的异常信息,默认抛出的是NoSuchElementException
'''

#util()参数
'''
until(method,message='')
直到method但会的参数为true,否则报错message
util_not(method,message='')不再赘述
'''

#expected_conditions提供的部分方法介绍

#判断标题是否为XXX
element = WebDriverWait(driver,5,0.5).until(EC.title_is("title"))
#判断元素是否可见
element = WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located((By.ID,"xxx")))
#判断元素是否存在
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"xxx")))
#判断一组元素是否存在
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_all_elements_located((By.ID,"xxx")))
#判断元素是否有xxx文本信息
element = WebDriverWait(driver,5,0.5).until(EC.text_to_be_present_in_element((By.ID,"xxx"),text_=""))
#判断元素值是否含有xxx文本信息
element = WebDriverWait(driver,5,0.5).until(EC.text_to_be_present_in_element_value((By.ID,"xxx"),text_=""))
#判断表单是否可用,并切换到表单
element = WebDriverWait(driver,5,0.5).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"xxx")))
#判断一个警告信息是否存在
element = WebDriverWait(driver,5,0.5).until(EC.alert_is_present())
#判断元素是否可点击
element = WebDriverWait(driver,5,0.5).until(EC.element_to_be_clickable((By.ID,"xxx")))
  • 隐式等待:通过设置页面的等待时间,等待页面元素加载完成,相比于显式等待简单得多
from selenium import webdriver
driver=webdriver.Firefox()
#设置隐式等待时间为5s
'''
隐式等待不针对页面上的某一个元素进行等待
当执行元素定位时被执行

当执行对某元素的定位时: 若元素被直接定位,则继续执行,不执行等待 若元素未被直接定位: 则在设定的时间内,不断的定位该元素(设定为10s) 在第5s(10s内)时定位到了该元素,则继续执行,不再继续等待 10s后还未定位到该元素,则跑出NoSuchElementException
''' driver.implicitly_wait(10) driver.get("https://www.baidu.com/") #定位一个错误的元素 kw = driver.find_element_by_id("kwlalala")

最后,小编衷心的说一句,显式和隐式等待在没有绝对把握的情况下,最好不要混合使用哦,否则很有额能会造成不可预期的等待时间

posted @ 2018-01-10 10:38  代码羡  阅读(337)  评论(0编辑  收藏  举报