selenium-等待

  1. 显式等待
  2. 隐式等待

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:

  1. until() 中传入等待函数名即可,不要带括号
  2. 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)

隐式等待,一旦设置后,整个会话期间有效。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code