我使用Firebug的Inspect Element在网页中捕获XPath,它给了我类似的东西:
//*[@id="Search_Fields_profile_docno_input"]
我在IE中使用了Bookmarklets技术来捕获同一个对象的XPath,我有类似的东西:
//INPUT[@id='Search_Fields_profile_docno_input']
注意,第一个没有 INPUT 而是有一个星号(*)。为什么我会得到不同的XPath表达式?我用于测试的那个是否重要,如:
Selenium.Click(//*[@id="Search_Fields_profile_docno_input"]);
OR
Selenium.Click(//INPUT[@id='Search_Fields_profile_docno_input']);
答案 0 :(得分:5)
* [Id =]表示它可以是任何元素,而第二个明确提到selenium只能查找id为Search_Fields_profile_docno_input的INPUT字段。由于以下原因,第二个xpath更好
答案 1 :(得分:2)
第一个匹配具有匹配ID的任何元素,而第二个匹配与<input>
元素的匹配。如果这些是CSS表达式,则#Search_Fields_profile_docno_input
和input#Search_Fields_profile_docno_input
之间存在差异。
假设您只在网页中使用此ID一次,则两个XPath实际上是等效的。它们都匹配<input id="Search_Fields_profile_docno_input">
元素,而不是其他元素。
答案 2 :(得分:1)
你的“为什么?”有一些很好的答案。问题在这里,但对于Selenium的使用,有一个更好的选择。由于您的页面元素具有ID属性,因此请使用Selenium的ID定位器而不是XPath或CSS:
Selenium.Click("id=Search_Fields_profile_docno_input");
这将直接转到元素,并且比任何其他定位器运行得更快。请注意,语法为id=value
,而不是id="value"
。
答案 3 :(得分:0)
鉴于文档中的任何元素,有无数个XPath表达式将唯一地选择它。因此,两种不同的产品生成两种不同的路径是完全合理的。
答案 4 :(得分:0)
Google刚刚发布了Wicked Good XPath - 重写了Cybozu Lab着名的JavaScript-XPath。链接:https://code.google.com/p/wicked-good-xpath/重写版本比原始实现小40%,速度快30%。
你可以检查一下并替换Selenium中使用的那个。