selenium 通過xpath進行元素定位--By.xpath()
xpath是XML路徑語言,它可以用來確定xml文件中的元素位置,通過元素的路徑來完成對元素的查詢。HTML就是XML的一種實現方式,所以xpath是一種非常強大的定位方式。
xpath也分幾種不同型別的定位方法。
一種是絕對路徑定位。這種定位方式是利用html標籤名的層級關係來定位元素的絕對路徑,一般從<html>標籤開始依次往下進行查詢。
如百度搜索框的絕對路徑xpath定位可以是這樣的:
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")
xpath這個方法是非常強大的元素查詢方式,使用這種方法幾乎可以定位到頁面上的任意元素。
優點:基本上是萬能的
缺點:因為要遍歷所願元素的路徑,執行效率可能比較慢
定位的方法有兩種:
“/” 絕對路徑,從頁面的根元素開始
“//” 相對路徑,從頁面上的任何節點開始匹配
driver.findElement(By.xpath("//input[@id='kw']")).sendKeys("通過xpath進行定位"); //查詢頁面上id=kw的input輸入框
driver.findElement(By.xpath("//form[1]/input")) //查詢頁面上第一個form元素內的直接子input元素(即只包括form元素的下一級input元素,使用絕對路徑表示,單/號)
driver.findElement(By.xpath("//form[1]//input")) //查詢頁面上第一個form元素內的所有子input元素(只要在form元素內的input都算,不管還嵌套了多少個其他標籤,使用相對路徑表示,雙//號)
id, name, class name, tag name,
link text, partial link text, xpath, css selector
下面主要介紹一下xpath:
一、xpath基本定位用法
1.1 使用id定位 -- driver.find_element_by_xpath('//input[@id="kw"]')
1.2 使用class定位 --driver.find_element_by_xpath('//input[@class="s_ipt"]')
1.3 當然 通過常用的8種方式結合xpath均可以定位(name、tag_name、link_text、partial_link_text)以上只列舉了2種常用方式哦。
二、xpath相對路徑/絕對路徑定位
2.1 相對定位 -- 以// 開頭 如://form//input[@name="phone"]
2.2 絕對定位 -- 以/ 開頭,但是要從根目錄開始,比較繁瑣,一般不建議使用 如:/html/body/div/a
三、xpath文字、模糊、邏輯定位
3.1【文字定位】使用text()元素的text內容 如://button[text()="登入"]
3.2 【模糊定位】使用contains() 包含函式 如://button[contains(text(),"登入")]、//button[contains(@class,"btn")]除了contains不是=等於
3.3 【模糊定位】使用starts-with -- 匹配以xx開頭的屬性值;ends-with --匹配以xx結尾的屬性值 如://button[starts-with(@class,"btn")]、//input[ends-with(@class,"-special")]
3.4 使用邏輯運算子 -- and、or;如://input[@name="phone" and @datatype="m"]
四、xpath軸定位
4.1軸運算
ancestor:祖先節點包括父parent:父節點
preceding-sibling:當前元素節點標籤之前的所有兄弟節點
preceding:當前元素節點標籤之前的所有節點 following-sibling:當前元素節點標籤之後的所有兄弟節點 following:當前元素節點標籤之後的所有節點 使用語法: 軸名稱 :: 節點名稱 使用較多場景:頁面顯示為一個表格樣式的資料列 如:
注意:
#定位 找到元素 -- 做到唯一識別
#優先使用id
#捨棄:有下標的出現、有絕對定位的出現、id動態變化時捨棄
selenium提供的xpath定位方法名:
driver.find_element_by_xpath(xpath表示式)
xpath定位是將整個HTML看成一個樹形結構。HTML節點為根節點。頁面當中節點與其他節點可以有祖先、父輩、兄弟、後代這樣的關係存在,類似於我們人類的家庭關係。
xpath基本定位語法
一、絕對定位
特點:1.以單斜槓/開頭;2.從頁面根元素(HTML標籤)開始,嚴格按照元素在HTML頁面中的位置和順序向下查詢
如:
driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input")
二、相對定位
特點:1.以雙斜槓//開頭;2.不考慮元素在頁面當中的絕對路徑和位置;3.只考慮是否存在符合表示式的元素即可。
我們一般都使用相對定位來定位元素。下面來介紹下常用的相對定位表示式。
2.1使用標籤名+節點屬性定位
語法://標籤名[@屬性名=屬性值]
如:
現在要引用id為“J_password”的input元素,可以像下面這樣寫:
ele_password= driver.find_element_by_xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']")
另外一種寫法:
1 |
ele_password = driver.find_element_by_xpath( "//*[@id='J_login_form']/*/*/input[@id='J_password']" )
|
2.2.組合元素索引(下標)定位
如:
1 |
ele_password = driver.find_element_by_xpath(" / / * [@ id = 'J_login_form' ] / * / * / input [ 2 ]”)
|
2.3.通過部分屬性值匹配
語法://標籤名[contains(@屬性名,部分屬性值)]、//標籤名[starts-with(@屬性名,部分屬性值)]、//標籤名[ends-with(@屬性名,部分屬性值)]
a.starts-with 例子: //input[starts-with(@id,'ctrl')] 解析:匹配以 ctrl開始的屬性值
b.ends-with 例子://input[ends-with(@id,'_userName')] 解析:匹配以 userName 結尾的屬性值
c.contains() 例子://input[contains(@id,'userName')] 解析:匹配含有 userName 屬性值
如下:
1 |
driver.find_element_by_xpath(“ / / a[contains(@href, ‘logout’)]”)
|
1 |
driver.find_element_by_xpath(“ / / a[ends - with(@href, ‘logout’)]”)
|
1 |
driver.find_element_by_xpath(“ / / a[starts - with(text(), ‘退’)]”)
|
2.4.使用文字內容匹配
函式:text()
語法:文字全部匹配://標籤名[text()=文字內容]
文字部分匹配-包含://標籤名[contains(text(),部分文字內容)]
示例程式碼如下:
1 |
driver.find_element_by_xpath( "//a[text()," 退出 "]" ) #文字全部匹配
|
1 |
driver.find_element_by_xpath( "//a[contains(text()," 出")]) #文字部分匹配
|
2.5、使用軸定位表示式
軸運算名稱:
ancestor:祖先節點,包括父節點
parent:父節點
preceding:當前元素節點標籤之前的所有節點(HTML頁面之前的)
preceding-sibling:當前元素節點標籤之前的所有兄弟節點(同級)
following:當前元素節點標籤之後的所有節點
following-sibling:當前元素節點標籤之後的所有兄弟節點(同級)
使用語法:軸名稱::節點名稱
前後的定位與之前一致,用/隔開即可。
例如:
1 |
/ / div / / table / td / preceding::td / following - sibling::a / / [contains(text(),"課程”)]<br> #表示//div//table/td/路徑前所有節點中找到節點名稱為td的節點,向下同級下的一個兄弟節點包含文字課程
|
目前為止,已經整理了自動化測試Python+Selenium中對於web測試定位頁面元素的兩種主流,也是最好的定位方式XPATH和CSS定位方式,在我個人看來兩個方式都很不錯,效率都很高,也很容易解決日常工作中的問題,也能夠減少頁面的變動對於指令碼的維護成本,當然不同問題還需要不同的方式解決,能解決問題的方法都是好方法,希望以後的日子對於定位元素不再是難題。下面我們對這兩種定位方式大概做個對比;
XPATH定位和CSS定位很相似,XPATH功能更強大一些吧,但CSS定位方式執行速度更快,鑑於某些瀏覽器不支援CSS定位方式,並且一般在自動化測試實施過程中使用xpath定位方式要比css更普遍,所以建議大家先掌握xpath,再來看下二者在語法上有什麼區別
定位元素目標 | XPATH | CSS |
所有元素 | //* | * |
所有div元素 | //div | div |
所有div元素子元素 | //div/* | div>* |
根據ID屬性獲取元素 | //*[@id=''] | div#id |
根據class屬性獲取元素 | //*[@class=''] | div.class |
擁有某個屬性的元素 | //*[@href=''] | *[href=''] |
所有div元素的第一個子元素 | //div/*[1] | div>* :first-child |
所有擁有子元素a的div元素 | //div[a] | 無法實現 |
input的下一個兄弟元素 | //input/following-sibling::[1] | input+* |