在使用selenium webdriver進行元素定位時,有8種基本元素定位方法(注意:並不是只有8種,總共來講,有16種)。
分別介紹以下:
1.name定位
(注意:必須確保name屬性值在當前html頁面中是惟一的)
頁面源碼以下:
"<button name="btnK">Google Search</button>"
當咱們要用name屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_name('btnK').click()
2.id定位
(注意:必須確保id屬性值在當前html頁面中是惟一的)
頁面源碼以下:
"<button id="gbqfba">Google Search</button>"
當咱們要用id屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_id('gbqfba').click()
3.tagNamed定位
(注意:必須確保標籤在當前html頁面中是惟一的,標籤名在html頁面中通常不惟一,因此定位單個元素時不多用,定位一組元素時用)
頁面源碼以下:
"<button>Google Search</button>"
當咱們要用tagName屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_tag_name('button').click()
4.className定位
(注意:必須確保className屬性值在當前html頁面中是惟一的)
一:class屬性值只有一個
頁面源碼以下:
"<button class="gbqfba">Google Search</button>"
當咱們要用className屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_class_name('gbqfba').click()
二:class屬性值存在多個
注意:使用className來進行元素定位時,有時會碰到一個元素指定了若干個class屬性值的「複合樣式」的狀況
頁面源碼以下:
<button class ="btn btn_big btn_submit">登陸</button>
這個元素的class有三個不一樣的值,咱們只須要選擇其中一個值就行了,代碼以下:
driver.find_element_by_class_name('btn_submit').click()
5.linkText定位
頁面源碼以下:
<a href="/intl/en/about.html">個人名字叫作Kevin</a>
當咱們要用linkText屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_link_text('個人名字叫作Kevin').click()
6.partialLinkText定位
(注意:這個方法是上一個方法的擴展。當你不能準確知道超連接上的文本信息或者只想經過一些關鍵字進行匹配時,可使用這個方法來經過部分連接文字進行匹配。)
頁面源碼以下:
<a href="/intl/en/about.html">個人名字叫作Kevin</a>
當咱們要用linkText屬性來定位這個按鈕元素並點擊它時,代碼以下:
driver.find_element_by_partial_link_text('Kevin').click()
7.xpath定位
(這個方法是很是強大的元素查找方式,使用這種方法幾乎能夠定位到頁面上的任意元素。)
查找頁面根元素: //
查找頁面上全部的input標籤的元素: //input
代碼:driver.find_elements_by_xpath('//input[1]') #注意:加個s表明定位多個元素
查找頁面上第一個input標籤的元素: //input[1]
代碼:driver.find_element_by_xpath('//input[1]')
查找頁面上標籤爲form且id爲loginForm元素: //form[@id="loginForm"]
代碼:driver.find_element_by_xpath('//form[@id="loginForm"]')
查找頁面上具備name屬性爲username的input標籤的元素: //input[@name="username"]
代碼:driver.find_element_by_xpath('//input[@name="username"]')
查找頁面上id爲loginForm的form元素下的第一個input元素: //form[@id="loginForm"]/input[1]
代碼:driver.find_element_by_xpath('//form[@id="loginForm"]/input[1]')
查找頁面具備name屬性爲contiune而且type屬性爲button的input元素: //input[@name="continue" and @type="button"]
代碼:driver.find_element_by_xpath('///input[@name="continue" and @type="button"]')
查找頁面上id爲loginForm的form元素下第4個input元素: //form[@id="loginForm"]/input[4]
代碼:driver.find_element_by_xpath('//form[@id="loginForm"]/input[4]')
前面講的都是xpath中基於準確元素屬性的定位,其實xpath做爲定位神器也能夠用於模糊匹配。
1.用contains關鍵字,定位代碼以下:
driver.find_element_by_xpath("//a[contains(@href,‘logout’)]")
2.用start-with關鍵字,定位代碼以下:
driver.find_element_by_xpath("//a[starts-with(@rel,"nofo")]");
3.用Text關鍵字,定位代碼以下:
driver.find_element_by_xpath('//*[text()="退出"]');
4.用ends-with關鍵字,定位代碼以下
driver.find_element_by_xpath("//a[ends-with(@rel,"nofo")]");
8.css定位
css定位元素方式跟xpath比較相似,但執行速度較快,並且各類瀏覽器對它的支持都至關到位,因此功能也是蠻強大的。
下面是一些常見的cssSelector的定位方式:
定位id爲flrs的div元素能夠寫成:#flrs 注:至關於xpath語法的//div[@id=’flrs’]
定位id爲flrs下的a元素,能夠寫成 #flrs>a 注:至關於xpath語法的//div[@id=’flrs’]/a
定位id爲flrs下的href屬性值爲 /forexample/about.html的元素,能夠寫成: # flrs > a[href=」/forexample/about.html」]
若是須要指定多個屬性值時,能夠逐一加在後面,如 #flrs>input[name=」username」][type=」text」]
最後再總結一下,各類方式在選擇的時候應該怎麼選擇:
1.當頁面元素有id屬性時,儘可能用id來定位。
2.xpath是屠龍刀,css是倚天劍,雙劍合璧,才能夠天下無敵,因此最好把這兩種定位方式都掌握。
3.不少人說xpath定位比css慢,但我的感受速度上沒什麼區別,多是0.01和0.1的區別吧。