這篇文章繼續(xù)介紹selenium web driver中的xpath定位器。上次介紹了絕對(duì)路徑和相對(duì)路徑的異同,以及怎樣使用屬性和一些關(guān)鍵字來定位html文檔的節(jié)點(diǎn)檬果,功能已經(jīng)比較強(qiáng)大了浮驳。但如果還無法完成定位,那還可以用xpath的軸(axes)定位方法宣旱。軸定位有以下幾種方法:
- child
- descendant
- parent
- ancestor
- following
- preceding
- following-sibling
- preceding-sibling
- self
第一種,child叛薯,查找的是當(dāng)前節(jié)點(diǎn)下面第一層的某個(gè)指定節(jié)點(diǎn)浑吟。格式是
比如下面的例子:
這個(gè)xpath找的是form下面第一個(gè)p標(biāo)簽下的label標(biāo)簽笙纤。再看一個(gè)多選的:
第二個(gè)class="row"的div下面第一層總共有三個(gè)的div。注意组力,某個(gè)節(jié)點(diǎn)下面第一層又叫做該節(jié)點(diǎn)的子節(jié)點(diǎn)省容。child嘛,孩子燎字,其實(shí)你可以把它理解成找該節(jié)點(diǎn)的兒子或是女兒腥椒。
第二種,descendent候衍,查找的是當(dāng)前節(jié)點(diǎn)下面所有層的某個(gè)指定節(jié)點(diǎn)笼蛛。格式是
descendent與child不同,它是以當(dāng)前節(jié)點(diǎn)為參照找下面所有的匹配節(jié)點(diǎn)蛉鹿,不局限在第一層滨砍。比如還是剛才的例子。我把child換成descendant:
你看妖异,第二個(gè)class="row"的div下面所有的div都被高亮顯示了惋戏。descendant是子孫的意思,指明了不光包含兒子和女兒他膳,而是所有的子孫節(jié)點(diǎn)日川。
第三種,parent矩乐,查找的是當(dāng)前節(jié)點(diǎn)上面一層的節(jié)點(diǎn)龄句,也就是它的父節(jié)點(diǎn)。xpath一般是向下查詢的散罕,但軸定位允許其向上查詢分歇。查看其父節(jié)點(diǎn)的格式是:
用兩個(gè)點(diǎn)代表父節(jié)點(diǎn),這點(diǎn)和系統(tǒng)目錄查找很像欧漱。比如下面的例子:
通配符星號(hào)代表所有節(jié)點(diǎn)职抡。我的xpath會(huì)先找到name="password"的所有節(jié)點(diǎn),顯然误甚,只有一個(gè)input標(biāo)簽滿足這個(gè)條件缚甩。然后以這個(gè)input標(biāo)簽為參照查看它的父節(jié)點(diǎn),這樣又鎖定了p標(biāo)簽窑邦。最后再查找p標(biāo)簽下面第一層的label擅威。
當(dāng)然,和不停地往下查找子節(jié)點(diǎn)一樣冈钦,xpath也允許連續(xù)向上查找父節(jié)點(diǎn):
第四種郊丛,ancestor,查找的是當(dāng)前節(jié)點(diǎn)的所有祖先中的某個(gè)指定節(jié)點(diǎn)。格式是
parent指的是當(dāng)前節(jié)點(diǎn)上面一層的節(jié)點(diǎn)厉熟,而ancestor指的就是當(dāng)前節(jié)點(diǎn)上面所有層的節(jié)點(diǎn)导盅,所以叫祖先。比如:
name="password"的input標(biāo)簽有很多祖先揍瑟,但我只選出標(biāo)簽是div的白翻。
第五種,following-sibling绢片,查找的是與當(dāng)前節(jié)點(diǎn)同一層的某個(gè)指定節(jié)點(diǎn)滤馍,但出現(xiàn)位置在當(dāng)前節(jié)點(diǎn)之后。格式是:
sibling是兄弟姐妹的意思杉畜,following是跟隨、后面的意思衷恭,這里代表要查找的節(jié)點(diǎn)與當(dāng)前節(jié)點(diǎn)出現(xiàn)在同一層此叠,但出現(xiàn)在當(dāng)前節(jié)點(diǎn)之后。比如:
我先鎖定的是id=form1的form標(biāo)簽随珠,然后找到它下面唯一的div標(biāo)簽灭袁,最后定位出現(xiàn)在div后面的所有同層的p標(biāo)簽節(jié)點(diǎn)。
第六種窗看,preceding-sibling茸歧,查找的是與當(dāng)前節(jié)點(diǎn)同一層的某個(gè)指定節(jié)點(diǎn),但出現(xiàn)位置在當(dāng)前節(jié)點(diǎn)之前显沈。格式是:
與following-sibling正好相反软瞎,preceding-sibling指的是出現(xiàn)在當(dāng)前節(jié)點(diǎn)之前的同層節(jié)點(diǎn)。比如:
我先鎖定的是id=form1的form標(biāo)簽拉讯,然后找到它下面唯一的div標(biāo)簽涤浇,最后定位出現(xiàn)在div前面的所有同層的p標(biāo)簽節(jié)點(diǎn)。
第七種魔慷,following只锭,查找的是所有出現(xiàn)在當(dāng)前節(jié)點(diǎn)后面的某個(gè)指定節(jié)點(diǎn),但不包括子孫節(jié)點(diǎn)院尔。格式是:
這次沒有sibling了蜻展,看似簡(jiǎn)單了,但要注意邀摆,雖然是找當(dāng)前節(jié)點(diǎn)后面的纵顾,但following是不包含子孫節(jié)點(diǎn)的。比如:
先定位屬性class等于col-md-6的div標(biāo)簽栋盹,再找出現(xiàn)在它后面的div節(jié)點(diǎn)片挂。你看,只有一個(gè)標(biāo)簽高亮顯示,其它的因?yàn)槎际钱?dāng)前節(jié)點(diǎn)的子孫而被忽略音念。
第八種沪饺,preceding,查找的是所有出現(xiàn)在當(dāng)前節(jié)點(diǎn)前面的某個(gè)指定節(jié)點(diǎn)闷愤,但不包括祖先節(jié)點(diǎn)整葡。格式是:
這也好理解了,和following相反讥脐,只要出現(xiàn)在當(dāng)前節(jié)點(diǎn)前面遭居,而且不是它的祖先就行。比如:
先定位屬性class包含login字段的div標(biāo)簽旬渠,再找出現(xiàn)在它前面的所有div節(jié)點(diǎn)俱萍。過濾掉的都是當(dāng)前節(jié)點(diǎn)的祖先。
第九種告丢,self枪蘑,查找的是當(dāng)前節(jié)點(diǎn)自己。格式是:
找的是當(dāng)前節(jié)點(diǎn)自己岖免,聽起來有點(diǎn)扯岳颇,但self確實(shí)屬于軸定位的關(guān)鍵字之一。比如:
選擇id="pwd_alert"的label節(jié)點(diǎn)颅湘,然后再查它自己话侧。好吧各拷,我承認(rèn)確實(shí)很扯其骄。
以上9種xpath軸定位探橱,除了self和parent坷檩,其它選出來的很可能是多個(gè)指定節(jié)點(diǎn)跟啤,但大多數(shù)時(shí)間我們只需要一個(gè)就夠了颂郎。同樣吕粗,我們可以使用索引互婿。比如用following-sibling選某一個(gè)p標(biāo)簽:
我找的是form標(biāo)簽下面div后面的第三個(gè)p標(biāo)簽释移“扰或是用child選某一個(gè)div:
你也可以再練練following和descendant,都是一個(gè)原理玩讳。child涩蜘,descendant,following熏纯,following-sibling這四者有個(gè)共同的特點(diǎn):索引值是從上往下數(shù)的同诫,越往下數(shù)值越大。
但是你如果試試ancestor/preceding/preceding-sibling樟澜,就會(huì)發(fā)現(xiàn)不一樣误窖。比如用ancestor選某一個(gè)div:
明明選的是第6個(gè)div叮盘,可在最上面。同理霹俺,preceding也是一樣的:
所以柔吼,我們可以總結(jié)一下:索引值從上往下數(shù)(越往下數(shù)值越大)的是child,descendant丙唧,following愈魏,following-sibling;索引值從下往上數(shù)(越往上數(shù)值越大)的是ancestor想际,preceding培漏,preceding-sibling。
上述9種xpath軸定位方法胡本,再加上上一篇討論的基本用法牌柄,xpath基本上能涵蓋我們自動(dòng)化定位的所有情況了。那我現(xiàn)在就演示一下用xpath定位元素侧甫,它的格式是:
打開示例網(wǎng)頁珊佣,我們定位該頁面上的元素,然后打印出來闺骚。代碼如下:
xpath就介紹到這兒彩扔,大家多練習(xí)妆档。下篇文章我們討論css selector僻爽。本篇文章的源代碼是SeleniumXpath。
本篇知識(shí)點(diǎn)及注意事項(xiàng):
1. 使用軸定位時(shí)贾惦,索引值從上往下數(shù)(越往下數(shù)值越大)的是child胸梆,descendant须板,following碰镜,following-sibling;索引值從下往上數(shù)(越往上數(shù)值越大)的是ancestor习瑰,preceding绪颖,preceding-sibling。