selenium显示等待和隐式等待
selenium显示等待和隐式等待
-
selenium的显示等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
(简而言之,就是直到元素出现才去操作,如果超时则报异常)from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get('https://testerhome.com/') driver.implicitly_wait(10) driver.find_element_by_link_text('【活动】MTSC 2021 深圳站议题征集').click() locator = (By.XPATH, '//*[@id="main"]/div/div[1]/div[1]/div[2]/div/button') WebDriverWait(driver, 6).until(EC.element_to_be_clickable(locator)) driver.find_element(*locator).click() locator = (By.XPATH, '//*[@class="list-container"]/ul/li[6]/a') WebDriverWait(driver, 6).until(EC.element_to_be_clickable(locator)) driver.find_element(*locator).click() time.sleep(3) driver.quit() WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None) driver:浏览器驱动 timeout:最长超过时间,默认以秒为单位 poll_frequency:监测的时间间隔,默认为0.5秒 ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常 WebDriverWait一般有until和until_not方法配合使用 until(method,message) until_not(method ,message)expected_conditions类提供的预期条件判断的方法
方法 说明 title_is 判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值 title_contains 判断当前页面的 title 是否包含预期字符串,返回布尔值 presence_of_element_located 判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见 visibility_of_element_located 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0 visibility_of 跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了 presence_of_all_elements_located 判断是否至少有 1 个元素存在于 dom 树中。举个例子,如果页面上有 n 个元素的 class 都是'column-md-3',那么只要有 1 个元素存在,这个方法就返回 True text_to_be_present_in_element 判断某个元素中的 text 是否 包含 了预期的字符串 text_to_be_present_in_element_value 判断某个元素中的 value 属性是否包含 了预期的字符串 frame_to_be_available_and_switch_to_it 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False invisibility_of_element_located 判断某个元素中是否不存在于dom树或不可见 element_to_be_clickable 判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable staleness_of 等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表 element_selection_state_to_be 判断某个元素的选中状态是否符合预期 element_located_selection_state_to_be 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator alert_is_present 判断页面上是否存在 alert -
selenium的隐式等待
原理:隐式等待,相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。
隐式等待使得WebDriver在查找一个Element或者Element数组时,如果一直查找不到,每隔一段特定的时间就会轮询一次DOM。
注:默认设置超时时间为0,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
from selenium import webdriver driver = webdriver.Firefox() driver.get('http://www.baidu.com') # 隐式等待10秒 driver.implicitly_wait(10)
implicity_wait()默认参数的单位为秒,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。
应用场景
- 隐式等待 尽量默认都加上,时间限定在3-6s,不要太长,这是为了所有的findElement方法都有一个很好的缓冲;
- 显式等待 用来处理隐式等待无法解决的一些问题,如:文件上传;
- 死等 一般不推荐。

浙公网安备 33010602011771号