2014-01-02 5 views
28

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

<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 
+1

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

+1

Является ли элемент видимым на экране или вне поля зрения? 'getText()' возвращает пустую строку, если элемент находится вне области просмотра. – Faiz

ответ

57

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

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

element.getAttribute("innerText") 

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

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

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

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

Подробная информация о методе isDisplayed() можно найти в этом СЦ вопрос:

How does Selenium WebDriver's isDisplayed() method work

+0

Ницца. Тройка getAttribute ("innerText") сработала.Очень интересно, что для данного элемента (например, «

Text_2
») isDisplayed() возвращает true, getText() возвращает пустую строку, но getAttribute («innerText») возвращает «Text_2». Кажется, это работает очень хорошо. В этом случае прокрутка элемента в представление действительно не сыграла свою роль, но это, безусловно, сработало для меня в других случаях. Огромное спасибо. – JackhammersForWeeks

+0

Рад, что это сработало для вас. [Примите ответ, который наилучшим образом отвечает на вашу проблему.] (Http://meta.stackoverflow.com/help/someone-answers). – Faiz

+0

Ницца, getAttribute («innerText») будет работать отлично. + point –

3

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

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

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

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

Удачи вам! BSG

EDIT

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

NEW UPDATE Я просто попытался ответить ниже, и это сработало для меня. Так что спасибо, Файз!

+0

Странно, что isDisplayed() возвращает true для этого элемента, но getText() возвращает пустую строку. Также странно, что результаты драйвера chrome на Mac последовательно неверны по-другому, чем драйвер chrome на окнах. Спасибо за комментарий, хотя, цените, что вы нашли время. – JackhammersForWeeks

+0

Это очень интересно. Я на самом деле просто наткнулся на это снова на драйвере phantomjs. – bsg

1

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

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

или без jQuery

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

Это лучший ответ на странице, работающий каждый раз (javascript)! – JohnP2

3

WebElement.getAttribute («значение») должен помочь вам!

+1

это решение работало для меня, используя firefox, когда getText() возвращал пустую строку – andyd

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

где 1. getddvalue является в WebElement 2. sizeofdd является размер getddvalue

0

Относящиеся к 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()); 

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

Смежные вопросы