今天就跟大家聊聊有關(guān)在python使用selenium xpath方法實現(xiàn)定位操作,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、右玉網(wǎng)站維護(hù)、網(wǎng)站推廣。xpath是一種在xm文檔中定位的語言,詳細(xì)簡介,請自行參照百度百科,本文主要總結(jié)一下xpath的使用方法,個人看法,如有不足和錯誤,敬請指出。
注意:xpath的定位 同一級別的多個標(biāo)簽 索引從1開始 而不是0
1. 絕對定位:
此方法最為簡單,具體格式為
xxx.find_element_by_xpath("絕對路徑")
具體例子:
xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x個 div標(biāo)簽,注意,索引從1開始而不是0
此方法缺點顯而易見,當(dāng)頁面元素位置發(fā)生改變時,都需要修改,因此,并不推薦使用。
2.相對路徑:
相對路徑,以‘//'開頭,具體格式為
xxx.find_element_by_xpath("http://標(biāo)簽")
具體例子:
xxx.find_element_by_xpath("http://input[x]") 定位第x個input標(biāo)簽,[x]可以省略,默認(rèn)為第一個
相對路徑的長度和開始位置并不受限制,也可以采取以下方法
xxx.find_element_by_xpath("http://div[x]/form[x]/input[x]"), [x]依然是可以省略的
("http://*[@id='J_login_form']/dl/dt/input[@id='J_password']"
3.標(biāo)簽屬性定位:
3.1標(biāo)簽屬性定位,相對比較簡單,也要求屬性能夠定位到唯一一個元素,如果存在多個相同條件的標(biāo)簽,默認(rèn)只是第一個,具體格式
xxx.find_element_by_xpath("http://標(biāo)簽[@屬性==‘屬性值']")
屬性判斷條件:最常見為id,name,class等等,目前屬性的類別沒有特殊限制,只要能夠唯一標(biāo)識一個元素都是可以的
具體例子
xxx.find_element_by_xpath("http://a[@href='/industryMall/hall/industryIndex.ht']") xxx.find_element_by_xpath("http://input[@value='確定']") xxx.find_element_by_xpath("http://div[@class = 'submit']/input")
當(dāng)某個屬性不足以唯一區(qū)別某一個元素時,也可以采取多個條件組合的方式,具體例子
xxx..find_element_by_xpath("http://input[@type='name' and @name='kw1']")
3.2 當(dāng)標(biāo)簽屬性很少,不足以唯一區(qū)別元素時,但是標(biāo)簽中間中間存在唯一的文本值,也可以定位,其具體格式
xxx.find_element_by_xpath("http://標(biāo)簽[contains(text(),'文本值')]")
具體例子:
xxx.find_element_by_xpath("http://iunpt[contains(text(),'型號:')]")
注意:盡量在html中復(fù)制此段文本,避免因為肉眼無法分辨的字符導(dǎo)致定位失敗
3.3 其他的屬性值如果太長,也可以采取模糊方法定位,直接上示例
xxx.find_element_by_xpath(“//a[contains(@href, ‘logout')]”)
3.4 XPath 關(guān)于網(wǎng)頁中的動態(tài)屬性的定位,例如,ASP.NET應(yīng)用程序中動態(tài)生成id屬性值,可以有以下四種方法:
a.starts-with例子: input[starts-with(@id,'ctrl')] 解析:匹配以ctrl開始的屬性值
b.ends-with 例子:input[ends-with(@id,'_userName')] 解析:匹配以userName結(jié)尾的屬性值
c.contains() 例子:Input[contains(@id,'userName')] 解析:匹配含有userName屬性值
當(dāng)然,如果上面的單一方法不能完成定位,也可以采取組合式定位 類似("http://input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])
以上是普通的情況,存在可以定位的屬性,當(dāng)某個元素的各個屬性及其組合都不足以定位時,我們可以利用其兄弟節(jié)點或者父節(jié)點等各種可以定位的元素進(jìn)行定位,先看看xpath中支持的方法:
1、child 選取當(dāng)前節(jié)點的所有子元素
2、parent 選取當(dāng)前節(jié)點的父節(jié)點
3、descendant選取當(dāng)前節(jié)點的所有后代元素(子、孫等)
4、ancestor 選取當(dāng)前節(jié)點的所有先輩(父、祖父等)
5、descendant-or-self選取當(dāng)前節(jié)點的所有后代元素(子、孫等)以及當(dāng)前節(jié)點本身
6、ancestor-or-self 選取當(dāng)前節(jié)點的所有先輩(父、祖父等)以及當(dāng)前節(jié)點本身
7、preceding-sibling選取當(dāng)前節(jié)點之前的所有同級節(jié)點
8、following-sibling選取當(dāng)前節(jié)點之后的所有同級節(jié)點
9、preceding選取文檔中當(dāng)前節(jié)點的開始標(biāo)簽之前的所有節(jié)點
10、following選取文檔中當(dāng)前節(jié)點的結(jié)束標(biāo)簽之后的所有節(jié)點
11、self 選取當(dāng)前節(jié)點
12、attribute 選取當(dāng)前節(jié)點的所有屬性
13、namespace選取當(dāng)前節(jié)點的所有命名空間節(jié)點
上圖實例,需要點擊訂單號為17051915200001的發(fā)貨按鈕,這時候不能直接定位到發(fā)貨按鈕,而是先要定位到訂單號元素,再定位他的兄弟節(jié)點。
參照上圖,我們首先定位到td標(biāo)簽中包含訂單號的td元素,然后選擇其之后的同級節(jié)點,following-sibling,我們要找的元素在后面的第8個td標(biāo)簽下,因此定位可以寫名為下面的格式
Xxx.find_element_by_xpath("http://td[contains(text(),'17051915200001')]/following-sibling::td[8]/a[@class='link']")
preceding-sibling 情況類似,但是所有元素的排列順序是相反的(和following-sibling相反),如圖:
其他方法的使用方式相同, 11-13目前沒有使用過,也沒有搜索到實際使用的案例,如果有人知道,希望不吝賜教。
補(bǔ)充知識:Python+selenium:用“and”連接屬性定位元素
如下所示:
find_element_by_xpath("http://input[@id='kw' and @class='su']/span/input") //用and來連接屬性定位元素
看完上述內(nèi)容,你們對在python使用selenium xpath方法實現(xiàn)定位操作有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。