t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9b04109360> #<Tag:0x00007f9b04109220>

Всем привет. Столкнулся с такой проблемой - 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

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

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

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

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

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

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

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

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

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