xpath定位

XPath 是一種在XML 文檔中定位元素的語言。由於HTML 能夠看作XML 的一種實現,因此selenium
用戶但是使用這種強大語言在web 應用中定位元素。
絕對路徑定位:
XPath 有多種定位策略,最簡單和直觀的就是寫元素的絕對路徑。若是仍然把一個元素看作一我的的
話,那麼如今有一我的,他沒有任何屬性特徵,那麼這我的必定會存在於某個地理位置,如:xx 省xx 市
xx 區xx 路xx 號。那麼對於一個元素在一個頁面當中也會有這樣的一個絕對地址。
參考baidu.html 前端工具所展現的代碼,咱們能夠用下面的方式來找到百度輸入框和搜索按鈕。
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")
find_element_by_xpath()方法用於XPath 語言定位元素。XPath 的絕對路徑主要用標籤名的層級關係來
定位元素的絕對路徑。最外層爲html 語言,body 文本內,一級一級往下查找,若是一個層級下有多個相
同的標籤名,那麼就按上下順序肯定是第幾個,div[2]表示第二個div 標籤。
利用元素屬性定位:
除了使用絕對路徑的之外,XPath 也可使用使素的屬性值來定位。一樣以百度輸入框和搜索按鈕爲例了:html

find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//input[@id='su']")
//表示當前頁面某個目錄下,input 表示定位元素的標籤名,[@id='kw'] 表示這個元素的id 屬性值等於
kw。下面經過name 和class 屬性值來定位。
find_element_by_xpath("//input[@id='wd']")
find_element_by_xpath("//input[@class='s_ipt']")
find_element_by_xpath("//*[@class='bg s_btn']")
若是不想指定標籤名也能夠用星號(*)代替。固然,使用XPath 不單單隻侷限在id、name 和class 這
三個屬性值,元素的任意屬性值均可以使用,只要它能惟一的標識一個元素。
find_element_by_xpath("//input[@maxlength='100']")
find_element_by_xpath("//input[@autocomplete='off']")
find_element_by_xpath("//input[@type='submit']")
層級與屬性結合:
若是一個元素自己並無能夠惟一標識這個元素的屬性值,咱們能夠找其上一級元素,若是它的上級
有能夠惟一標識屬性的值,也能夠拿來使用。參考baidu.html 文本。
……
<form id="form" class="fm" action="/s" name="f">
<input type="hidden" value="utf-8" name="ie">
<input type="hidden" value="8" name="f">
<input type="hidden" value="1" name="rsv_bp">
<input type="hidden" value="1" name="rsv_idx">
<input type="hidden" value="" name="ch">
<input type="hidden" value="02.." name="tn">
<input type="hidden" value="" name="bar">
<span class="bg s_ipt_wr">
<input id="kw" class="s_ipt" autocomplete="off"
maxlength="100" value="" name="wd">
</span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" type="submit"
value="百度一下">
</span>
……
前端

假如百度輸入框自己沒有可利用的屬性值,咱們能夠查找它的上一級屬性。好比,「小明」剛出生的
時候沒有名字,沒上戶口(沒身份證號),那麼親朋好友來找「小明」能夠先到小明的爸爸,由於他爸爸
是有不少屬性特徵的,找到了小明的爸爸,抱在懷裏的必定就是小明瞭。經過XPath 描述以下:
find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
find_element_by_xpath("//span[@class='bg s_btn_wr']/input")
span[@class='bg s_ipt_wr'] 經過class 屬性定位到是父元素,後面/input 也就表示父元素下面標籤名爲
input 的子元素。若是父元素沒有可利用的屬性值,那麼能夠繼續向上查找「爺爺」元素。
find_element_by_xpath("//form[@id='form']/span/input")
find_element_by_xpath("//form[@id='form']/span[2]/input")
咱們能夠經過這種方法一級一級的向上打找,直到找到最外層的<html>標籤,那麼就是一個絕對路徑
的寫法了。
使用邏輯運算符
若是一個屬性不能惟一的區分一個元素,咱們還可使用邏輯運算符鏈接多個屬性來區別於其它屬
性。
……
<input id="kw" class="su" name="ie">
<input id="kw" class="aa" name="ie">
<input id="bb" class="su" name="ie">
……
如上面的三行元素,假如咱們如今要定位第一行元素,若是使用id 將會與第二行元素重名,若是使用
class 將會與第三行元素的重名。那麼若是同時使用id 和class 就會惟一的標識這個元素。那麼這個時候就
能夠經過邏輯運算符號鏈接。
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
固然,咱們也能夠用and 鏈接更多的屬性來惟一的標識一個元素。
咱們在本書的第一章中介紹的Firebug 前端調試工具和FirePath 插件能夠方便的輔助XPath 語法。
打開FireFox 瀏覽器的FireBug 插件,點擊插件左上角的鼠標箭頭,再點擊頁面上須要定位的元素,在元
素行上右鍵彈出快捷菜單,選擇「複製XPath」,將會得到當前元素的XPath 語法,(如圖4.3)。web

FirePath 插件的使用就更加方便和快捷了,選中元素後,直接在XPath 的輸入框中生成當前元素的XPath
語法(如圖4.4)。瀏覽器

相關文章
相關標籤/搜索