selenium chrome驱动程序的getText()方法有时会返回一个空字符串

时间:2014-01-02 17:43:55

标签: java selenium selenium-chromedriver

我有一个奇怪的情况,即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

8 个答案:

答案 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问题:

How does Selenium WebDriver's isDisplayed() method work

答案 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)

希望对你有用。