给出了这样的结构
<div class="user-number">123</div>
<div class="user-state">
<span class="u-state-icon icon icon-1"></span>
<span> User1</span>
</div>
我已尝试通过User1
查找user-number
这样的(不正确的)xpath,并且不明白问题出在哪里..
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 :(得分:0)
你的xpath表达肯定不正确 - @text
应该替换为text()
(或只是.
):
//*[@class='user-number' and . = '123']/following-sibling::*[contains(@class,'user-state')]/descendant::*[contains(.,'User1')]
调试xpath表达式通常使用浏览器开发人员工具完成:在firebug中或在浏览器控制台中。例如,在google-chrome控制台中,您可以执行以下操作:
$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)
答案 1 :(得分:0)
元问题是,如何调试XPath表达式?
嗯,对于像这样的简单的人来说,最好只是盯着他们,直到你看到问题为止。检查名称的拼写,检查命名空间,检查空白问题。至少它比调试正则表达式更容易。
对于更复杂的XPath,请尝试分解它们。删除谓词,看看是否有所作为。或者反向工作,通过添加条件来构建路径表达式,在每个阶段检查它是否仍然找到了什么。
如果您真的认真对待XPath,请考虑使用模式感知处理:这将使您的XPath表达式与模式匹配,以确保它有意义。
考虑使用可视XPath处理器进行调试。周围有很多人。我在oXygen中使用XPath处理器(虽然不是用于调试XPath,更多是用于发现文档的内容,但这些任务通常需要一起完成。)