2015-02-05 104 views
0

这样的结构被赋予XPath查询搜索

<div class="user-number">123</div> 
<div class="user-state"> 
<span class="u-state-icon icon icon-1"></span> 
<span> User1</span> 
</div> 

我已经试过这样的(不正确)的XPath定位由user-numberUser1不明白问题出在哪里..

xpath=//*[@class='user-number' and text() = '123']/following-sibling::*[contains(@class,'user-state')]/descendant::*[contains(@text,'User1')] 

是什么调试它的最好方法是什么? 例如,如果

xpath=//*[@class='user-number' and text() = '123']/following-sibling::*[contains(@class,'user-state')] 

位于一些元素 - 如何打印出其text属性 - 检查哪些元素实际上位于?

+0

看起来像我找到答案// * [@ class ='user-number'and text()='123']/following-sibling :: * [contains(@ class,'user-state')]/span [text()='User1']但是最好的调试的方式仍然是个问题)) – Jadwiga 2015-02-05 13:59:15

回答

0

你的XPath表达式,当然,不正确的 - @texttext()(或只是.)来代替:

//*[@class='user-number' and . = '123']/following-sibling::*[contains(@class,'user-state')]/descendant::*[contains(.,'User1')] 

调试XPath表达式通常是使用浏览器的开发者工具来完成:在萤火虫,或内浏览器控制台。例如,在谷歌的铬控制台,您可以执行以下命令:

$x("//*[@class='user-number' and . = '123']/following-sibling::*[contains(@class,'user-state')") 

,看看是否有匹配。

或者,您也可以在代码中进行调试。例如(使用python),找到第一个div元素,并打印出它的文字:

element = driver.find_element_by_xpath("//*[@class='user-number' and . = '123']") 
print(element.text) 
0

荟萃的问题是,如何调试XPath表达式?

那么,对于像这样简单的人来说,最好只是盯着他们,直到你看到问题。检查名称的拼写,检查名称空间,检查空白问题。至少比调试正则表达式更简单。

对于更复杂的XPath,请尝试分解它们。删除一个谓词,看看是否有所作为。或者反过来,通过添加条件来建立路径表达式,在每个阶段检查它仍然找到的东西。

如果您真的非常重视XPath,请考虑架构感知处理:这将使您的XPath表达式与模式匹配,以确保它有意义。

考虑使用可视化XPath处理器进行调试。周围有数字。我在oXygen中使用XPath处理器(尽管不是真的用于调试XPath,更多用于发现文档的内容,但这些任务通常需要一起完成。)