根据下面提到的Selenium代码,xpath的“text()”属性不适用于textnode

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据下面提到的Selenium代码,xpath的“text()”属性不适用于textnode相关的知识,希望对你有一定的参考价值。

码:

<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>

“父母”和“孩子”在同一个标​​签中。我可以轻松找到“父母”:

//*[@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中运行它时,它显示“页面上没有元素”!

任何的意见都将会有帮助!

答案

尽管具有text和parent的子元素都在同一个<p>标记中,class属性为className,但是text为parent的元素是一个decedent <span>节点,其中text作为child的元素是一个decedent text节点。因此,尽管使用XPath v1.0的Selenium可以将文本定位为父元素,但无法将文本节点与文本定位为子节点。粗糙的可以提取文本孩子。

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

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

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

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

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

Galen Framework使用Selenium打开Web浏览器并在页面上选择测试元素。

浏览器支持//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p[2]/text(),你可以在浏览器的DevTool中成功。但它也不等同于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. 
另一答案

为了我

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

与Selenium 3合作。但正如yong所提到的,Selenium只能使用元素。所以你可以使用

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

获取段落中的文本。

以上是关于根据下面提到的Selenium代码,xpath的“text()”属性不适用于textnode的主要内容,如果未能解决你的问题,请参考以下文章

selenium自动化之xpath定位*必会技能*

selenium使用Xpath定位之完整篇

selenium使用Xpath定位之完整篇

selenium中为啥依据xpath定位html页面左边树形菜单无效

selenium Python自动化 笔记 根据xpath找定位的响应属性 修改链接并打开

selenium+xpath 文本信息定位