Selenium中被誤用的XPath

用Selenium實現自動化測試的過程中,如果選擇頁面上的元素並且對之進行各種操作,是一個常見的任務。Selenium提供了多種定位方法:

  • id:最有效、最方便的方法
  • name:跟id類似的
  • class name:對某些具有相同類的元素一網打盡的好方法
  • link text 和 partial link text: 用在定位超鏈接上比較多
  • tag name:與class name有點類似
  • css selector:如果你試用jQuery,這個一定是你喜歡的方法
  • xpath:。。。 /html/body/div/div[2]/div[2]/div[2]/div[5]/div/p[2]

網上很多Selenium的介紹文章,在講述如何利用XPath定位元素的時候,通常都是這樣子說的“打開Firefox瀏覽器,安裝Firebug插件,然後就能方便地獲得該元素的XPath了”。由於不求甚解,在一段時間內我真以爲這些看起來沒什麼意義,中間穿插着各種數組操作,讀起來反人類反社會的所謂XPath就是真的XPath,同志們大家都被誤導了。

XPath在Selenium測試中有好些缺點:1. 性能差,定位元素的性能比起大多數其他方法要差;2. 不夠健壯,XPath會隨着頁面元素佈局的改變而改變;3. 兼容性不好,在不同的瀏覽器下對XPath的實現是不一樣的。如此多的弱點,爲什麼它還存在於Selenium中呢?Selenium提供了這7個元素定位的工具,就好像工具箱裏面有錘子有老虎鉗有螺絲刀,每個工具都能完成特定的任務,前提是要在正確的前提下,正確地使用。

XPath通常會在如下場景:一個寫自動化測試的人,發現他想要操作的元素不能通過id, name, link text等比較方便有效的方法來進行定位,苦逼的他沒能說服開發這個頁面的人把他想要的id加上,他開始用所謂的XPath來定位元素,代碼中充滿了各種讓人摸不着頭腦的XPath(/html/body/div/div[3]/div[2]/div[4]/p[2]),在我看來這樣的代碼跟錄製出來的腳本沒有任何區別。可讀性差,幾乎不能維護。XPath理論上可以這樣使用,但是實際上應該避免這樣的使用。

XPath的一些優點是大家需要知道的,例如:1. XPath可以通過某個元素找到它的祖先(Ancestors);2. 可以做布爾邏輯判斷,例如/button[@value=’submit’ or @name=’tijiao’]

回到上面的場景,假如說那個苦逼的人想定位到頁面上的一個提交按鈕,這個按鈕不能通過id或者name來定位。這個時候他要做的事情不是打開Firebug定位提交按鈕右擊鼠標再點“Copy XPath”。而是應該是找開發把id或者name加上。如果不行,解決思路可以是:1. 找到該按鈕的特徵,例如按鈕的文字是 submit;2. 用XPath定位,可以這樣寫://button[@value=’submit’]。
我個人對使用XPath比較反感的,如果可能的話,儘可能使用id或者name。真的要用XPath,千萬千萬不要打開Firebug定位提交按鈕右擊鼠標再點“Copy XPath”。先認真學習XPath,後使用。在很長一段時間裏面,我對XPath真的是恨之入骨,恨不得先殺之而後快,但是想到存在就是合理,那麼多大牛們都沒有把XPath摒棄與Selenium之外,XPath必然有它的價值。最近花了點時間學習了一下XPath,並且讀了一些關於如何在Selenium裏面正確使用XPath的文章,豁然開朗。

參考文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章