我有一个奇怪的情况,即selenium chrome驱动程序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驱动程序,它始终是'{1}}返回空字符串的'Text_5'。如果我使用Windows Chrome驱动程序,那么它始终是“Text_2”,getText()
返回一个空字符串。如果我使用firefox驱动程序,getText()
将返回所有div的预期文本。
还有其他人遇到过这种困难吗?
在我的代码中,我使用类似的东西......
getText()
如下所示,这是我正在使用的实际ArrayList<WebElement> list = (ArrayList<WebElement>) driver.findElements(By.xpath(“my xPath here”));
for (WebElement e: list) System.out.println(e.getText());
。上面的页面代码段处理最后两个div。
xPath
答案 0 :(得分:71)
更新:textContent
属性是更好的选择,并且在大多数浏览器中都受支持。这篇博客文章详细解释了这些差异:innerText vs. textContent
作为替代方案,innerText
属性将返回DOM中存在的元素的文本内容。
element.getAttribute("innerText")
isDisplayed()
方法有时会在元素未被隐藏但在视口之外时跳过; getText()
为这样的元素返回一个空字符串。
您还可以使用javascript滚动到视口,将元素带入视口,如下所示:
((JavaScriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
然后getText()
应返回正确的值。
有关isDisplayed()
方法的详细信息,请参阅此SO问题:
答案 1 :(得分:4)
WebElement.getAttribute(“value”)可以帮助你!!
答案 2 :(得分:3)
这不是一个解决方案,所以我不知道它是否属于答案,但是评论太长了并且包含链接,所以我给它一个答案。
我也遇到过这个问题。在进行一些挖掘之后,似乎在尝试获取在屏幕上看不到的元素的文本时会出现问题。(如上面的@Faiz评论。)如果元素没有滚动到,或者如果你向下滚动,元素靠近文档的顶部,滚动后不再可见。我看到你有一个FindElements()调用,它获取了一个元素列表。至少有些可能不可见;您可以通过对列表中的每个元素尝试boolean b = webElement.isDisplayed();
并检查结果来检查这一点。 (请参阅here,对这个问题进行了长时间的讨论,这个问题已有一年之久,仍未解决。)
显然,这是一个刻意的设计决定(见here);不可见元素的gettext应该返回空。为什么他们对此如此坚定,我不知道。已经提出了各种解决方法,包括在获取文本或滚动到文本之前单击元素。 (参见上面的链接,例如后者的代码。)我不能保证这些,因为我没有尝试过,但他们只是试图将元素置于可见性中,以便文本可用。不确定您的应用程序有多实用;这不适合我的。出于某种原因,FirefoxDriver没有这个问题,所以这就是我使用的。
对不起,我无法给你一个更好的答案 - 也许如果你在issues page提交错误报告,他们会发现许多人发现它是一个错误而不是一个功能,他们将改变功能。
祝你好运! BSG修改强>
有关可能的解决方法,请参阅this question。如果isDisplayed返回true,您将无法完全按照给定的方式使用它,但是如果您知道哪个元素导致了问题,或者文本通常不是空白而您可以设置'if string is empty'条件来捕获当它发生时,你仍然可以尝试它。不幸的是,它并不适合所有人。
NEW UPDATE 我刚刚尝试了下面给出的答案,它对我有用。谢谢,Faiz!
答案 3 :(得分:1)
如果你不关心isDisplayed或滚动位置,你也可以写
String text = ((JavaScriptExecutor)driver).executeScript("return $(arguments[0]).text();", element);
或没有jquery
String text = ((JavaScriptExecutor)driver).executeScript("return arguments[0].innerText;", element);
答案 4 :(得分:1)
for (int count=0;count<=sizeofdd;count++)
{
String GetInnerHTML=getddvalue.get(count).getAttribute("innerHTML");
}
其中, 1. getddvalue是WebElement 2. sizeofdd是getddvalue的大小
答案 5 :(得分:1)
element.getAttribute("innerText")
为我工作,getText()
返回空时。
答案 6 :(得分:1)
我最近遇到了类似的问题。
我必须检查滚动框中是否存在菜单选项卡“ LIFE EVENTS”。问题在于菜单选项卡很多,您需要向下滚动才能看到其余的菜单选项卡。因此,我最初的解决方案在可见的菜单选项卡上工作正常,但在看不见的菜单选项卡上却没有。
我使用下面的xpath将硒指向整个滚动框的父元素。
@FindBy(xpath = "//div[contains(@class, 'menu-tree')]")
protected WebElement menuTree;
然后,我创建了一个可以递增的WebElement列表。 如果菜单选项卡可见,则该解决方案有效,并返回true。但是如果菜单选项卡不可见,则返回false
public boolean menuTabPresent(String theMenuTab) {
List<WebElement> menuTabs = new ArrayList<WebElement>();
menuTabs = menuTree.findElements(By.xpath("//i/following-sibling::span"));
for(WebElement e: menuTabs) {
System.out.println(e.getText());
if(e.getText().contains(theMenuTab)) {
return true;
}
}
return false;
}
我找到了解决该问题的 2 个解决方案,两者均能很好地发挥作用。
for(WebElement e: menuTabs) {
scrollElementIntoView(e); //Solution 1
System.out.println(e.getAttribute("textContent")); //Solution 2
if(e.getAttribute("textContent").contains(theMenuTab)) {
return true;
}
}
return false;
解决方案1调用以下方法。硒运行时,滚动框会实际向下移动。
protected void scrollElementIntoView(WebElement element) {
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true)", element);
}
解决方案2获取您指向的属性的文本内容(即使对于当前不可见的菜单选项卡而言)。因此,正确完成了.getText()在这种情况下无法完成的工作。
答案 7 :(得分:0)
我的是python,但核心逻辑类似:
webElement.text
webElement.get_attribute("innerText")
webElement.get_attribute("textContent")
完整代码:
def getText(curElement):
"""
Get Selenium element text
Args:
curElement (WebElement): selenium web element
Returns:
str
Raises:
"""
# # for debug
# elementHtml = curElement.get_attribute("innerHTML")
# print("elementHtml=%s" % elementHtml)
elementText = curElement.text # sometime NOT work
if not elementText:
elementText = curElement.get_attribute("innerText")
if not elementText:
elementText = curElement.get_attribute("textContent")
# print("elementText=%s" % elementText)
return elementText
称之为:
curTitle = getText(h2AElement)
希望对你有用。