@igreklpofrss

Можно ли как-то применять execute_script относительно только WebElement в Selenium, а не драйвера?

Сразу уточню, что пишу на Питоне(а то речь о разных языках будет). Хочу проверять видимость элементов в "окне просмотра". Из-за скролла документа элементы пропадают из поля видимости, из-за чего нет возможности нажать на них. Хотел использовать метод getBoundingClientRect в самом JS. Он возвращает координаты элемента относительно окна. Тобишь так:
# к примеру, окно поиска сайта. Это единственный элемент с классом search
coords = webdriver.execute("return document.getElementsByClassName('search')[0].getBoundingClientRect()")

Это удобно применимо к уникальным элементам, с id или небольшим кол-ом повторяющихся имен класса, но есть элементы, которые повторяются около 60 раз. К примеру, группа раскрывающихся блоков, внутри которых находятся чекбоксы. Пример:
<div class="collapse-field">
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
</div>
<div class="collapse-field">
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
</div>
<div class="collapse-field">
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
    <div class="checkbox">тут внутри дочерние тэги и т.д.</div>
</div>

Чтобы находить нужный элемент среди элементов с однотипным названием классов, надо плясать с бубном, расписать логику поиска в дочерних элементах уникальных значений, по ним ориентироваться где, какой элемент и т.д. и т.п. Все это я уже делаю и нахожу с помощью Селениума(Питон), а если расписывать это под JS, то это тупо дублировать код из Питона, да и столько кода дублировать под JS, что с таким успехом можно на JS перейти. Поэтому, если WebElement - это и так JS(HTML) элемент, то может можно как-то непосредственно к нему применять вызов getBoundingClientRect()? Или может можно как-то так делать запуск JS:
# вот я нашел тот самый нужный чекбокс и хочу проверить видно ли его на экране
element = webdriver.find_element(By.CLASS_NAME, "checbox")
# что-то такого.. чтобы можно было применять именно к элементу
webdriver.execute(".getBoundingClientRect()", element)

Я не нашел в стандартной библиотеке возможности получить координаты элемента относительно скроллинга. Я использовал все, что нашел похожее на мой запрос в док-ии. И element.location использовал, и element.rect. Они не показывают координаты относительно экрана.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
Возможно, попробуйте так:
el = driver.find_element(By.CLASS_NAME, "checbox")  # or checkbox?
c = driver.execute_script("return arguments[0].getBoundingClientRect();", el)
print(c)  # {'bottom': 200, 'height': 50, 'left': 150, 'right': 250, 'top': 150, 'width': 100}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
IvanU7n
@IvanU7n
скорее всего нет, по крайней мере в спецификации на WebDriver есть только Get Element Rect среди способов получения информации об элементе и никакого способа вызова функции на элементе или получения объекта по его handle внутри JS
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы