Mink中的XPath错误:无法对'Document'执行'evaluate':结果不是节点集,因此无法转换为所需的类型

我正在使用Mink和Selenium2驱动程序与Behat进行一些验收测试,而且大多数情况下,一切都是 好的。</ p>

但是,我正在尝试使用XPath基于data- *属性来定位元素,并且测试扼流圈。</ p>

< 我已经使用了XPathHelper和FirePath,并且我的XPath检出了这两个扩展:</ p>

// html // @ data-search-id ='images'< / code> </ p>

这似乎是针对正确的元素。</ p>

然而,当我将以下内容添加到FeatureContext.php </ p>

<前> $ el = $ this-&gt; getSession() - &gt; getPage() - &gt; find('xpath',$ this-&gt; getSession() - &gt; getSelectorsHandler() - &gt ; selectorToXpath('xpath',“// @ data-search-id ='images'”));
$ el-&gt; click();
</ code> </ pre>

< p>我从Behat收到以下错误:</ p>

 无效的选择器:无法找到带有xpath表达式的元素
// html // @ data-search-id = 'images',因为以下错误:

Type 错误:无法对'Document'执行'evaluate':
结果不是节点集,因此无法转换为所需的类型。
</ code> </ pre>
</ div>

展开原文

原文

我正在使用Mink和Selenium 2驱动程序和Behat进行一些验收测试,在大多数情况下,一切都进行得很顺利。

但是,我试图使用 XPath 将基于 data-* 属性的元素作为目标,结果测试无法使用该元素。

我在这两个扩展中使用了XPathHelper和FirePath以及XPath签出:

//html//@data-search-id='images'

这似乎是只能针对特定“正确”的元素。

但是,当我向FeatureContext.php添加以下内容时:

$el = $this->getSession()->getPage()->find('xpath', $this->getSession()->getSelectorsHandler()->selectorToXpath('xpath', "//@data-search-id='images'"));
$el->click();

我从Behat得到了以下错误:

invalid selector: Unable to locate an element with the xpath expression
//html//@data-search-id='images' because of the following error:

TypeError: Failed to execute 'evaluate' on 'Document':
The result is not a node set, and therefore cannot be converted
to the desired type.

2个回答



您的XPath表达式是一个完全有效的表达式 - 它将找到所有 @ data-search-id </ code>属性和 如果其中一个是'images',则返回true,否则返回false。</ p>

但是你想点击一个项目,显然点击一个布尔值是相当困难的。 查询满足条件的项目(因此,将比较移动到谓词中):</ p>

  // html  // * [@ data-search-id ='images'] 
</ code> </ pre>

此外,我将删除 // html </ code>。 HTML节点无论如何都必须是根节点,所以 / html </ code>一直没问题(没有理由在所有子树中搜索它)。 当你正在搜索它的任意后代时,这不是根节点(如&lt; html /&gt; </ code>那样),完全省略它并不会改变XPath表达式的含义 。</ p>

  // * [@ data-search-id ='images'] 
</ code> </ pre>

</ div>

展开原文

原文

Your XPath expression is a totally valid expression – it will find all @data-search-id attributes and return true if one of them is 'images', otherwise false.

But you want to click an item, and obviously clicking a boolean value is rather difficult. Query for the item fulfilling the condition instead (thus, move the comparison into a predicate):

//html//*[@data-search-id='images']

Additionally, I'd remove the //html. The HTML node must be the root node anyway, so /html would have been fine (no reason for searching it in all subtree). As you're searching for an arbitrary descendent of it, and this will not be the root node (as <html/> is), omitting it completely does not change the meaning of the XPath expression.

//*[@data-search-id='images']

dongmiyi8220
dongmiyi8220 正确的答案和很好的解释! 感谢您对问题和解决方案的描述。
6 年多之前 回复



我认为您正在寻找的XPath是:</ p>

  // html  // * [@ data-search-id ='images'] 
</ code> </ pre>
</ div>

展开原文

原文

I think the XPath you're looking for is:

//html//*[@data-search-id='images']

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐