selenium自動(dòng)化測(cè)試中,元素定位是有8種基本方式,如id、Name、class、CSS、XPath、link_text等。方法多樣,但是具體的定位中如何選擇何種定位比較合適? 如何能跳出定位錯(cuò)誤的坑,如何能準(zhǔn)確的定位到元素呢?這是值得我們思考的問題。
? ? ? 首先我們會(huì)疑問為什么要選擇xpath定位呢?它有什么優(yōu)勢(shì)?這是大部分的人的疑問。xpath定位在定位路徑的基礎(chǔ)上結(jié)合了id、name、class等屬性,讓定位更準(zhǔn)確。相比單個(gè)id、name、class屬性定位,xpath定位的優(yōu)勢(shì)是很明顯的。下面我們對(duì)xpath做詳細(xì)的介紹。文章中有疏漏的地方請(qǐng)多包涵。
? ? ? xpath常用符號(hào)
? ? ? ? / 表示絕對(duì)路徑絕對(duì)路徑是指從根目錄開始
// 表示相對(duì)路徑
. 表示當(dāng)前層
.. 表示上一層
* 表示通配符
@ 表示屬性
[] 屬性的判斷條件表達(dá)式
? ? ? ? xpath常用函數(shù)
contains (): xpath(‘//div[contains(@id,”widget”)]’),選擇id屬性中包含'widget'的div
text(): xpath(‘//a[text()=”hello world”]’),選擇文本值為'hello world'的節(jié)點(diǎn)
last(): 選擇最后一個(gè)
starts-with(): xpath(‘//div[starts-with(@id,”common”)]’),選擇id屬性中’common’開頭的div節(jié)點(diǎn)
not(): ??否定
?xpath絕對(duì)路徑定位
? ? 從html標(biāo)簽開始,一層一層往下寫標(biāo)簽,直到這個(gè)標(biāo)簽位置。
比如:dr.find_element_by_xpath("/html/body/div[2]/form/input")
div][2] 代表第2個(gè) div標(biāo)簽,注意,索引從1開始而不是0,此方法缺點(diǎn)顯而易見,當(dāng)頁(yè)面元素位置發(fā)生改變時(shí),都需要修改。這種定位標(biāo)簽需要一個(gè)個(gè)的找,也是比較麻煩的事情。因此,并不推薦使用。
Xpath相對(duì)路徑定位
? 相對(duì)路徑,以‘//’開頭,具體格式為 xxx.find_element_by_xpath("http://標(biāo)簽")
比如:dr.find_element_by_xpath("http://input[x]") ????#定位第x個(gè)input標(biāo)簽,[x]可以省略,默認(rèn)為第一個(gè)
相對(duì)路徑的長(zhǎng)度和開始位置并不受限制,也可以采取以下方法:
xxx.find_element_by_xpath("http://div[x]/form[x]/input[x]"), ?????[x]依然是可以省略的
xxx.find_element_by_xpath("http://*[x]/form[x]/input[x]"),? ? ? ? ?用*代替tag標(biāo)簽
??xpath標(biāo)簽屬性定位
? 標(biāo)簽屬性定位,相對(duì)比較簡(jiǎn)單,也要求屬性能夠定位到唯一元素,如果存在多個(gè)相同條件的標(biāo)簽,默認(rèn)只是第一個(gè),具體格式dr.find_element_by_xpath("http://標(biāo)簽[@屬性=‘屬性值’]")
屬性判斷條件:最常見為id,name,class等等,目前屬性的類別沒有特殊限制,只要能夠唯一標(biāo)識(shí)一個(gè)元素都是可以的
具體例子:
???dr.find_element_by_xpath("http://a[@href='/industryMall/hall/industryIndex.ht']")
dr.find_element_by_xpath("http://input[@value='確定']")
???????dr.find_element_by_xpath("http://div[@class = 'submit']/input")
當(dāng)某個(gè)屬性不足以唯一區(qū)別某一個(gè)元素時(shí),通過邏輯運(yùn)算符and去定位 ,具體例子:
?dr.find_element_by_xpath("http://input[@type='name' and @name='kw1']")
當(dāng)標(biāo)簽屬性很少,不足以唯一區(qū)別元素時(shí),但是標(biāo)簽中間中間存在唯一的文本值,也可以定位,其具體格式: ??dr.find_element_by_xpath("http://標(biāo)簽[contains(text(),'文本值')]")
具體例子:xxx.find_element_by_xpath("http://iunpt[contains(text(),'型號(hào):')]") ?
注意:盡量在html中復(fù)制此段文本,避免因?yàn)槿庋蹮o(wú)法分辨的字符導(dǎo)致定位失敗
?xpath截取文字定位
其他的屬性值如果太長(zhǎng),也可以采取截取文字方法定位,請(qǐng)看示例
屬性higy=‘https://blog.csdn.net/huiseqiutian/article/details’
dr.find_element_by_xpath(“//a[contains(@higy,‘details’)]”)
??xpath網(wǎng)頁(yè)中的動(dòng)態(tài)屬性定位
例如,在某些網(wǎng)頁(yè)中動(dòng)態(tài)生成id屬性值,可以有以下方法:
1.starts-with例子: //input[starts-with(@id,'ctrl')] ???????????解析:匹配以ctrl開始的屬性值
2.ends-with例子://input[ends-with(@id,'_userName')] ??????解析:匹配以u(píng)serName結(jié)尾的屬性值
3.contains()例子://Input[contains(@id,'userName')] ???????解析:匹配含有userName屬性值