1

我想用 canoo webtest 验证 xpath。

我的 HTML 如下所示:

<div id="myDivId">Firstname Lastname</div>

名字和姓氏之间的空格是用“ &nbsp;”创建的。

我尝试了以下类似的方法,但是当我使用 FirePath 或 Firebug 控制台对其进行测试时,它总是失败。

//div[@id='myDivId' and contains(.,'Firstname Lastname')]
//div[@id='myDivId' and contains(.,'Firstname&nbsp;Lastname')]
//div[@id='myDivId'][contains(text(),'Firstname Lastname')]
//div[@id='myDivId'][matches(text(),'Firstname.Lastname')]

有时我真的不知道版本之间的区别。在我在 stackoverflow 上找到 1000 个解决方案后,这或多或少是一次尝试和错误。但它对我从来没有用过:/我也试图理解包含和匹配的区别以及如何工作.text()但只要我所有的测试用例都失败,我就无法真正弄清楚。

我做错了什么?

4

2 回答 2

1

另一种可能的方法是拆分单词,所以使用这个 xpath-

//div[@id='myDivId' and contains(text(), 'Firstname') and contains(text(), 'Lastname')]
于 2013-05-11T20:00:36.780 回答
1

似乎问题是,未定义 nbsp 实体<!ENTITY nbsp "&#160;">
您也可以尝试(应该工作):

"//div[@id='myDivId' and contains(text(),'Firstname&#160;Lastname')])"

或者

"//div[@id='myDivId' and  text() ='Firstname&#160;Lastname'])"

text()仅返回当前元素的文本。
.(在字符串上下文中)返回当前元素的任何子元素的测试。

在您的示例中没有什么不同,因为 div 除了文本之外没有任何子项。

更新:这似乎是FireFox 扩展 FirePath 的特刊。即使使用 Firebug,document.evalute 也会:

var xpath = "//div[@id='myDivId' and text() ='Firstname\xa0Lastname']";
divs = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); 
d1=divs.iterateNext();

但考虑将 nbsp 的 javascript 编码为\0xa0.

于 2013-05-10T08:44:46.837 回答