Задать вопрос
@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. Они не показывают координаты относительно экрана.
  • Вопрос задан
  • 220 просмотров
Подписаться 1 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 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
nothing interesting here
скорее всего нет, по крайней мере в спецификации на WebDriver есть только Get Element Rect среди способов получения информации об элементе и никакого способа вызова функции на элементе или получения объекта по его handle внутри JS
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽