Подтвердить что ты не робот

Метод getText() для драйвера selenium chrome иногда возвращает пустую строку

У меня есть любопытный случай, когда метод selenium chrome driver getText() (java) возвращает пустую строку для некоторых элементов, даже если она возвращает непустую строку для других элементов с тем же xpath. Вот немного страницы.

<div __gwt_cell="cell-gwt-uid-223" style="outline-style:none;">
<div>Text_1</div>
<div>Text_2</div>
<div>Text_3</div>
<div>Text_4</div>
<div>Text_5</div>
<div>Text_6</div>
</div>

для каждого из внутренних тегов, я могу получить действительные возвращаемые значения для getTagName(), getLocation(), isEnabled() и isDisplayed(). Однако getText() возвращает пустую строку для некоторых из div.

Кроме того, я замечаю, что если я использую драйвер mac chrome, он всегда является "Text_5", для которого getText() возвращает пустую строку. Если я использую драйвер chrome для Windows, это, как правило, "Text_2", для которого getText() возвращает пустую строку. Если я использую драйвер firefox, getText() возвращает ожидаемый текст из всех div.

У кого-нибудь еще было это затруднение?

В моем коде я использую что-то вроде этого...

ArrayList<WebElement> list = (ArrayList<WebElement>) driver.findElements(By.xpath("my xPath here"));
for (WebElement e: list) System.out.println(e.getText());

Как показано ниже, вот фактический xpath, который я использую. Фрагмент страницы выше относится к двум последним разделам.

//*[@class='gwt-DialogBox']//tr[contains(@class,'data-grid-table-row')]//td[contains(@class,'lms-assignment-selection-wizard-cell')]/div/div
4b9b3361

Ответ 1

Обновление: Атрибут textContent является лучшим вариантом и поддерживается в большинстве браузеров. Различия подробно объясняются в этом сообщении в блоге: innerText vs. textContent

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

element.getAttribute("innerText")

Метод isDisplayed() может иногда срабатывать, когда элемент не скрыт, но за пределами области просмотра; getText() возвращает пустую строку для такого элемента.

Вы также можете перенести элемент в область просмотра, прокручивая его, используя javascript, следующим образом:

((JavaScriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);

а затем getText() должно вернуть правильное значение.

Подробные сведения о методе isDisplayed() можно найти в этом вопросе SO:

Как работает метод Sedenium WebDriver isDisplayed()

Ответ 2

Это не решение, поэтому я не знаю, принадлежит ли оно в ответе, но он слишком длинный для комментария и включает ссылки, поэтому я отвечу ему.

У меня тоже была эта проблема. После некоторого копания кажется, что проблема возникает при попытке получить текст элемента, который не отображается на экране. (Как комментарии @Faiz выше.) Это может произойти, если элемент не прокручивается, или если вы прокрутите вниз, и элемент находится около верхней части документа и больше не отображается после прокрутки. Я вижу, что у вас есть вызов FindElements(), который получает список элементов. По крайней мере некоторые из них, вероятно, не видны; вы можете проверить это, попробовав boolean b = webElement.isDisplayed(); для каждого элемента в списке и проверив результат. (См. здесь для очень долгого обсуждения этой проблемы, что в течение года и до сих пор нет разрешения.)

По-видимому, это преднамеренное дизайнерское решение (см. здесь); gettext на невидимых элементах должен возвращать пустой. Почему они так тверды в этом, я не знаю. Были предложены различные обходные пути, включая щелчок по элементу перед тем, как получить его текст или прокрутить его. (См. Выше ссылку, например, код для последнего.) Я не могу ручаться за них, потому что я их не пробовал, но они просто пытаются привести элемент в видимость, чтобы текст был доступен. Не уверен, насколько это практично для вашего приложения; это было не для меня. По какой-то причине FirefoxDriver не имеет этой проблемы, так что я использую.

Извините, я не могу дать вам лучший ответ - возможно, если вы представите отчет об ошибке на странице , увидим, что многие люди считают, что это ошибка, а не функция, и они изменят функциональность.

Удачи! BSG

ИЗМЕНИТЬ

См. этот вопрос для возможного обходного пути. Вы не сможете использовать его точно так, как указано, если isDisplayed возвращает true, но если вы знаете, какой элемент вызывает эту проблему, или если текст обычно не пуст, и вы можете установить условие "если строка пуста" для catch когда это произойдет, вы все равно можете попробовать. К сожалению, это не работает для всех.

НОВОЕ ОБНОВЛЕНИЕ Я просто попробовал ответить ниже, и это сработало для меня. Так спасибо, Файз!

Ответ 3

WebElement.getAttribute( "значение" ) поможет вам!

Ответ 4

если вы не заботитесь о isDisplayed или прокрутке позиции, вы также можете написать

String text = ((JavaScriptExecutor)driver).executeScript("return $(arguments[0]).text();", element);

или без jquery

String text = ((JavaScriptExecutor)driver).executeScript("return arguments[0].innerText;", element);

Ответ 5

for (int count=0;count<=sizeofdd;count++)
{       
   String GetInnerHTML=getddvalue.get(count).getAttribute("innerHTML");
}

где, 1. getddvalue - это WebElement 2. sizeofdd - размер getddvalue

Ответ 6

Связано с getText() У меня также проблема, и я решил так:

WebElement errMsg;
errMsg = driver.findElement(By.xpath("//div[@id='mbr-login-error']"));
WebElement parent = driver.findElement(By.xpath("//form[@id='mbr-login-form']"));
List<WebElement> children = parent.findElements(By.tagName("div")); 
System.out.println("Size is: "+children.size());
//((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", children);
for(int i = 0;i<children.size();i++)
{
    System.out.println(i + " " + children.get(i).getText());
}
int indexErr = children.indexOf(errMsg);
System.out.println("index " + indexErr);
Assert.assertEquals(expected, children.get(indexErr).getText());

Ни один из вышеперечисленных решений не работал у меня.