8

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 moment, or is it still planned?

3 Answers 3

11

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.

Sign up to request clarification or add additional context in comments.

1 Comment

It seems like you can test visiblity. from selenium.webdriver.support import expected_conditions as ec and then ec.visibility_of(elm). The return object of that is selenium.webdriver.support.expected_conditions.visibility_of but I haven't figured out how to get the visibility out of it.
3

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.

Comments

0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.