Troubleshooting Tests¶
Contents
Common Issues¶
“Element is not clickable at point (x,y). Other element would receive the click”¶
You may run across errors saying “Element is not clickable at point (x,y). Other element would receive the click: <element>”. This is often due to a fixed element obstructing the element you’re attempting to click, such as a sticky navbar or violator.
The webdriver.actions.scroll
submodule includes the
scroll.into_view_fixed_nav()
function, which scrolls an element into view
relative to a fixed object that may obstruct it. For example, suppose we want to
click on button_element
, but it’s obstructed by a fixed navbar
nav_element
:
...
# Scroll element to the top of the screen, relative to the fixed nav
scroll.into_view_fixed_nav(driver, button_element, nav_element)
# Click the button
button_element.click()
Despite the name, this function is not limited to objects fixed to the top of
the screen. Setting the optional parameter align_to_top=False
will scroll
the target element into view relative to a fixed element on the bottom of the
screen. E.g. suppose we want to click on button_element
, but it’s obstructed
by violator_element
which is fixed to the bottom of the screen:
...
# Scroll element to the bottom of the screen, relative to the violator
scroll.into_view_fixed_nav(driver, button_element, violator_element,
align_to_top=False)
# Click the button
button_element.click()
For more information, see the API documentation for
scroll.into_view_fixed_nav()
.
Accounting for timeouts on slow sites or pages¶
By default, WebDriverTestCase assertion methods wait 10 seconds for the expected condition to occur before failing. There are some instances where the default assertion wait time might not be long enough for a slower site or page, causing tests to timeout prematurely. This default time can be overridden for a specific assertion, an entire test case, or for the entire test project.
Set timeout for a single assertion¶
Each of the WebDriverTestCase assertion methods
accepts an optional parameter wait_timeout
, which overrides the default
timeout for a single assertion. E.g.:
self.assertVisible(element_locator, wait_timeout=30)
Set default timeout for a test case¶
If there are many assertions in a test case that are timing out prematurely, you
can set the DEFAULT_ASSERTION_TIMEOUT
attribute, which will be used as the
default timeout value for all assertions in that class. E.g.:
class SlowPageTestCase(WebDriverTestCase):
"""Example test of a slow page"""
SITE_URL = config.SiteConfig.SLOW_PAGE_URL
# Set the default timeout for this class to 30 seconds
DEFAULT_ASSERTION_TIMEOUT = 30
def test_something(self):
"""Test a thing"""
...
# Will wait 30 seconds
self.assertExists(element_locator)
def test_something_else(self):
"""Test another thing"""
...
# Will wait 30 seconds
self.assertInvisible(element_locator)
# wait_timeout parameter takes precedence
self.assertUrlChange(expected_url, wait_timeout=10)
Set default timeout for entire test project¶
You can also set the default timeout for all test cases in a project by setting
WebDriverConfig.DEFAULT_ASSERTION_TIMEOUT
. E.g.:
class WebDriverConfig(config.WebDriverConfig):
...
DEFAULT_ASSERTION_TIMEOUT = 30
As mentioned previously, this default can be overridden per-test case and per-assertion.
Issues with specific browser drivers¶
Browser-specific WebDrivers occasionally have bugs or quirks specific to them. You may notice that a test is failing in a specific browser due to an exception raised by the driver, rather than an assertion failing, which may be a sign that your test is using a feature that isn’t working or is handled differently in that browser.
Driver-specific issues can be difficult to pinpoint. If the test failure is only happening for a certain browser, or you notice a pattern of tests failing in a browser with similar exceptions, it can be useful to research that issue and see if it’s a known bug or if a workaround exists.
You may also want to check the links to each browser’s Selenium driver in the driver table to see if everything’s up-to-date or if the issue you’re experiencing is documented.
If a workaround can’t be found and the test failure seems to be a browser-specific driver issue, you can skip these tests for the problem browser. See Skipping tests for certain browsers for more info.
Tools for Debugging Tests¶
Screenshots¶
When troubleshooting a test, it can be useful to take screenshots to get a visual of the window during testing. This framework includes utilities for taking screenshots on test failure or at arbitrary points of a test. See the Screenshots documentation for details.
Pausing test execution¶
When troubleshooting, it can be helpful to pause test execution at certain
points review things step-by-step. A simple way to insert a pause is using
Python’s input()
function. This function is meant to be used to prompt for
user input, but it can also be used to pause a test until hitting ‘Enter’,
allowing you to look at the browser window before continuing. E.g.:
...
def test_pause_example(self):
...
# This will pause test execution until you hit enter
# NOTE: you don't need to pass any parameters to input, this is just what
# will be printed to standard output
input('Paused')
...
Reporting an Issue with webdriver_test_tools¶
If the issue you’re encountering appears to be with webdriver_test_tools
specifically (rather than with Selenium or a specific browser driver), you can
report the issue on GitHub. Before creating the issue:
Make sure you’re using the most up-to-date version of the
webdriver_test_tools
package (e.g. runpip install --upgrade webdriver_test_tools
)Check the open GitHub Issues to see if the issue has already been reported
If the issue hasn’t been reported yet but appears to be related to Selenium, check Selenium’s GitHub Issues to see if the issue has already been reported
If the issue isn’t reported there and appears to be specific to WebDriver Test Tools, open a new issue and fill out the required details, being as specific as possible.