@@ -114,6 +114,7 @@ def __initialize_variables(self):
114114 ]
115115 self.version_tuple = tuple(self.version_list)
116116 self.version_info = self.version_tuple
117+ self.time = time.time
117118 self.__page_sources = []
118119 self.__extra_actions = []
119120 self.__js_start_time = 0
@@ -381,6 +382,7 @@ def click(
381382 self, selector, by="css selector", timeout=None, delay=0, scroll=True
382383 ):
383384 self.__check_scope()
385+ self.__skip_if_esc()
384386 if not timeout:
385387 timeout = settings.SMALL_TIMEOUT
386388 if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -671,6 +673,7 @@ def click(
671673 self.__demo_mode_pause_if_active(tiny=True)
672674 elif self.slow_mode:
673675 self.__slow_mode_pause_if_active()
676+ self.__set_esc_skip()
674677
675678 def slow_click(self, selector, by="css selector", timeout=None):
676679 """Similar to click(), but pauses for a brief moment before clicking.
@@ -1586,6 +1589,7 @@ def get_partial_link_text_attribute(
15861589 def click_link_text(self, link_text, timeout=None):
15871590 """This method clicks link text on a page."""
15881591 self.__check_scope()
1592+ self.__skip_if_esc()
15891593 if not timeout:
15901594 timeout = settings.SMALL_TIMEOUT
15911595 if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -4404,11 +4408,35 @@ def add_cookies(self, cookies):
44044408 for cookie_dict in cookies:
44054409 self.driver.add_cookie(cookie_dict)
44064410
4411+ def __set_esc_skip(self):
4412+ if hasattr(self, "esc_end") and self.esc_end:
4413+ script = (
4414+ """document.onkeydown = function(evt) {
4415+ evt = evt || window.event;
4416+ var isEscape = false;
4417+ if ("key" in evt) {
4418+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
4419+ } else {
4420+ isEscape = (evt.keyCode === 27);
4421+ }
4422+ if (isEscape) {
4423+ document.sb_esc_end = 'yes';
4424+ }
4425+ };"""
4426+ )
4427+ self.execute_script(script)
4428+
4429+ def __skip_if_esc(self):
4430+ if hasattr(self, "esc_end") and self.esc_end:
4431+ if self.execute_script("return document.sb_esc_end;") == "yes":
4432+ self.skip()
4433+
44074434 def wait_for_ready_state_complete(self, timeout=None):
44084435 """Waits for the "readyState" of the page to be "complete".
44094436 Returns True when the method completes."""
44104437 self.__check_scope()
44114438 self._check_browser()
4439+ self.__skip_if_esc()
44124440 if not timeout:
44134441 timeout = settings.EXTREME_TIMEOUT
44144442 if self.timeout_multiplier and timeout == settings.EXTREME_TIMEOUT:
@@ -4427,6 +4455,7 @@ def wait_for_ready_state_complete(self, timeout=None):
44274455 time.sleep(0.01)
44284456 if self.undetectable:
44294457 time.sleep(0.035)
4458+ self.__set_esc_skip()
44304459 return True
44314460
44324461 def wait_for_angularjs(self, timeout=None, **kwargs):
@@ -5775,6 +5804,7 @@ def highlight(
57755804 scroll - the option to scroll to the element first (Default: True)
57765805 timeout - the time to wait for the element to appear """
57775806 self.__check_scope()
5807+ self.__skip_if_esc()
57785808 if isinstance(selector, WebElement):
57795809 self.__highlight_element(selector, loops=loops, scroll=scroll)
57805810 return
@@ -8709,6 +8739,7 @@ def wait_for_element_visible(
87098739 ):
87108740 """Same as self.wait_for_element()"""
87118741 self.__check_scope()
8742+ self.__skip_if_esc()
87128743 if not timeout:
87138744 timeout = settings.LARGE_TIMEOUT
87148745 if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
@@ -13478,6 +13509,7 @@ def __demo_mode_scroll_if_active(self, selector, by):
1347813509 self.slow_scroll_to(selector, by=by)
1347913510
1348013511 def __demo_mode_highlight_if_active(self, selector, by):
13512+ self.__skip_if_esc()
1348113513 if self.demo_mode:
1348213514 # Includes self.slow_scroll_to(selector, by=by) by default
1348313515 self.__highlight(selector, by=by)
@@ -14379,6 +14411,7 @@ def setUp(self, masterqa_mode=False):
1437914411 self.firefox_arg = sb_config.firefox_arg
1438014412 self.firefox_pref = sb_config.firefox_pref
1438114413 self.verify_delay = sb_config.verify_delay
14414+ self.esc_end = sb_config.esc_end
1438214415 self.recorder_mode = sb_config.recorder_mode
1438314416 self.recorder_ext = sb_config.recorder_mode
1438414417 self.rec_print = sb_config.rec_print
@@ -15698,6 +15731,31 @@ def _get_driver_name_and_version(self):
1569815731 else:
1569915732 return None
1570015733
15734+ def _get_num_handles(self):
15735+ return len(self.driver.window_handles)
15736+
15737+ def _get_rec_shift_esc_script(self):
15738+ return (
15739+ """document.onkeydown = function(evt) {
15740+ evt = evt || window.event;
15741+ var isEscape = false;
15742+ if ("key" in evt) {
15743+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
15744+ last_key = evt.key;
15745+ } else {
15746+ isEscape = (evt.keyCode === 27);
15747+ last_key = evt.keyCode;
15748+ if (last_key === 16) {
15749+ last_key = "Shift";
15750+ }
15751+ }
15752+ if (isEscape && document.sb_last_key === "Shift") {
15753+ document.sb_esc_end = "yes";
15754+ }
15755+ document.sb_last_key = last_key;
15756+ };"""
15757+ )
15758+
1570115759 def _addSkip(self, result, test_case, reason):
1570215760 """This method should NOT be called directly from tests."""
1570315761 addSkip = getattr(result, 'addSkip', None)
0 commit comments