按照下面提到的通过Selenium的代码,xpath的“ text()”属性不适用于textnode

时间:2018-12-11 12:47:14

标签: javascript java selenium selenium-webdriver webdriver

代码:

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

任何建议都会有所帮助!

3 个答案:

答案 0 :(得分:1)

xpath text()中的.../p[2]/text()需要返回一个TextNode。但是硒只能返回元素节点。

例如://*[@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支持。

因此,在您的情况下,您需要制作硒以找到并返回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. 

答案 1 :(得分:1)

尽管文本为父级子级的两个元素都在相同的<p>标签中,且 class 属性为 className ,文本为 parent 的元素是后代<span>节点,而文本为 child 的元素是后代文本节点 。因此,尽管使用XPath v1.0 Selenium 可以找到文本为 parent 的元素,但无法找到 text节点文字为。粗略可以提取文本 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);

答案 2 :(得分:0)

对我来说

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

可与Selenium 3一起使用。但是,正如前面提到的,Selenium仅可与元素一起使用。这样您就可以使用

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

以获取段落内的文本。