若是你還想從頭學起Selenium,能夠看看這個系列的文章哦!css
https://www.cnblogs.com/poloyy/category/1680176.htmlhtml
其次,若是你不懂前端基礎知識,須要本身去補充哦,博主暫時沒有總結(雖然我也會,因此我學selenium就不用複習前端了哈哈哈...)前端
官方:XPath 是一門在 XML 文檔中查找信息的語言。XPath 用於在 XML 文檔中經過元素和屬性進行導航node
【XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集】web
Xpath 這種定位方式, webdriver會將整個頁面的全部元素進行掃描以定位咱們所須要的元素, 這是個很是費時的操做, 若是腳本中大量使用xpath作元素定位的話, 腳本的執行速度可能會稍慢ide
表達式 | 等價於CSS | 描述 |
---|---|---|
nodename | 標籤 | 選取此節點的全部子節點,相似 css 中的標籤選擇器 |
/ | > | 從根節點選取,也就是當前節點的最頂層(默認狀況下當前節點是 html 最頂層,若從某元素開始,當前節點爲此元素) |
// | 空格,後代選擇器 | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置 |
. | 無 | 選取當前節點 |
.. | 無 | 選取當前節點的父節點 |
@ | 無 | 選取屬性 |
* | * | 通配符,表明任意類型的標籤 |
做用:從頂層 html 開始往下找,像文件夾同樣寫的完整路徑;它是以 / 開頭的,如: /html/body/div/ul/li 函數
做用:相對路徑 以"//" 開頭, 讓xpath 從文檔的任何元素節點開始解析(也就是說每一個節點都做爲起點找一下)ui
和絕對路徑的區別:絕對路徑 以 "/" 開頭,讓xpath 從文檔的根節點開始解析spa
跟Python的列表同樣,經過[ 1 ]下標去找,注意!它是從1開始的code
如: //input[2] ,表示任意節點下的第二個 input 標籤
Xpath路徑表達式 | CSS選擇器表達式 |
只經過絕對路徑、標籤訂位 | |
/html/body | html>body |
/html/body/div/div[@class="bar"] | html>body>div>div.bar |
/html//div | html div |
/html//div/ul//li | html div>ul li |
經過相對路徑、標籤、屬性值定位 | |
//div[@class="header"] | div.header |
//div[@class="ush top_wrap"] | div.top_wrap |
//div[@class="ush top_wrap"]/a[@class="more"] | div.top_wrap>a.more |
經過標籤、屬性值、通配符定位 | |
//* | * |
//*[@class="header"] | [class="header"]或 .header |
//*[@id="languagelist"] | [id="languagelist"]或 #languagelist |
//*[@id="languagelist"]/li[2] | #languagelist>li:nth-child(2) |
//div[@class="header"]//ul[@id="languagelist"]/* | div.header ul#languagelist >* |
經過下標 或 屬性定位 | |
//@href | [href] |
//a[@href] | a[href] |
//div[@class="header"]//ul/li[last()] | div.header ul >li:last-child |
//div[@class="ush top_wrap"]//ul[@id]/li[1] | div.top_wrap ul[id]>li:first-child |
若干路徑 | |
//body | //ul | body , ul |
//ul[@id="kwdTypeSelUl"] | //ul[@id="area_channel_layer_list"] | ul#kwdTypeSelUl , ul#area_channel_layer_list |
繼續拿:https://www.51job.com/作小案例哦
表達式 | 描述 |
//title[@*] | 選取全部帶有屬性的 title 元素 |
條件表達式and、or、not | |
//div[@id="zoomer" and @style="display:none;"] | 找到id="zoomer"和style="display:none"的div元素 |
//div[@class="cresume" or @class="footer"] | 找到class="cresume"或 "footer"的div元素 |
//*[@id="showguide" and not(@class="footer")] | 找到id="showguide"且class != "footer"的任意元素 |
模糊匹配函數starts-with、contains | |
//*[starts-with(@id,"s")] | 找到id開頭爲 s 的任意元素 |
//*[ends-with(@id,"s")] | 找到id結尾爲 s 的任意元素 |
//*[contains(text(),'註冊')] | 找到標籤間文本包含 註冊 的任意元素 |
定位函數position | |
//*[contains(@id,"languagelist")]/li[position()=3] | 找到第三個 li |
//*[contains(@id,"languagelist")]/li[position()<=2] | 找到前兩個 li |
定位方式 | 描述 |
---|---|
ancestor | 選取當前節點的全部先輩(父、祖父等) |
ancestor-or-self | 選取當前節點的全部先輩(父、祖父等)以及當前節點自己 |
child | 選取當前節點的全部子元素【/可替代,略顯多餘】 |
descendant | 選取當前節點的全部後代元素(子、孫等)【//可替代,略顯多餘】 |
descendant-or-self | 選取當前節點的全部後代元素(子、孫等)以及當前節點自己 |
following | 選取當前節點的結束標籤以後的全部節點 |
following-sibling | 選取當前節點以後的全部同級節點 |
parent | 選取當前節點的父節點【../可替代,略顯多餘】 |
preceding | 選取文檔中當前節點的開始標籤以前的全部節點 |
preceding-sibling | 選取當前節點以前的全部同級節點 |
繼續拿:https://www.51job.com/作小案例哦
其餘定位方式 | 是否有等價寫法? |
//*[contains(@class,"top_wrap")]/parent::div | //*[contains(@class,"top_wrap")]/.. |
//*[contains(@class,"content")]/div/child::div | //*[contains(@class,"content")]/div/div |
//*[contains(@id,"userid")]/preceding-sibling::input | //*[contains(@id,"userid")]/../input[position()<=4] |
//*[contains(@id,"userid")]/following-sibling::div | //*[contains(@id,"userid")]/../div[position()=2] |
//*[contains(@class,"content")]/descendant::div | //*[contains(@class,"content")]//div |