Skip to content

Suggestion: adding optional parameters to find_element() and related methods in Python binding #2769

@dcavanaugh

Description

@dcavanaugh

AJAX-related problems with find_element()

I have some Python code (which my employer has authorized me to release under the Apache 2.0 license). By modifying webdriver.py, it is possible to change the behavior of find_element() and related methods when additional parameters are present. The goal is to selectively invoke WebDriverWait() instead of self.execute(Command.FIND_ELEMENT) when the parameters include an optional timeout parameter with a value greater than the default value of 0.

Why would anyone want to do this? When using a script recorder like Selenium Builder with an AJAX web application, there will be a failed call to find_element() whenever the script is looking for an element that has not loaded yet.

Example:

wd = webdriver.Firefox()
wd.find_element_by_id("my-element-id").click()

Fails when the element is not yet in the DOM because it loads dynamically in response to user input

Workaround #1:

element = WebDriverWait(wd, timeout ).until( expected_conditions.element_to_be_clickable( ( By.ID, “my-element-id” ) ) )
element.click()

Workaround #2:

errCount = 0
while errCount < 5:
    try:
        wd.find_element_by_id("my-element-id").click()
        break
    except:
        time.sleep(5)
        errCount += 1
        continue

Proposed Solution

Neither of the above-mentioned workarounds is desirable because of the number of times it has to be coded into the script for a typical AJAX web application. Instead, it would be better to find a quick way to fix broken find_element() calls.
Example:

wd = webdriver.Firefox()
wd.find_element_by_id("my-element-id").click()

Breaks if we look for the element before the server renders it

wd.find_element_by_id("my-element-id",10,”clickable”).click()

Succeeds because of modifications to webdriver.py; using WebDriverWait with a 10 second time limit for the element to become clickable.

I have code that implements the concept; will attempt to demonstrate in a branch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions