Selenium findElement выдает исключение, когда элемент присутствует на странице, но не виден в области просмотра

Следующий код прекрасно работает, когда элемент присутствует в DOM и виден в области просмотра:

WebElement button = webdriver.findElement(By.id("myButton"));

Но я не понимаю, почему это вызывает исключение, когда кнопка присутствует в DOM, но не видна в области просмотра.

Я точно знаю, что кнопка присутствует: в игре нет ajax.

Как я могу проверить наличие элемента в DOM, независимо от того, виден ли он в окне просмотра?

Я уже видел некоторые полезные ссылки здесь на stackoverflow:

https://stackoverflow.com/a/44916498/420593

Как проверить, отображается ли элемент с помощью Selenium WebDriver?

Всего 2 ответа


Вы можете использовать WebDriverWait вместе с классом действия, чтобы перейти к элементу и выполнить щелчок по нему.

WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement button = wait.until(
        ExpectedConditions.elementToBeClickable(By.id("myButton")));
Actions actions = new Actions(driver);
actions.moveToElement(button).click().build().perform();

После еще одного исследования, это мой вывод:

webdriver.executeScript("arguments[0].scrollIntoView()", button);
button.click();

Должно работать, но в моем случае, из-за некоторого фиксированного заголовка начальной загрузки, кнопка находится в представлении, но скрыта фиксированным заголовком над ней (z-index). И исключение выдается при выполнении второй строки.

То же самое произошло со следующим:

Actions actions = new Actions(driver);
actions.moveToElement(button).click().build().perform();

Итак, я наконец-то решил свою проблему, имитируя щелчок в JavaScript:

webdriver.executeScript("arguments[0].scrollIntoView()", button);

Есть идеи?

10000