Как Selenium нажимает на элементы, которые на 50% находятся на экране и на 50% нет?

Есть div-элемент. 50% его размера находится на экране. Остальные 50% превышают высоту экрана и не видны. Прокрутка невозможна.

Я попытался автоматизировать тест с помощью Selenium и щелкнуть этот div-элемент, но иногда он работает, а иногда нет.

Почему Selenium не просто нажимает на "экранную область" этого div?

И как реализован этот функционал? Когда я говорю Selenium щелкнуть по огромному элементу div, щелкает ли он случайную позицию в этом div?

2 ответа

Решение

центральная точка элемента в поле зрения

Согласно спецификации WebDriver W3C, центральная точка элемента в поле зрения является исходной позицией прямоугольника, который является пересечением между первым клиентским прямоугольником DOM элемента и начальным окном просмотра.

Учитывая заведомо видимый элемент, его можно рассчитать следующим образом:

  1. Пусть прямоугольник будет первым элементом последовательности DOMRect, возвращаемой вызовом getClientRects для элемента.
  2. Пусть left будет max(0, min(координата x, координата x + размерность)).
  3. Пусть right будет min(innerWidth, max(координата x, координата x + размерность)).
  4. Пусть top будет max(0, min(координата y, координата y + измерение высоты)).
  5. Пусть bottom будет min(innerHeight, max(координата y, координата y + измерение высоты)).
  6. Пусть x будет полом ((слева + справа) ÷ 2,0).
  7. Пусть y будет полом ((верх + низ) ÷ 2,0).
  8. Верните пару (x, y).

Элемент находится в поле зрения, если он является членом своего собственного дерева рисования, взаимодействующего с указателем, при условии, что его события указателя не отключены.


Щелчок по элементу

element_click

Согласно документации, команда " Щелчок по элементу" прокручивает элемент, если он еще не взаимодействует с указателем, и щелкает его центральную точку обзора.

Примечание. Если центральная точка элемента закрыта другим элементом, возвращается ошибка перехвата щелчка элемента. Если элемент находится за пределами области просмотра, возвращается ошибка, с которой невозможно взаимодействовать.


Решение

В таких случаях есть два возможных решения:

  1. Вы можете заставить WebDriverWait установить ожидаемые_условия как element_to_be_clickable(). Таким образом, ваша строка кода будет выглядеть так:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  2. Вы можете использовать move_to_element(to_element) а также click(on_element=None) метод соответственно. Таким образом, ваша строка кода будет выглядеть так:

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

Ссылка

Вы можете найти соответствующее обсуждение в selenium.common.exceptions.ElementClickInterceptedException: Сообщение: щелчок по элементу перехвачен: элемент нельзя щелкнуть с помощью Selenium и Python

Если вы нажимаете на локаторы, такие как xpath,id и другие, да, он нажимает случайную позицию. Но это не имеет значения, пока выполняется щелчок по элементу и выполняется действие, полученное в результате этого щелчка.

О программе Иногда это работает или нет, если вы проверили, включена ли кнопка или нажата, она будет работать всегда.

Другие вопросы по тегам