Проблема MoveTargetOutOfBoundsException с версией chromedriver> 74 - PullRequest
1 голос
/ 20 января 2020

Я не знаю, почему ActionChains move_to_element() не работает с chromedriver> 74.

(Но он работает с chromedriver 74 и geckodriver.)

Несмотря на то, что я добавил эти три строки перед ActionChains, ему все равно не удалось перейти к элементу.

WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, xxxxx)))
WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.XPATH, xxxxx))
drvier.execute_script("arguments[0].scrollIntoView();", element)

ActionChains(driver).move_to_element(element).click().perform()

И выдать ошибку, как показано ниже:

selenium.common.exceptions.MoveTargetOutOfBoundsException: Сообщение: переместить цель за пределы (информация о сеансе: chrome = 79.0.3945.117)

Я также пытаюсь использовать move_to_element_with_offset, упомянутый в Selenium MoveTargetOutOfBoundsException, даже после прокрутки до элемента , это все еще не работает:

ActionChains(driver).move_to_element_with_offset(element, 5, 5).click().perform()

Ниже приведены настройки хром-драйвера. Есть ли какие-либо настройки, влияющие на ActionChains?

options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('log-level=3')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-proxy-server')
options.add_argument('--disable-extensions')
options.add_argument('--disable-infobars')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=options)

Ответы [ 2 ]

1 голос
/ 20 января 2020

move_to_element использует внутренне move_to

def move_to_element(self, to_element):
    if self._driver.w3c: # default in chromedriver 79
        self.w3c_actions.pointer_action.move_to(to_element)

def move_to(self, element, x=None, y=None):
    #...
    el_rect = element.rect
    left_offset = el_rect['width'] / 2
    top_offset = el_rect['height'] / 2
    left = -left_offset + (x or 0)
    top = -top_offset + (y or 0)

    self.source.create_pointer_move(origin=element, x=int(left), y=int(top))

Указатель мыши перемещается по смещению в зависимости от положения элемента. Вы находите элемент и затем прокручиваете его в поле зрения, используя JavaScript, поэтому смещение вычисляется по неправильным координатам.

Удаление прокрутки JavaScript должно решить проблему.

1 голос
/ 20 января 2020

Поскольку вы используете для вызова click() через ActionChains вместо presence_of_element_located() и visibility_of_element_located(), вам нужно использовать Ожидаемые_условия как element_to_be_clickable() следующим образом:

  • Использование с ActionChains :

    ActionChains(driver).move_to_element(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css")))).click().perform()
    
  • Если вам нужно scrollIntoView() перед вызовом click() вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать следующую стратегию локатора :

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, xxxxx))
    drvier.execute_script("arguments[0].scrollIntoView();", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, xxxxx)))
    ActionChains(driver).move_to_element(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css")))).click().perform()
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Дополнительные замечания

Убедитесь, что:

  • Selenium обновлен до текущих уровней Версия 3.141.59 .
  • ChromeDriver обновлен до текущей ChromeDriver v79.0.3945 .36 уровень.
  • Chrome обновлен до текущего Chrome Версия 79.0 уровень. (согласно примечаниям к выпуску ChromeDriver v79.0 )
  • Очистка вашего Рабочего пространства проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Если ваша базовая Веб-клиент версия устарела, то удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию веб-клиента .
  • Выполните перезагрузку системы .
  • Выполните @Test как non- root user.
  • Всегда вызывать driver.quit() в tearDown(){} методе для закрытия и уничтожения WebDriver и Web Client экземпляров изящно.

Обновление

Согласно вашим комментариям, что:

options.add_experimental_option('w3c', False)

работает для вас, но согласно Замечаниям к выпуску из ChromeDriver 75.0.3770.8 :

Решенная проблема 2536: сделать стандартный режим (goog: chromeOptions.w3 c: true) по умолчанию [Pri-2]

ChromeDriver 75.0 решает эту проблему.

Таким образом, суть в том, что chromeOptions.w3c необходимо установить как true по умолчанию. Для устранения этой ошибки будет запрещено использовать w3c в chromedriver . Мы обсудили это подробно и подробно в следующих обсуждениях:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...