【问题标题】:"text()" property of xpath is not working for a textnode as per the below mentioned code through Selenium根据下面提到的代码,xpath 的“text()”属性不适用于通过 Selenium 的文本节点
【发布时间】:2019-05-12 11:12:42
【问题描述】:

代码:

<div class="content">
  <div id="tab">
    <div class="row">
      <div class="col-sm-12">
        <div>
          <div>
            <div>
            </div>
            <div>
              <p><span>01</span></p>
              <p class="className"><span id="">parent</span>
                Child 
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

“父”和“子”在同一个 p 标签中。我可以很容易地找到“父母”:

//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/span

但无法单独定位“孩子”。

我尝试了下面提到的所有可能性,但没有用,

//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/text()
//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/text()[contains(.,'child')]

以上所有查询在在线编辑器中都可以正常工作,但是当我在 java ide 中运行它时,它显示“页面上没有元素”!

任何建议都会有所帮助!

【问题讨论】:

  • 你能提供一个完整的java代码示例吗?我想你应该调用一些toolsqa.com/selenium-webdriver/wait-commands 命令。
  • 好的,你能用 CSS 选择器试试这个吗,因为它们更干净并且避免了 XPath
  • 没错,CSS选择器要容易得多,但我想在这种情况下,我们只能通过xpath来定位这个元素!因为它是与其他子标签结合的原始文本,在p标签内
  • @DebanjanB 不用于提取文本,将其精确的 DOM 位置提供给 selenium,以便它通过定位器直接导航到该位置(在本例中:xpath)!

标签: javascript java selenium selenium-webdriver webdriver


【解决方案1】:

xpath .../p[2]/text() 中的 text() 需要返回一个 TextNode。但是 selenium 只能返回 Element Node。

例如://*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p[2]/span 期望返回一个标签名称为span 的元素节点。

Galen 框架使用 Selenium 来打开 Web 浏览器并选择页面上的测试元素。

浏览器支持//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p[2]/text(),可以在浏览器的开发者工具中成功。但它也不等同于 Selenium 支持。

因此,在您的情况下,您需要使用 selenium 来查找并返回 p 元素节点:

<p class="className"><span id="">parent</span>
    child
</p>

使用 HTML DOM API 的 Java 示例:

((JavaScriptExecutor) driver).executeScript(
      "return arguments[0].childNodes[2].nodeValue;",
      driver.findElement(By.xpath(
          "//*[@id='tab']/div/div/div[1]/div[1]/div[2]/p[2]"
      ))
)
// arguments[0] is the p ElementNode
// childNodes[2] is the 3rd child node of the p, it's the TextNode 'child'
// As I mentioned, Selenium's findElement(s) not support to return TextNode
// Even you can directly access the text node via HTML DOM api, but
// you can't return it for further using by Galen. 

【讨论】:

  • 使用 HTML DOM API 可以直接找到“已上传”,如果找到“已上传”,您能告诉我下一步该怎么做,以便我为您提供示例代码。
  • 你要检查文本节点'uploaded'的CSS值,对吗?
  • 没错! Galenframework 负责检查,我只需要给出准确的定位器。
  • 我认为 Galen 无法在“上传”的文本节点上执行此操作,因为 Selenium 无法返回 TextNode。
【解决方案2】:

对我来说

"//p[contains(text(), 'uploaded')]"

适用于 Selenium 3。但正如 yong 所说,Selenium 只能适用于元素。所以你可以使用

element.getText();
element.getAttribute("textContent");

获取段落内的文本。

【讨论】:

    【解决方案3】:

    虽然文本为 parentchild 的元素都在相同的 &lt;p&gt; 标记中,class 属性为 className,以文本为parent的元素是一个死节点&lt;span&gt;,而以文本为child的元素是一个死节点text节点。因此,尽管使用XPath v1.0Selenium 可以将带有文本的元素定位为 parent 但无法定位带有文本的 text 节点作为孩子。 Of-coarse 可以提取文本child

    因此我的反问是 ...你想对文本做什么?只需提取文本?....

    要提取文本child,您可以使用以下解决方案:

    WebElement myElement = driver.findElement(By.xpath("//div[@id="tab"]//p[@class='className']"));
    String myText = (String)((JavaScriptExecutor)driver).executeScript("return arguments[0].lastChild.textContent;", myElement);
    

    【讨论】:

    • 谢谢!但是我不想提取文本,我想通过selenium单独定位文本节点,我发现这是不可能的!
    • @DheerajN 这正是我在回答中准确提到的,如 ,但无法找到上传文本的文本节点。不是吗?
    • @DheerajN 如果我的answer满足了您的问题,请点击空心处Acceptanswer我的 answer 旁边的复选标记位于 votedown 箭头下方,因此复选标记变为 绿色
    猜你喜欢
    • 2015-11-27
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多