定位元素的父(parent::)、兄弟(following-sibling::、preceding-sibling::)節點

    最近總是有同學問我做頁面自動化時,一些元素總是很難定位,這段時間腳本運行穩定,後面腳本運行越來越不行。我看了他們相關節點的定位,發現他們定位的節點方法過於死板,節點的xpath中含有不定項,後面版本頁面改變了以後,原先的xpath就不可用了,導致腳本的不穩定。我經常強調,元素定位的原則就是不變,一定要圍繞着一個不變的節點進行定位,xpath寫出來一定要夠短,越是短的xpath其中出現可變節點的概率越小,下面就介紹一下我在寫定位元素中常用的三種定位方式。

獲取弟節點-following-sibling::

    如圖所示:

    這張圖上是一個彈框,這種彈框是經常見到的,往往在一個頁面中也會出現很多種,那麼要點這個彈框中的確定按鈕其實很簡單,只要//span[text()="確定"]就可以了,但是隨便一個彈框都可以這樣定位,彈框裏的內容變化了也無法及時發現。所以,我們定位的時候要把彈框內容加上,那麼如果開發人員擅自更改了內容就會及時的被發現。

    那麼,如何定位這個按鈕而且路徑中要包含彈框的內容呢?這個地方就需要用到獲取弟節點的方法:following-sibling::

    首先,我們要定位到這個彈框內容,即爲://div[text()="加密內容不能爲空!"]。然後我們再觀察,我們要點擊的節點在這個div節點的弟節點的孫節點內,那麼我們就先定位到這個弟節點://div[text()="加密內容不能爲空!"]/following-sibling::div。這樣可以定位到這個節點的所有弟節點,然後再進行定位要點擊的按鈕,所以,最終的定位路徑爲//div[text()="加密內容不能爲空!"]/following-sibling::div//span[text()="確定"]。

    這樣,兩個關聯起來後,有人更改任何一個的話,腳本均會報錯。

獲取兄節點:preceding-sibling::

    如圖所示:

    這次要定位的一個節點是一個下拉框(圖中標黃的節點),這個下拉框是一個可以點擊的input節點,根據圖片所示,在常規方法中會從上方尋找含有id的節點,那麼就是那個form節點了,顯而易見,如果這樣定位下來,這個節點的xpath就應該寫爲://form[@id="saveform"]/div[3]/div[3]/span[2]/input[1]。不管這樣對不對,這樣寫的弊端也是顯而易見的,xpath很長,並且其中含有大量有角標的節點,由圖所示,這個input節點在一個div下面,而這個div上方有很多一模一樣的div,那麼就是說有很多樣子一樣的控件挨在一起,這樣後面版本中增加一個或者減少一個這樣的控件也是很有可能的,一旦上面發生了變化,這個節點的定位就會失敗。

    這個問題是必須解決的,觀察節點,發現離這個節點很近的一個input節點有一個name屬性,而且這個name裏的值一看就是唯一的,那麼就應該圍繞這個input節點來定位。

    與弟節點的定位方法相同,首先定位這個有name的節點://input[@name="sne.sysLnNumAdmin.category2"]。然後在定位這個節點的兄節點,即最終節點的xpath爲://input[@name="sne.sysLnNumAdmin.category2"]/preceding-sibling::input。

    這樣定位後,xpath的長度大幅度的縮短,並且裏面不含有角標的節點,而且這兩個節點離的非常近,如果刪除必定會一起刪除。

獲取父節點以及混合應用:parent::

    如圖所示:

    從上圖可以看出,這次要定位的節點是一種常見的樹狀圖的展開節點,就是那個省份前面的加號(圖中標黃的節點)。

    從節點上來看,這個也是很多初學者經常遇到的坑,這個span節點雖然看起來有一個id節點,從原則上來講用id來定位即可,但是仔細觀察的話就可以發現,這個節點後面的數字是隨機生成的,也就是說有可能這次是這個id下次就不是了。

    那麼用傳統的方法,會從上面有id的節點來找,也就是看起來靠譜的節點有一個ul節點,或者覺得不保險上面還有個含有id的div節點。但是會遇到子節點是動態的情況,導致xpath並不是很穩定。

    那麼,我們就需要尋找一個比較穩定的節點,可以看到這個節點下方緊挨着就有兩個節點,他們有很明顯的特徵就是含有獨特的標識,一個含有title=“山東省”,一個文字就是山東省。這兩個節點均可以用來進行定位,這次我們選取下方的span節點。

    決定了節點,那麼觀察得知需要定位的節點是這個span的父節點的兄節點,也就是他的大伯,那麼就需要首先定位到他的父節點://span[text()="山東省"]/parent::a,然後再結合上面講到的定位父節點的方法,那麼最終的xpath就是://span[text()="山東省"]/parent::a/preceding-sibling::span。

    這樣寫xpath的優點不言而喻,簡潔、不含有可變節點,降低腳本出錯的概率。

總結

    這次介紹的三種xpath輔助定位方法和核心思想就是尋找要定位節點周圍不變的節點,用其來進行定位需要的節點,縮短xpath的長度,避免可變節點的出現。

    xpath中類似的輔助定位仍然有一些,比如/ancestor、/descendant等祖父、孫子節點,綜合使用起來可以使得xpath的定位更加靈活、準確。

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