【问题标题】:Selenium Webdriver gettext() returns empty stringSelenium Webdriver gettext() 返回空字符串
【发布时间】:2012-07-22 23:57:24
【问题描述】:

我的页面中有以下 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)中搜索。

感谢大家的帮助。

【问题讨论】:

  • 我尝试使用 JavaScript 返回文本,但如果有任何空字符串,它会返回“未定义”。 String NodeLabel = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].firstChild.nodeValue",contentNode); System.out.println("来自 javaScript 的行标签:" + NodeLabel);
  • 如果它返回 undefined 则它找不到你的元素,可以肯定地说你的选择器是错误的。
  • @RoddyoftheFrozenPeas,你是对的。 OP 已更新。

标签: selenium webdriver


【解决方案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 也可以。

【讨论】:

    【解决方案2】:

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

    在 C# 中,我使用以下方法正确抓取文本:

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

    【讨论】:

      【解决方案3】:

      我想澄清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);
      

      希望对你有所帮助。

      您能否告诉我,当您在浏览器上打开页面时,页面上是否可以看到“MY TEXT”。如果可见,您可以使用 getText() 方法获取值。如果没有,那么试试这个 -

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

      【讨论】:

      • 抱歉,打错了。我已经更正了 OP 中的代码。在进行此调用之前,我正在等待页面完全加载,并且该元素是可见的。 RowNode 变量是父 web 元素。
      • 如果 RowNode 变量是父 WebElement,则使用我在答案中编辑的代码。如上所述定义驱动程序并告诉我会发生什么?
      • 是的,我试过了。同样的问题。我不认为同步是一个问题。请参阅更新的 OP。
      • 我检查了你的代码,很明显 labelNode.isDisplayed() 返回 false。因此 labelNode.getText() 将返回一个空字符串。
      • 它返回 Null。我想出了解决方案。 OP 已更新。感谢您的帮助。
      猜你喜欢
      • 2014-09-08
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2018-10-23
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多