2011-06-17 57 views
4

我用Firebug的檢查元素捕捉網頁中的XPath,它給了我這樣的:IE和Firefox中的XPath不同。爲什麼?

//*[@id="Search_Fields_profile_docno_input"] 

我用IE瀏覽器的書籤工具技術來捕獲同一對象的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

* [Id =]表示它可以是任何元素,而第二個明確提到硒僅查找ID爲Search_Fields_profile_docno_input的INPUT字段。由於以下原因,第二個xpath更好:

  1. 需要更多時間才能找到使用*的元素作爲所有元素的ID應匹配的元素。
  2. 如果您的HTML代碼不是「寫得很好」,可能會有其他元素具有相同的ID,這可能會導致您的測試失敗。
+2

RE#2:有不應該與給定的ID值多於一個的元件。如果有(即無效的HTML),Selenium選擇文檔中的第一個。 – 2011-06-18 12:58:05

2

第一個具有匹配的ID任何元素相匹配,而第二個限制火柴<input>元素。如果這些是CSS表達式,它將是#Search_Fields_profile_docno_inputinput#Search_Fields_profile_docno_input之間的差異。

假設您只在網頁中使用此ID一次,兩個XPath實際上是等效的。他們都會匹配<input id="Search_Fields_profile_docno_input">元素,而不是其他。

0

鑑於文檔中的任何元素,都會有無數個XPath表達式來唯一地選擇它。因此,兩種不同的產品生成兩條不同的路徑是完全合理的。

1

對於「爲什麼?」有一些很好的答案。問題在這裏,但對於硒的使用,還有一個更好的選擇。由於您的網頁元素有一個ID屬性,使用Selenium的ID定位器,而不是XPath或CSS:

Selenium.Click("id=Search_Fields_profile_docno_input"); 

這將直接進入元素,將運行比任何其他定位更快。請注意,語法是id=value,而不是id="value"

0

谷歌剛剛發佈了邪惡良好的XPath - 才望實驗室著名的JavaScript的XPath重寫。鏈接:https://code.google.com/p/wicked-good-xpath/重寫的版本比原始版本小40%,大約快30%。

你可以檢查出來並替換Selenium中使用的那個。

相關問題