Всем привет. Столкнулся с такой проблемой - 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 в динамике.
- presence_of_element_located - True
- Изначально этот элемент виден. После совершения действий со стороны пользователя, к нему добавляются новые классы и css-стили. В этом и проблема, не знаю, что смотреть по изменениям.
Разобрался. Проблема как всегда банальная - разработчики обернули шаблон одного элемента в div с атрибутом hidden, однако этот же самый шаблон используется в другом месте, как раз в элементе, на котором вызывается is_displayed()