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