Selenium не возвращает текст для невидимых элементов. Это вполне соответствует правилам библиотеки, потому что пользователь не может видеть текст скрытых элементов, а Selenium имитирует поведение пользователя. Однако в целях тестирования доступ к тексту таких элементов бывает просто необходим. Элемент может быть скрытым посредством установки CSS «visibility» свойства в «hidden», или «display» свойства в «none» для самого элемента либо его родителей. В таком случай стандартный метод
element.getText()
вернет пустую строку.
Решить эту проблему можно с помощью javascript
. Если получить текст элемента нужно единожды можно сделать это следующим способом:
public String getTextByJavascript(final WebElement element) { String script = "var element = arguments[0];" + "return element.textContent;" ; return (String) ((JavascriptExecutor)driver).executeScript(script, element); }
Если содержимое элемента нужно получать постоянно, то можно сделать его видимым с помощью javascript
, а затем получить доступ к тексту через Selenium getText()
.
Однако такой подход может противоречить условиям тестирования и изменить отображение страницы, поэтому его использование зависит от конкретного случая.
public void makeElementVisibleByJavascript(final WebElement element) { String script = "var element = arguments[0];" + "element.style.display='block';" ; ((JavascriptExecutor)driver).executeScript(script, element); }
Что касается полей ввода, текст которых возвращается методом element.getAttribute("value")
, то метод успешно возвращает текст как для видимых, так и для скрытых элементов.
Добрый день, Татьяна!
Не могли бы Вы подсказать, существует ли возможность инициализировать WebElement с помощью Javascript. Я имею в виду, искать элемент не
WebElement el = driver.findElement(By.cssSelector(«someselector»));
а как-нибудь типа
WebElement el = (JavascriptExecutor) driver.executeScript(«return document.getElementById(‘id’).getElementsByTagName(‘tag’));
и потом например иметь доступ ко всем свойствам элемента, как и в первом случае.
Спасибо.
С уважением, Юрий.
Добрый день,
все должно работать именно так как Вы и написали, инициализировать WebElement с помощью JavascriptExecutor можно:
Только в Вашем примере Вы возвращаете список элементов getElementsByTagName, для этого нужно использовать List<WebElement>:
Спасибо, Татьяна!
Спасибо! Очень помогла статья!
а что если js сломан на сайте и драйвер крашиться когда включаю js и это понятно, как тогда вытащить текст?