Как Selenium нажимает на элементы, которые на 50% находятся на экране и на 50% нет?
Есть div-элемент. 50% его размера находится на экране. Остальные 50% превышают высоту экрана и не видны. Прокрутка невозможна.
Я попытался автоматизировать тест с помощью Selenium и щелкнуть этот div-элемент, но иногда он работает, а иногда нет.
Почему Selenium не просто нажимает на "экранную область" этого div?
И как реализован этот функционал? Когда я говорю Selenium щелкнуть по огромному элементу div, щелкает ли он случайную позицию в этом div?
2 ответа
центральная точка элемента в поле зрения
Согласно спецификации WebDriver W3C, центральная точка элемента в поле зрения является исходной позицией прямоугольника, который является пересечением между первым клиентским прямоугольником DOM элемента и начальным окном просмотра.
Учитывая заведомо видимый элемент, его можно рассчитать следующим образом:
- Пусть прямоугольник будет первым элементом последовательности DOMRect, возвращаемой вызовом getClientRects для элемента.
- Пусть left будет max(0, min(координата x, координата x + размерность)).
- Пусть right будет min(innerWidth, max(координата x, координата x + размерность)).
- Пусть top будет max(0, min(координата y, координата y + измерение высоты)).
- Пусть bottom будет min(innerHeight, max(координата y, координата y + измерение высоты)).
- Пусть x будет полом ((слева + справа) ÷ 2,0).
- Пусть y будет полом ((верх + низ) ÷ 2,0).
- Верните пару (x, y).
Элемент находится в поле зрения, если он является членом своего собственного дерева рисования, взаимодействующего с указателем, при условии, что его события указателя не отключены.
Щелчок по элементу
Согласно документации, команда " Щелчок по элементу" прокручивает элемент, если он еще не взаимодействует с указателем, и щелкает его центральную точку обзора.
Примечание. Если центральная точка элемента закрыта другим элементом, возвращается ошибка перехвата щелчка элемента. Если элемент находится за пределами области просмотра, возвращается ошибка, с которой невозможно взаимодействовать.
Решение
В таких случаях есть два возможных решения:
Вы можете заставить WebDriverWait установить ожидаемые_условия как
element_to_be_clickable()
. Таким образом, ваша строка кода будет выглядеть так:WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
Вы можете использовать
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 и другие, да, он нажимает случайную позицию. Но это не имеет значения, пока выполняется щелчок по элементу и выполняется действие, полученное в результате этого щелчка.
О программе Иногда это работает или нет, если вы проверили, включена ли кнопка или нажата, она будет работать всегда.