使用xpath的軸(Axis)進(jìn)行元素定位

使用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

Axes

二盏浙、實(shí)例

具體使用方法示例為:parent::div,即軸名稱::標(biāo)簽名荔茬,挑上圖一些用實(shí)例進(jìn)行分析

  1. 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,即黃色部分
image.png
  1. 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,即黃色部分
image.png
  1. 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的
image.png
  1. descendant 選取當(dāng)前節(jié)點(diǎn)的所有下層節(jié)點(diǎn)
    實(shí)例 ://td[@width='50%']/descendant::p
image.png
  1. 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

  2. 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)(黃色部分)

image.png
  1. 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
  1. 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)(黃色部分)
image.png

三惦积、小tips

  1. 謂語:
    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(),"百度搜索")]
  2. .// 和//的區(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元素
  3. 凡是用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的地方都可以用//替換躬络,效果一樣,都是查找后臺元素
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搭儒,一起剝皮案震驚了整個濱河市洗鸵,隨后出現(xiàn)的幾起案子越锈,更是在濱河造成了極大的恐慌,老刑警劉巖膘滨,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘凭,死亡現(xiàn)場離奇詭異,居然都是意外死亡火邓,警方通過查閱死者的電腦和手機(jī)丹弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铲咨,“玉大人躲胳,你說我怎么就攤上這事∠死眨” “怎么了坯苹?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摇天。 經(jīng)常有香客問我粹湃,道長,這世上最難降的妖魔是什么泉坐? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任为鳄,我火速辦了婚禮,結(jié)果婚禮上腕让,老公的妹妹穿的比我還像新娘孤钦。我一直安慰自己,他們只是感情好纯丸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布偏形。 她就那樣靜靜地躺著,像睡著了一般觉鼻。 火紅的嫁衣襯著肌膚如雪俊扭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天滑凉,我揣著相機(jī)與錄音统扳,去河邊找鬼喘帚。 笑死畅姊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吹由。 我是一名探鬼主播若未,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倾鲫!你這毒婦竟也來了粗合?” 一聲冷哼從身側(cè)響起萍嬉,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隙疚,沒想到半個月后壤追,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡供屉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年行冰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伶丐。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡悼做,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哗魂,到底是詐尸還是另有隱情肛走,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布录别,位于F島的核電站朽色,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庶灿。R本人自食惡果不足惜纵搁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望往踢。 院中可真熱鬧腾誉,春花似錦、人聲如沸峻呕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘦癌。三九已至猪贪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讯私,已是汗流浹背热押。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斤寇,地道東北人桶癣。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像娘锁,于是被迫代替她去往敵國和親牙寞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容