Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Функция is_displayed в WebElement возвращает False при видимом элементе

python
webdriver
Теги: #<Tag:0x00007f7b6853f080> #<Tag:0x00007f7b6853eec8>

#1

Всем привет. Столкнулся с такой проблемой - is_displayed() возвращает False для элемента, который виден на странице. Визуально виден и в javaScript проверял:
window.getComputedStyle(document.getElementsByClassName(“foo”)).opacity; Результат = 1
window.getComputedStyle(document.getElementsByClassName(“foo”)).visibility; Результат = visible
window.getComputedStyle(document.getElementsByClassName(“foo”)).disaplay; Результат = inline-block


(Sergey Korol) #2

Т.е. вы исключаете вероятность того, что во время вызова isDisplayed элемент банально мог еще не подгрузиться / отрендериться?

WebDriverWait + ExpectedConditions.visibilityOfElementLocated вам в помощь.


#3

Можно сказать исключаю, поскольку перед этим я именно так и проверяю:

WebDriverWait(get_driver(), timeout).until( EC.visibility_of_element_located((By.XPATH, path)) )
На этом месте происходит TimeoutException


(Sergey Korol) #4

Ну если WDWait бросает таймаут, это может быть не только из-за невидимости, а еще и если элемент отсутствует в DOM. Можете ради интереса проверить на presenceOfElementLocated?

Помимо этого, вы уверены, что он у вас не динамический? Пробовали отслеживать через Firebug его состояние в DOM до и после взаимодействия?

Еще один из возможных вариантов - если есть какая-то JS библиотека, которая полностью разрушает / воссоздает DOM в динамике.


#5
  1. presence_of_element_located - True
  2. Изначально этот элемент виден. После совершения действий со стороны пользователя, к нему добавляются новые классы и css-стили. В этом и проблема, не знаю, что смотреть по изменениям.

#6

Разобрался. Проблема как всегда банальная - разработчики обернули шаблон одного элемента в div с атрибутом hidden, однако этот же самый шаблон используется в другом месте, как раз в элементе, на котором вызывается is_displayed()