标签之间的文本的XPath

时间:2013-05-10 08:17:56

标签: xml xpath contains

我想用canoo webtest验证一个xpath。

我的HTML看起来像这样:

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

firstname和lastname之间的空格是使用“&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()的区别以及包含和匹配的工作原理。但只要我的所有测试用例都失败,我就无法弄明白。

我错了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

//div[@id='myDivId' and contains(text(), 'Firstname') and contains(text(), 'Lastname')]