selenium.wait_for_condition equivalent in Python bindings for WebDriver

后端 未结 3 1789
生来不讨喜
生来不讨喜 2021-02-06 06:33

I\'m moving some tests from Selenium to the WebDriver. My problem is that I can\'t find an equivalent for selenium.wait_for_condition. Do the Python bindings have this at the mo

相关标签:
3条回答
  • 2021-02-06 06:43

    Here's my version of Greg Sadetsky's answer, put into a function:

    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)
    

    It clicks the button, waits for the DOM to change and then returns.

    0 讨论(0)
  • 2021-02-06 06:47

    Currently it isn't possible to use wait_for_condition with WebDriver. The python selenium code does provide the DrivenSelenium class for accessing the old selenium methods, but it can't do wait_for_condition. The selenium wiki has some info on that.

    Your best bet is to use the WebDriverWait class. This is a helper class that periodically executes a function waiting for it to return True. My general usage is

    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
    

    This solution is by no means ideal.. The try/except is necessary for situations where the page request/response cycle is delayed waiting for some ajax activity to complete. If compare_source get's called in the midst of the request/response cycle it'll throw a WebDriverException.

    The test coverage for WebDriverWait is also helpful to look at.

    0 讨论(0)
  • 2021-02-06 06:51

    The Java binding include a Wait class. This class repeatedly checks for a condition (with sleeps between) until a timeout is reached. If you can detect the completion of your Javascript using the normal API, you can take the same approach.

    0 讨论(0)
提交回复
热议问题