From 872a8a818f358f786a102f48608992dce4db365b Mon Sep 17 00:00:00 2001 From: Pete Savage Date: Wed, 4 Jul 2018 10:03:33 +0100 Subject: [PATCH] Fix Firefox to be more reliable on versions over 45 * Firefox behaves differently between an ActionChains click and a "real" click. The ActionChains click does not try to wait for page navigation as such, navigations often fail because the page is changed from under it. * We now use a "real" click if a navigation has been requested. This now also initiates a sleep for 1s immediately after we instruct marionette to click. This is then enough time for any CSS animations to finish up before we continue running any more selenium methods to check for page objects to be displayed. --- src/widgetastic/browser.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/widgetastic/browser.py b/src/widgetastic/browser.py index 4856e88e..89de4a88 100644 --- a/src/widgetastic/browser.py +++ b/src/widgetastic/browser.py @@ -4,7 +4,6 @@ import inspect import six import time - from cached_property import cached_property from collections import namedtuple from jsmin import jsmin @@ -23,9 +22,8 @@ StaleElementReferenceException, NoAlertPresentException, LocatorNotImplemented, WebDriverException) from .log import create_widget_logger, null_logger -from .xpath import normalize_space from .utils import crop_string_middle - +from .xpath import normalize_space Size = namedtuple('Size', ['width', 'height']) Location = namedtuple('Location', ['x', 'y']) @@ -351,10 +349,15 @@ def click(self, locator, *args, **kwargs): """ self.logger.debug('click: %r', locator) ignore_ajax = kwargs.pop('ignore_ajax', False) + nav_click = kwargs.pop('nav_click', False) el = self.move_to_element(locator, *args, **kwargs) self.plugin.before_click(el) # and then click on current mouse position - self.perform_click() + if nav_click and self.browser_type.lower() == 'firefox' and self.browser_version > 52: + el.click() + time.sleep(1) + else: + self.perform_click() if not ignore_ajax: try: self.plugin.ensure_page_safe()