使用selenium進(jìn)行自動化時少不了對元素進(jìn)行定位扒俯,但目前前端大多使用框架vue奶卓,angular等,很多元素并沒有id撼玄,name等這些讓我們很容易定位的元素屬性夺姑,這時候就要用到xpath進(jìn)行定位了,而利用xpath中的軸可以很輕松的精確定位到你要的元素
一掌猛、xpath軸
xpath的基礎(chǔ)語法和謂語可看網(wǎng)上的一些文檔(http://www.runoob.com/xpath/xpath-syntax.html)
二盏浙、實(shí)例
具體使用方法示例為:parent::div,即軸名稱::標(biāo)簽名荔茬,挑上圖一些用實(shí)例進(jìn)行分析
- parent 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)废膘,也就是當(dāng)前節(jié)點(diǎn)上一級節(jié)點(diǎn)
示例://div[contains(text(),'產(chǎn)證地址')]/parent::td
前半段//div[contains(text(),'產(chǎn)證地址')]為找到內(nèi)容包含產(chǎn)證地址的div節(jié)點(diǎn)(圈出來的節(jié)點(diǎn))然后它的上一級節(jié)點(diǎn) parent::td,即黃色部分
- child 選取當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)兔院,也就是當(dāng)前節(jié)點(diǎn)的下一級節(jié)點(diǎn)
示例://td[@width='50%']//child::div
前半段//td[@width='50%'] 為找到屬性width為50%的td節(jié)點(diǎn)(紅框圈出來的地方)殖卑,然后它的下一級節(jié)點(diǎn)child::div,即黃色部分
- ancestor 選取當(dāng)前節(jié)點(diǎn)的所有上層節(jié)點(diǎn)
示例://div[contains(text(),'產(chǎn)證地址')]//ancestor::table
前半段//div[contains(text(),'產(chǎn)證地址')]為找到內(nèi)容包含產(chǎn)證地址的div節(jié)點(diǎn)坊萝,然后找到它的上層節(jié)點(diǎn)中的table節(jié)點(diǎn)
注意:ancestor只能找上層節(jié)點(diǎn)孵稽,如果是上層節(jié)點(diǎn)的兄弟節(jié)點(diǎn)是找不到的
//div[contains(text(),'產(chǎn)證地址')]//ancestor::p,像這樣是找不到table節(jié)點(diǎn)的兄弟節(jié)點(diǎn)p的
- descendant 選取當(dāng)前節(jié)點(diǎn)的所有下層節(jié)點(diǎn)
實(shí)例 ://td[@width='50%']/descendant::p
-
following 選取當(dāng)前節(jié)點(diǎn)之后顯示的所有節(jié)點(diǎn)
示例://td[@width='50%']/following::div[contains(text(),'行政區(qū)域')]
//td[@width='50%']為圈出來的節(jié)點(diǎn)十偶,following::div[contains(text(),'行政區(qū)域')]找到它之后的所有節(jié)點(diǎn)中text內(nèi)容包含行政區(qū)域的節(jié)點(diǎn)(黃色部分)
following-sibling 選取當(dāng)前節(jié)點(diǎn)之后所有的兄弟(平級)節(jié)點(diǎn)
示例://p[text()='物業(yè)信息']/following-sibling::p[@id='ownerPart']
//p[text()='物業(yè)信息'] 找到內(nèi)容為物業(yè)信息的節(jié)點(diǎn)(圈出來的部分)菩鲜,following-sibling::p[@id='ownerPart'] 然后找到它的兄弟節(jié)點(diǎn)中id為ownerPart的節(jié)點(diǎn)(黃色部分)
- preceding 選取當(dāng)前節(jié)點(diǎn)前面所有的節(jié)點(diǎn)
示例://p[text()='出售方信息']/preceding::div[contains(text(),'擬定網(wǎng)簽價')]
//p[text()='出售方信息'],紅色框圈出來的部分preceding::div[contains(text(),'擬定網(wǎng)簽價')]找到前面所有節(jié)點(diǎn)中text內(nèi)容包含擬定網(wǎng)簽價的div節(jié)點(diǎn)(黃色部分)
- preceding-sibling 選取當(dāng)前節(jié)點(diǎn)前面所有兄弟(平級)節(jié)點(diǎn)
示例://p[text()='出售方信息']/preceding-sibling::p[contains(text(),'物業(yè)信息')]
//p[text()='出售方信息'] 紅色框圈出來部分
preceding-sibling::p[contains(text(),'物業(yè)信息')] 找到它前面的所有兄弟節(jié)點(diǎn)中內(nèi)容包含物業(yè)信息的p節(jié)點(diǎn)(黃色部分)
三惦积、小tips
- 謂語:
starts-with 顧名思義接校,匹配一個屬性開始位置的關(guān)鍵字
contains 匹配一個屬性值中包含的字符串
text() 匹配的是顯示文本信息,此處也可以用來做定位用
//input[starts-with(@name,'name1')] 查找name屬性中開始位置包含'name1'關(guān)鍵字的頁面元素
//input[contains(@name,'na')] 查找name屬性中包含na關(guān)鍵字的頁面元素
<a >百度搜索</a>
xpath寫法為 //a[text()='百度搜索']
或者 //a[contains(text(),"百度搜索")] - .// 和//的區(qū)別
//是指從全文上下文中搜索//后面的節(jié)點(diǎn)
.// 中.表示當(dāng)前節(jié)點(diǎn)狮崩,.//表示從當(dāng)前節(jié)點(diǎn)之后的子節(jié)點(diǎn)中查找(或指從前面的節(jié)點(diǎn)的子節(jié)點(diǎn)中進(jìn)行查找)
例如://div[.//a[text()=’SELENIUM’]] 為從任意div中查找其子節(jié)點(diǎn)文本為SELENIUM的a元素 - 凡是用text()的地方均可以直接用.來進(jìn)行表示蛛勉,例如a[text()=’SELENIUM’]和a[.=’SELENIUM’]是等價的。
四睦柴、個人心得
- 1诽凌、定位元素先看改元素在頁面中有沒有唯一性的屬性或內(nèi)容,有就可以根據(jù)這個來定位
例如:
//a[text()='確定']
//input[@placeholder='請輸入坦敌,若無則無需填寫'] - 2侣诵、如果沒有唯一性的屬性就可該元素的上下中有沒有唯一性的屬性或內(nèi)容,這樣就可以先定位它的上下元素狱窘,然后在來找你要定位的元素
例如://span[text()='貸款']/preceding-sibling::span/span
這個是先找到內(nèi)容為貸款的span節(jié)點(diǎn)然后找它上面的平級節(jié)點(diǎn)span然后在往下找一層span - 3杜顺、總體的思路就是通過節(jié)點(diǎn)或它的上下節(jié)點(diǎn)的唯一性來入手以保證你定位元素的唯一性,以下是幾個自己定位的實(shí)例
//table[.//p[text()='擁有房屋產(chǎn)權(quán)家庭一:']]//td[./p[text()='產(chǎn)權(quán)人二:']]//form//form//input[@placeholder]
.代表當(dāng)前節(jié)點(diǎn)
//table[.//p[text()='擁有房屋產(chǎn)權(quán)家庭一:']]//td[./p[text()='產(chǎn)權(quán)人三:']]//form//form//li[./label[contains(text(),'購入份額契稅')]]//input
//body/div[last()]//span[text()='買賣'] - 4蘸炸、descendant表示選取當(dāng)前節(jié)點(diǎn)的所有后代元素
凡是使用descendant的地方都可以用//替換躬络,效果一樣,都是查找后臺元素