Selenium Webdriver gettext()返回空字符串

时间:2012-07-24 15:55:41

标签: selenium webdriver

我的页面中有以下HTML。

<div dojoattachpoint="rowNode" class="dijitTreeRow dijitTreeRowSelected" wairole="presentation" dojoattachevent="onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick" role="presentation" title="" style="padding-left: 19px; ">
    <img src="/runtime/explorer.sharedresources/javascript-1.7.22.268034/release/dojo/resources/blank.gif" alt="" dojoattachpoint="expandoNode" class="dijitTreeExpando dijitTreeExpandoLeaf" wairole="presentation" role="presentation"/>
    <span dojoattachpoint="expandoNodeText" class="dijitExpandoText" wairole="presentation" role="presentation">*</span>
    <span dojoattachpoint="contentNode" class="dijitTreeContent" wairole="presentation" role="presentation">
    <img src="/runtime/explorer.sharedresources/javascript-1.7.22.268034/release/dojo/resources/blank.gif" alt="" dojoattachpoint="iconNode" class="dijitIcon dijitTreeIcon criterionFolder" wairole="presentation" role="presentation"/>
    <span dojoattachpoint="labelNode" class="dijitTreeLabel" wairole="treeitem" tabindex="-1" waistate="selected-false" dojoattachevent="onfocus:_onLabelFocus" role="treeitem" aria-selected="true">**My TEXT**</span>
    </span>
</div>

这是正确识别元​​素的代码。

 List<WebElement> RowNodesList = elementPopup.findElements(By.xpath("//div[@dojoattachpoint =\"rowNode\"]"));       
    for(WebElement RowNode:RowNodesList)
        {
            System.out.println("Left Padding: " + RowNode.getAttribute("style"));                   

            System.out.println("Is Row Node Displayed: " + RowNode.isDisplayed());

            WebElement labelNode = RowNode.findElement(By.xpath("//span[@dojoattachpoint=\"labelNode\"]"));

            boolean IsNodeDisplayed = labelNode.isDisplayed();

            System.out.println("Is Label Node Displayed: " + IsNodeDisplayed);

            String NodeLabel = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].firstChild.nodeValue",labelNode);
            System.out.println("Row label From javaScript: " + NodeLabel);
            System.out.println("Row label: " + labelNode.getText());
            System.out.println("Row Class: " + labelNode.getAttribute("class"));

        }

这是从代码生成的输出。

Left Padding: PADDING-LEFT: 19px
Is Row Node Displayed: true
Is Label Node Displayed: false
Row label From javaScript: undefined
Row label: 
Row Class: dijitTreeLabel

由于某种原因,.getText()返回一个空字符串。有任何想法吗? 提前谢谢。

编辑: 奇怪的是,labelNode.isdisplayed()返回false,即使它在页面上可见。

编辑2:我已经将我的OP编辑到上面,以使问题更加清晰。因此,我想要的文本位于标签节点的SPAN标记中,该标记节点是RowNode的子节点。据说会显示RowNode,但标签节点不会显示。我认为这就是为什么LabelNode的.getText()返回一个空字符串。

我还能通过其他方式获取文字吗?

编辑3:我发现了问题。这是xpath搜索字符串。 而不是

WebElement labelNode = RowNode.findElement(By.xpath("//span[@dojoattachpoint=\"labelNode\"]"));

需要将xpath更改为

WebElement labelNode = RowNode.findElement(By.xpath(".//span[@dojoattachpoint=\"labelNode\"]"));

我曾假设“//”将指示WebDriver在当前上下文中查看。但显然,它在整个身体内搜索(这不直观),并返回被发现的第一个被隐藏的元素。  添加“.//”指示它在当前上下文(RowNode)中搜索。

感谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

好的,我能让这个工作的唯一方法是使用它:

var textstring = driver.findElement(global[type](elements)).getAttribute('innerHTML').then(
   function(textstring) {
      console.log(textstring);
})

其中globaltype可以是webdriver.By.id(),xpath或name。

webdriver.By.css也有效。

答案 1 :(得分:-1)

在System.out.println语句中,您使用的是“contentNode”而不是“labelNode”。这是一个错误,还是在代码中的其他地方声明了?

在C#中,我使用以下内容来正确获取文本:

IWebElement labelNode = driver.FindElement(By.XPath("//span[@dojoattachpoint=\"labelNode\"]"));
string labelNodeText = labelNode.Text;

答案 2 :(得分:-1)

我想澄清RowNode变量是否属于WebDriver类型,还必须在正确的WebElement上调用get text。

尝试使用以下代码 -

  WebElement labelNode = driver.findElement(By.xpath("//span[@dojoattachpoint='labelNode']"));
  System.out.println("Row label: " + labelNode.getText());
  System.out.println("Row label: " + labelNode.getAttribute("class"));

如果在此更改后为getText()方法返回空字符串。它或者意味着此WebElement的文本不可见。您还可以使用implicitWait语句确保在尝试访问WebElement之前正确加载页面。

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

希望这会对你有所帮助。

当您在浏览器上打开页面时,是否可以告诉我页面上是否显示“我的文字”。如果可见,您可以使用getText()方法获取值。如果没有,那就试试吧 -

 String labelNodeText = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].innerHTML",labelNode);