xpath "text()"属性不适用于文本节点,根据下面提到的代码通过Selenium进行



代码:

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

"parent"one_answers"child"在同一个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')]

以上所有查询在在线编辑器中都能正常工作,但当我在javaide中运行它时,它显示"页面上没有元素"!

任何建议都会很有帮助!

虽然文本为parentchild的元素都在同一个<p>标记中,class属性为className,但文本为parent的元素是一个被继承的<span>节点,其中文本为child的元素是一个被继承的文本节点。因此,尽管使用XPath v1.0的Selenium可以定位文本为parent的元素,但无法定位文本为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);

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

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

Galen框架使用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. 

对我来说

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

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

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

以获取段落中的文本。

最新更新