xpath表达式的结果是:[对象文本]。应该是一个要素

时间:2019-12-06 21:48:22

标签: php html css xpath

我想检查错误的“访问我的帐户”末尾的文本

<p class="breadcrumb">
    <a href="http://www.testsite/comm/index-eng.html" title="Titleblock">Home</a>&nbsp;&gt;&nbsp;<a href="https://testsite.com" title="Title1">Text1</a>&nbsp;&gt;&nbsp;<a href="index-eng.cfm?af=ZnVzZWFjdGlvbj1yZWdpc3Rlci5pbnRybyZpZD0x" title="Test Purpose">Test text</a>&nbsp;&gt;&nbsp;Access my Account
</p>

错误:

  

WebDriver \ Exception \ InvalidSelector:无效选择器:xpath表达式“ // html // p [@ class ='breadcrumb'] / text()[last()]”的结果是:[对象文本]。应该是一个元素。

1 个答案:

答案 0 :(得分:0)

实际上“文字”是正确的。 Xpath方法text()获取文本节点。

您的Xpath表达式逐步:

  • 任何p元素的后代中的任何html元素
    //html//p
  • ...通过p属性过滤class元素
    //html//p[@class='breadcrumb']
  • ...获取文本子节点
    //html//p[@class='breadcrumb']/text()
  • ...最后一个节点的过滤器
    //html//p[@class='breadcrumb']/text()[last()]

现在从错误消息中看,您好像正在使用Behat。 afaik Behat在网络驱动程序(浏览器或渲染器)中执行表达式。在浏览器DOM中,文本节点是类Text的实例。

这是PHP DOM中的一个小演示:

$document = new DOMDocument();
$document->loadHTML($html);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate("//html//p[@class='breadcrumb']/text()[last()]") as $node) {
    var_dump(get_class($node), $node->textContent);
}

输出:

string(7) "DOMText"
string(23) " > Access my Account
" 

如您所见,它与文本节点匹配。