UI自动化过程中,为了防止操作过快导致元素找不到,增强用例的健壮性,我们可以适当添加合适的等待时间
显式等待
显示等待是Selenium客户可以使用的命令式过程语言。
它们允许您的代码暂停程序执行,或冻结线程,直到满足通过的条件。
这个条件会以一定的频率一直被调用,直到等待超时。这意味着只要条件返回一个假值,它就会一直尝试和等待.
WebDriver
配合until()
和until_not()
方法,根据判断条件进行等待,如果条件成立,则执行下一步,否则继续等待,知道超过设置的最长时间。
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.baidu.com/")
self.driver.maximize_window()
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_wait(self):
def mywait(driver):
return len(self.driver.find_elements(By.CSS_SELECTOR, "#s-top-left a")) > 5
WebDriverWait(self.driver, 10).until(mywait)
self.driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("selenium" + Keys.ENTER)
WebDriverWait(self.driver,30).until(expected_conditions.element_to_be_clickable((By.PARTIAL_LINK_TEXT,"下一页 >")))
# 执行js,滚动到底部
self.driver.execute_script("document.documentElement.scrollTop=100000")
# 点击下一页
self.driver.find_element(By.PARTIAL_LINK_TEXT,"下一页").click()
tips:
- until() 中传入等待函数名即可,不要带括号
- selenium中内置一些等待条件,详情可参考源码
from selenium.webdriver.support import expected_conditions
expected_conditions.element_to_be_clickable
expected_conditions.visibility_of_element_located
- …
隐式等待
通过隐式等待,WebDriver在试图查找_任何_元素时在一定时间内轮询DOM。
设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
self.driver.implicitly_wait(3)
隐式等待,一旦设置后,整个会话期间有效。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。