python+selenium元素定位——8種方法


定位元素,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&amp;tpl=mn&amp;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.頁面刷新或者后退后找不到元素

頁面刷新或者后退后,不能直接采用之前定位的元素進行操作,需要重新定位再進行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM