三、PARTxpath 高級用法
XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集溪猿。這些路徑表達(dá)式和我們在常規(guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似
?
表達(dá)式描述
nodename選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)甚亭,類似 css 中的標(biāo)簽選擇器
/ 從根節(jié)點(diǎn)選取膊夹,也就是當(dāng)前節(jié)點(diǎn)的最頂層(默認(rèn)情況下當(dāng)前節(jié)點(diǎn)是 html 最頂層层释,若從某元素開始截驮,當(dāng)前節(jié)點(diǎn)為此元素)
//? 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn)笑陈,而不考慮它們的位置
.? 選取當(dāng)前節(jié)點(diǎn)
..? 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
@? 選取屬性
?
缺點(diǎn):
xpath 這種定位方式, webdriver會將整個頁面的所有元素進(jìn)行掃描以定位我們所需要的元素葵袭, 這是個非常費(fèi)時的操作涵妥, ?如果腳本中大量使用xpath做元素定位的話, 腳本的執(zhí)行速度可能會稍慢
?
絕對路徑定位
從頂層?html 開始往下找坡锡,像文件夾一樣寫的完整路徑蓬网,
缺點(diǎn):一旦頁面結(jié)構(gòu)發(fā)生改變,路徑也隨之失效鹉勒,必須重新定位帆锋。?所以不推薦使用絕對路徑的寫法
相對路徑定位
絕對路徑?以 "/" ?開頭, 讓xpath 從文檔的根節(jié)點(diǎn)開始解析
相對路徑?以"http://" 開頭禽额, 讓xpath 從文檔的任何元素節(jié)點(diǎn)開始解析(也就是說每個節(jié)點(diǎn)都作為起點(diǎn)找一下
索引定位
//input[2]? 任意節(jié)點(diǎn)下的第二個 input 標(biāo)簽
屬性定位
//input[@name="username" and @type="text"]? ? 任意節(jié)點(diǎn)下name 屬性為 username 的 input 標(biāo)簽
starts-with? ? ? 例子: input[starts-with(@id,'ctrl')]? ? ? ? ? ? ? 解析:匹配以ctrl開始的屬性值
ends-with? ? ? ? 例子:input[ends-with(@id,'_userName')]? ? ?解析:匹配以userName結(jié)尾的屬性值
contains()? ? ? ? 例子:Input[contains(@id,'userName')]? ? ? ? 解析:匹配含有userName屬性值
?
其他定位方式
parent ?選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
//*[@id="content_views"]/p[51]/span[1]/parent::p
?
ancestor ?選取當(dāng)前節(jié)點(diǎn)的所有先輩(父锯厢、祖父等)
//*[@id="content_views"]/p[51]/span[1]/ancestor::div
?
ancestor-or-self ?選取當(dāng)前節(jié)點(diǎn)的所有先輩(父柴罐、祖父等)以及當(dāng)前節(jié)點(diǎn)本身(不包含叔叔伯伯
//*[@id="content_views"]/p[51]/span[1]/ancestor-or-self::div
?
?
descendant選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子惊搏、孫等)
//*[@id="content_views"]/descendant::span
?
descendant-or-self選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子、孫等)以及當(dāng)前節(jié)點(diǎn)本身
//*[@id="content_views"]/p[51]/descendant-or-self::p
?
?
preceding ??選取文檔中當(dāng)前節(jié)點(diǎn)的開始標(biāo)簽之前的所有節(jié)點(diǎn)
//*[@id="content_views"]/p[51]/preceding::p
?
preceding-sibling選取當(dāng)前節(jié)點(diǎn)之前的所有同級節(jié)點(diǎn)
//*[@id="content_views"]/p[51]/span[2]/preceding-sibling::span
?
?
following ??選取文檔中當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)簽之后的所有節(jié)點(diǎn)(不包括自己及自己的后代元素
//*[@id="content_views"]/p[51]/following::p
?
following-sibling選取當(dāng)前節(jié)點(diǎn)之后的所有同級節(jié)點(diǎn)
//*[@id="content_views"]/p[51]/span[2]/following-sibling::span