Python版WebDriver中selenium.wait_for_condition的等效方法

8 投票
3 回答
3956 浏览
提问于 2025-04-16 04:02

我正在把一些测试从Selenium转移到WebDriver。我的问题是,我找不到selenium.wait_for_condition的对应功能。现在Python的接口里有这个功能吗,还是说还在计划中?

3 个回答

0

Java的绑定里有一个叫做Wait的类。这个类会不断地检查某个条件(中间会有暂停),直到达到设定的超时时间。如果你能通过正常的API检测到你的Javascript完成了,你也可以用同样的方法。

3

这是我根据Greg Sadetsky的回答写的一个函数版本:

def click_n_wait(driver, button, timeout=5):
    source = driver.page_source
    button.click()
    def compare_source(driver):
        try:
            return source != driver.page_source
        except WebDriverException:
            pass
    WebDriverWait(driver, timeout).until(compare_source)

这个函数会点击按钮,等页面的内容变化后再继续。

11

目前,使用 WebDriver 的 wait_for_condition 功能是不可行的。虽然 Python 的 Selenium 代码提供了一个 DrivenSelenium 类,可以用来访问旧的 Selenium 方法,但它无法使用 wait_for_condition。Selenium 的维基页面上有一些相关信息

你最好的选择是使用 WebDriverWait 类。这个类是一个辅助工具,它会定期执行一个函数,直到这个函数返回 True。我的一般用法是:

driver = webdriver.Firefox()
driver.get('http://example.com')
add = driver.find_element_by_id("ajax_button")
add.click()
source = driver.page_source

def compare_source(driver):
    try:
        return source != driver.page_source
    except WebDriverException:
        pass

WebDriverWait(driver, 5).until(compare_source)
# and now do some assertions

这个解决方案并不是最理想的……使用 try/except 是必要的,因为在页面请求/响应周期延迟等待某些 AJAX 活动完成时,如果在请求/响应周期中调用 compare_source,就会抛出 WebDriverException。

关于 WebDriverWait 的 测试覆盖率 也很值得一看。

撰写回答