XPath与IE和Firefox不同。为什么?

时间:2011-06-17 13:42:41

标签: xpath selenium firebug bookmarklet

我使用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']);

5 个答案:

答案 0 :(得分:5)

* [Id =]表示它可以是任何元素,而第二个明确提到selenium只能查找id为Search_Fields_profile_docno_input的INPUT字段。由于以下原因,第二个xpath更好

  1. 使用*查找元素需要更多时间,因为所有元素的ID都应匹配。
  2. 如果您的HTML代码没有“写得好”,可能会有其他具有相同ID的元素,这可能会导致您的测试失败。

答案 1 :(得分:2)

第一个匹配具有匹配ID的任何元素,而第二个匹配与<input>元素的匹配。如果这些是CSS表达式,则#Search_Fields_profile_docno_inputinput#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中使用的那个。