定位元素,selenium提供了8中元素定位方法:
(1)find_element_by_id() :html規定,id在html中必須是唯一的,有點類似於身份證號
(2)find_element_by_name() :html規定,name用來指定元素的名稱,有點類似於人名
(3)find_element_by_tag_name() :通過元素的簽名來定位
(4)find_element_by_class_name() :html規定,class指定元素的類名
(5)find_element_by_link_text() :專門用來定位文本鏈接
(6)find_element_by_partial_link_text() :是對link_text的一種補充,有些文字鏈接比較長,可以取一部分鏈接文字進行定位,只要這部分文字是唯一標志這個鏈接的
(7)find_element_by_css_selector()
(8)find_element_by_xpath()
==========================================================================================================
=========================================================================================================
http://www.baidu.com 首頁html源代碼
輸入框: <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
確定按鈕: <input type="submit" id="su" value="百度一下" class="bg s_btn">
上面一行鏈接:
<a href="https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>
<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>
<a href="http://map.baidu.com" name="tj_trmap" class="mnav">地圖</a>
<a href="http://v.baidu.com" name="tj_trvideo" class="mnav">視頻</a>
<a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">貼吧</a>
<a href="http://xueshu.baidu.com" name="tj_trxueshu" class="mnav">學術</a>
<a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" class="lb" onclick="return false;">登錄</a>
<a href="http://www.baidu.com/gaoji/preferences.html" name="tj_settingicon" class="pf">設置</a>
<a href="http://www.baidu.com/more/" name="tj_briicon" class="bri" style="display: block;">更多產品</a>
---------------------------------------------------------------------------------------------------------------------------------------------------
(1)id定位
find_element_by_id('kw') :輸入框
find_element_by_id('su') :'百度搜索'按鈕
(2)name定位
find_element_by_name('wd') :輸入框
(3)class_name定位
find_element_by_class_name('s_ipt') :輸入框
(4)tag_name定位
find_element_by_tag_name('input') :輸入框
(5)link_text定位
find_element_by_link_text('新聞')
find_element_by_link_text('地圖')
find_element_by_link_text('視頻')
find_element_by_link_text('貼吧')
(6)partial_link_text定位
find_element_by_partial_link_text('新')
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(7)XPath定位
(一)、絕對路徑
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input").send_keys('中國')
注意:我先找最后一個span的路徑,再加上input的,直接在最后的input上面復制不了路徑
(二)、利用元素屬性定位: 輸入框: <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
確定按鈕: <input type="submit" id="su" value="百度一下" class="bg s_btn">
driver.find_element_by_xpath("//input[@id='kw']") 輸入框
driver.find_element_by_xpath("//input[@id='su']") 搜索確定按鈕
//input表示當前頁面某個input標簽;
id='kw'表示這個元素的id值是kw;
--------------------------------------------
也可以通過name和class來定位:
driver.find_element_by_xpath("//*[@name='kw']") 輸入框
driver.find_element_by_xpath("//*[@class='s_ipt']") 輸入框
如果不想指定標簽名,也可以用*號代替,當然,XPath不局限於id、name、class這3個屬性值,元素的任意屬性都可以使用,只要其能標志唯一的一個元素;
driver.find_element_by_xpath("//input[@maxlength='255']") 輸入框
driver.find_element_by_xpath("//input[@autocomplete='off']") 輸入框
driver.find_element_by_xpath("//input[@type='submit']") 搜索確定按鈕
(三)、層級與屬性結合
如果一個元素本身沒有可以唯一標識這個元素的屬性值,那么我們可以查找其上一級元素。如果上一級元素可以唯一標識,則可以拿來用。
加上百度輸入框沒有可以利用的屬性值,那么可以查找它的上一級屬性:
driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('中國') 輸入框
driver.find_element_by_xpath("//span[@class='bg s_btn_wr']/input").click() 搜索確定按鈕
注意:此種方法有問題注,使用該路徑查詢提示找不到(原因未知)
如果父元素也沒有利用價值,那么可以繼續向上查找父元素的父元素:
driver.find_element_by_xpath("//form[@id='form']/span[1]/input").send_keys('中國') 輸入框
driver.find_element_by_xpath("//form[@id='form']/span[2]/input").click() 搜索確定按鈕
(四)、使用邏輯運算符
如果一個屬性不能唯一確定一個元素,那么可以用邏輯運算符連接多個屬性來查找:
driver.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']").send_keys('中國') 輸入框
driver.find_element_by_xpath("//input[@id='su' and @type='submit']").click() 搜索確定按鈕
(五)、使用contains方法
contains方法用於匹配一個屬性中包含的字符串:
driver.find_element_by_xpath("//span[contains(@class,'s_ipt_wr')]/input").send_keys('中國') 輸入框
driver.find_element_by_xpath("//input[contains(@id,'su')]").click() 搜索確定按鈕
(六)、使用text()方法
text()方法,用於匹配顯示的文本信息,類似實現了link_text定位
driver.find_element_by_xpath("//a[text(),'新聞']")
driver.find_element_by_xpath("//a[contains(text(),'新聞')]") #兩個配合使用
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
選擇器 示例 示例說明
.class .intro 選擇所有class="intro"的元素
#id #firstname 選擇所有id="firstname"的元素
* * 選擇所有元素
element p 選擇所有<p>元素
element,element div,p 選擇所有<div>元素和<p>元素
element element div p 選擇<div>元素內的所有<p>元素
element>element div>p 選擇所有父級是 <div> 元素的 <p> 元素
element+element div+p 選擇所有緊接着<div>元素之后的<p>元素
[attribute] [target] 選擇所有帶有target屬性元素
[attribute=value] [target=-blank] 選擇所有使用target="-blank"的元素
(8)CSS定位
(一)、通過class定位
點( . )號表示通過class來定位元素
driver.find_element_by_css_selector(".s_ipt").send_keys('中國') 輸入框
driver.find_element_by_css_selector(".bg.s_btn").click() 搜索確定按鈕
注:bg s_btn中間的空格用 . 代替
注:class='bg s_ipt_wr quickdelete-wrap',類似這種叫復合class,由多個類選擇器組成,
定位的寫法則是: .bg.s_ipt_wr.quickdelete-wrap,所有空格用.(點)代替
(二)、通過id定位
driver.find_element_by_css_selector("#kw").send_keys('中國') 輸入框
driver.find_element_by_css_selector("#su").click() 搜索確定按鈕
(三)、通過標簽名定位
在CSS中,用標簽名定位元素時,不需要任何標識符號,直接使用標簽名即可
driver.find_element_by_css_selector("input[name=wd]").send_keys('中國') 輸入框
driver.find_element_by_css_selector("input[id=su]").click() 搜索確定按鈕
(四)、通過屬性定位
CSS中可以使用元素的任意屬性定位,只要這些屬性可以唯一標識這個元素;
對屬性值來說,可以加引號,也可以不加,但是要注意和整個字符的引號進行取費。
driver.find_element_by_css_selector("[autocomplete=off]").send_keys('中國') 輸入框
driver.find_element_by_css_selector("[name='wd']").send_keys('中國') 輸入框
driver.find_element_by_css_selector('[type="submit"]').click() 搜索確定按鈕
(五)、通過標簽層級關系定位
driver.find_element_by_css_selector("span > input#kw").send_keys('中國')
driver.find_element_by_css_selector('span > input#su').click()
(六)、組合定位
driver.find_element_by_css_selector("form.fm > span > input.s_ipt").send_keys('中國')
driver.find_element_by_css_selector("form#form > span > input#kw").send_keys('中國')
(七)、更多定位用法
==============================================================================================================
有時候我們定位不到元素可能的原因:
1.檢查搜索對象是否忘記打引號;
2.Frame/Iframe原因定位不到元素;
3.Xpath描述錯誤原因: 解決辦法:編寫好Xpath路徑,chrome的F12->html,ctrl+F進行查找,看是否能查找到。
4.頁面還沒有加載出來,就對頁面上的元素進行的操作: 解決辦法:導入time模塊設置等待時間。
5.動態id定位不到元素: 解決辦法:如果是動態的id,最好不要使用,轉而使用xpath或其它方式定位
6.二次定位,如彈出框登錄: 解決辦法:先定位到彈出框,再定位到彈出框內的元素。
7.不可見元素定位:
[emoji:00a0] [emoji:00a0] [emoji:00a0]如上百度登錄代碼,通過名稱為tj_login查找的登錄元素,有些是不可見的,
所以加一個循環判斷,找到可見元素(is_displayed())點擊登錄即可。
8.瀏覽器兼容問題,比如SPACE空格操作Firefox就識別不了,而Chrome就能夠識別做出響應。
9.頁面刷新或者后退后找不到元素
頁面刷新或者后退后,不能直接采用之前定位的元素進行操作,需要重新定位再進行操作。