Skip to content

Commit abc5a08

Browse files
committed
Better error-handling on clicks
1 parent 85b6f9a commit abc5a08

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def test_anything(self):
4848
from seleniumbase.fixtures import page_utils
4949
from seleniumbase.fixtures import xpath_to_css
5050
from selenium.common.exceptions import (StaleElementReferenceException,
51+
MoveTargetOutOfBoundsException,
5152
WebDriverException)
5253
from selenium.common import exceptions as selenium_exceptions
5354
try:
@@ -122,17 +123,18 @@ def click(self, selector, by=By.CSS_SELECTOR,
122123
element = page_actions.wait_for_element_visible(
123124
self.driver, selector, by, timeout=timeout)
124125
element.click()
125-
except WebDriverException:
126+
except (WebDriverException, MoveTargetOutOfBoundsException):
126127
self.wait_for_ready_state_complete()
127-
if not by == By.LINK_TEXT:
128-
# Only use a JavaScript click if not clicking by Link Text
128+
try:
129129
self.__js_click(selector, by=by)
130-
else:
131-
# One more attempt to click on the element
132-
element = page_actions.wait_for_element_visible(
133-
self.driver, selector, by, timeout=timeout)
134-
element.click()
135-
130+
except Exception:
131+
try:
132+
self.__jquery_click(selector, by=by)
133+
except Exception:
134+
# One more attempt to click on the element
135+
element = page_actions.wait_for_element_visible(
136+
self.driver, selector, by, timeout=timeout)
137+
element.click()
136138
if settings.WAIT_FOR_RSC_ON_CLICKS:
137139
self.wait_for_ready_state_complete()
138140
if self.demo_mode:
@@ -2431,6 +2433,18 @@ def __js_click(self, selector, by=By.CSS_SELECTOR):
24312433
% css_selector)
24322434
self.execute_script(script)
24332435

2436+
def __jquery_click(self, selector, by=By.CSS_SELECTOR):
2437+
""" Clicks an element using jQuery. Different from using pure JS. """
2438+
selector, by = self.__recalculate_selector(selector, by)
2439+
self.wait_for_element_present(
2440+
selector, by=by, timeout=settings.SMALL_TIMEOUT)
2441+
if self.is_element_visible(selector, by=by):
2442+
self.__demo_mode_highlight_if_active(selector, by)
2443+
selector = self.convert_to_css_selector(selector, by=by)
2444+
selector = self.__make_css_match_first_element_only(selector)
2445+
click_script = """jQuery('%s')[0].click()""" % selector
2446+
self.safe_execute_script(click_script)
2447+
24342448
def __get_href_from_link_text(self, link_text, hard_fail=True):
24352449
href = self.get_link_attribute(link_text, "href", hard_fail)
24362450
if not href:

0 commit comments

Comments
 (0)