使用场景:有时候当我们操作页面元素时,需要等待这个过程才能操作成功。
做Ui自动化的时候,考虑到稳定性:多次运行同一脚本,都能够保证它是成功的。
一、强制等待:sleep(秒)
比如sleep(10),就必须等待10秒,才能执行下一步。
简单粗暴,不过代码将会有很多sleep,冗余度会提高。
二、智能等待:显性等待
专门针对特定元素而设置的等待,在规定的时间内找到元素,找到了就执行下一步,
没有找到抛出异常(TimeoutException)。效率高,可以自定义条件。
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(会话对象, 超时时长(秒),去查看条件的周期默认0.5).until(条件)
WebDriverWait(会话对象, 超时时长(秒),去查看条件的周期默认0.5).until_not(条件)
selenium3当中,每一个条件是以类的形式实现的。每一个类都有__init__, __call__
selenium4当中,每一个条件是以函数的形式实现的。每一个函数都有一个_predicate内部函数。闭包
如果条件不成立,那么返回的是False.
使用显性等待的时候,先确定你的条件是什么。然后再去使用显性等待。
等待效果只有一次,不像隐性等待全局可用。
比较多的用法:显性等待 + 短暂的sleep
常用的条件:
visibility_of_element_located(locator) --- locator对应的元素是可见的
element_to_be_clickable(mark) --- mark对应的元素可点击
三、智能等待:隐形等待
调用find_element/find_elements方法的时候,如果元素没找到不会立马报错,
会主动使用隐性等待,达到最大等待时间后,抛出异常。
一个会话(浏览器打开到关闭这个过程)当中,只需要调用一次,全局可用。
没有办法对精准度的元素进行定位,会影响实际的运行效率。
三种方法一起使用代码如下:
1 import time 2 from selenium import webdriver 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 6 driver = webdriver.Chrome() 7 driver.get("https://www.baidu.com") 8 #隐形等待 9 driver.implicitly_wait(10) 10 driver.maximize_window() 11 # 显性等待 12 #每0.5秒扫描一次浏览器,总共扫描5秒,直到找到指定的元素为止,如果找到就返回这个元素,没有找到就抛出异常,并且提示没找到元素 13 el = WebDriverWait(driver,5,0.5).until(lambda el:driver.find_element('xpath','//a[text()="hao123"]'),message="没找到元素") 14 el.click() 15 # 强制等待 16 time.sleep(3) 17 driver.quit()
显示等待结合预期条件判断代码如下:
1 import time 2 from selenium import webdriver 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 6 # driver = webdriver.Chrome() 7 # driver.get("https://www.baidu.com") 8 # #隐形等待 9 # driver.implicitly_wait(10) 10 # driver.maximize_window() 11 # # 显性等待 12 # #每0.5秒扫描一次浏览器,总共扫描5秒,直到找到指定的元素为止,如果找到就返回这个元素,没有找到就抛出异常,并且提示没找到元素 13 # el = WebDriverWait(driver,5,0.5).until(lambda el:driver.find_element('xpath','//a[text()="hao123"]'),message="没找到元素") 14 # el.click() 15 # # 强制等待 16 # time.sleep(3) 17 # driver.quit() 18 # 19 driver = webdriver.Chrome() 20 driver.maximize_window() 21 driver.get("https://www.baidu.com") 22 23 locator = ('xpath','//a[text()="新闻"]') 24 # WebDriverWait()一般与 until()或 until_not()方法配合使用 25 # until(),直到返回值为 True。 26 # until_not(),直到返回值为 Flase。 27 # 判断元素是否可见 28 # 在设置时间内,默认每隔一段时间检测一次当前页面元素是否可见,如果超过设置时间仍检测不到,则抛出异常。 29 WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located(locator),message="元素可见") 30 # 判断元素是否可以点击 31 # 在设置时间内,默认每隔一段时间检测一次当前页面元素是否可点击,如果超过设置时间仍检测不到,则抛出异常。 32 WebDriverWait(driver,5,0.5).until(EC.element_to_be_clickable(locator)) 33 # 判断元素是否存在 34 # 在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间仍检测不到,则抛出异常。 35 WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(locator)) 36 driver.find_element(*locator).click() 37 # 判断标题是否不存在 38 # 在设置时间内,默认每隔一段时间检测一次标题是否不存在,如果超过设置时间仍检测不到,则抛出异常。 39 WebDriverWait(driver,5,0.5).until_not(EC.title_is("123123"),message="标题不是这个") 40 time.sleep(3) 41 driver.quit()标签:selenium,元素,driver,WebDriverWait,0.5,等待,until,三大 From: https://www.cnblogs.com/liyongmei/p/16984942.html