我想用canoo webtest验证一个xpath。
我的HTML看起来像这样:
<div id="myDivId">Firstname Lastname</div>
firstname和lastname之间的空格是使用“
”创建的。
我尝试了类似下面的内容,但是当我使用FirePath或Firebug控制台测试它时总是失败。
//div[@id='myDivId' and contains(.,'Firstname Lastname')]
//div[@id='myDivId' and contains(.,'Firstname Lastname')]
//div[@id='myDivId'][contains(text(),'Firstname Lastname')]
//div[@id='myDivId'][matches(text(),'Firstname.Lastname')]
有时我真的不知道版本之间的区别。在stackoverflow上找到1000个解决方案之后,它或多或少是一次尝试和错误。但它永远不适合我:/
我还尝试了解.
和text()
的区别以及包含和匹配的工作原理。但只要我的所有测试用例都失败,我就无法弄明白。
我错了什么?
答案 0 :(得分:1)
似乎问题是,nbsp实体未定义<!ENTITY nbsp " ">
你也可以尝试(应该工作):
"//div[@id='myDivId' and contains(text(),'Firstname Lastname')])"
或
"//div[@id='myDivId' and text() ='Firstname 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')]