2、常用的8種元素定位方法


一、web頁面元素定位工具介紹

1、打開google瀏覽器,按F12進入開發者模式,如下圖:

2、用鼠標點擊下圖紅色框中的箭頭——然后鼠標移動到web頁面的元素上(此處為百度框),會自動定位到對應的html代碼,如下圖:

 

二、web頁面元素的8種定位方法:

1、通過元素的id屬性來定位元素——id是唯一標識(每個id都是不一樣的)

     driver.find_element_by_id("kw")

 

 

1 from selenium import webdriver
2 driver=webdriver.Chrome()
3 driver.get("https://www.baidu.com/")
4 
5 # 通過元素的id屬性來定位——id是唯一的
6 search=driver.find_element_by_id("kw")
7 
8 search.send_keys("selenium")
id.py

 

2、通過元素的name屬性來定位元素,name屬性不是絕對唯一的(一個頁面內可能存在多個元素的name屬性是相同的)

     如果name屬性的值wd是唯一的,用find_element_by_name定位元素,返回值是一個值
     driver.find_element_by_name("wd")

     如果name屬性的值wd不是唯一的,用find_elements_by_name定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
     driver.find_elements_by_name("wd") 

 1 from selenium import webdriver
 2 driver=webdriver.Chrome()
 3 driver.get("https://www.baidu.com/")
 4 
 5 #通過元素的name屬性來定位元素,name屬性不是絕對唯一的(一個頁面內可能存在多個元素的name屬性是相同的)
 6 
 7 # 如果name屬性的值kw是唯一的,用find_element_by_name定位元素,返回值是一個值
 8 search=driver.find_element_by_name("wd")
 9 
10 # 如果name屬性的值kw不是唯一的,用find_elements_by_name定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
11 search=driver.find_elements_by_name("wd")
12 
13 
14 search.send_keys("python")
name.py

 

3、通過元素的class屬性來定位元素,class屬性不是絕對唯一的(一個頁面內可能存在多個元素的class屬性是相同的)

      如果class屬性的值s_ipt是唯一的,用find_element_by_class_name定位元素,返回值是一個值

      driver.find_element_by_class_name("s_ipt")

      如果class屬性的值s_ipt不是唯一的,用find_elements_by_class_name定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
      driver.find_elements_by_class_name("s_ipt")

 1 from selenium import webdriver
 2 driver=webdriver.Chrome()
 3 driver.get("https://www.baidu.com/")
 4 
 5 #通過元素的class屬性來定位元素,class屬性不是絕對唯一的(一個頁面內可能存在多個元素的class屬性是相同的)
 6 
 7 # 如果class屬性的值s_ipt是唯一的,用find_element_by_class定位元素,返回值是一個值
 8 search=driver.find_element_by_class_name("s_ipt")
 9 
10 # 如果class屬性的值s_ipt不是唯一的,用find_elements_by_class定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
11 search=driver.find_elements_by_class_name("s_ipt")
12 
13 
14 search.send_keys("java")
class.py

 

4、通過元素的標簽名tag來定位元素,標簽名不是絕對唯一的(一個頁面內可能存在多個相同的標簽名)

     如果標簽名是唯一的,用find_element_by_tag_name定位元素,返回值是一個值
     driver.find_element_by_tag_name("input")

 

     如果標簽名不是唯一的,用find_elements_by_tag_name定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
     driver.find_elements_by_tag_name("input")

     要找的元素是第8個input標簽,所以通過列表查找時下標是7

      search2[7].send_keys("java")

 

 

備注:上圖找到的是15個標簽,不是13個

 1 from selenium import webdriver
 2 driver=webdriver.Chrome()
 3 driver.get("https://www.baidu.com/")
 4 
 5 #通過元素的標簽名來定位元素,標簽名不是絕對唯一的(一個頁面內可能存在多個相同的標簽名)
 6 
 7 # 如果標簽名是唯一的,用find_element_by_tag_name定位元素,返回值是一個值
 8 #search=driver.find_element_by_tag_name("input")
 9 
10 # 如果標簽名不是唯一的,用find_elements_by_tag_name定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
11 search2=driver.find_elements_by_tag_name("input")
12 
13 #打印出15個元素
14 print(search2)
15 
16 #要找的元素是第8個input標簽,所以通過列表查找時下標是7
17 search2[7].send_keys("java")
input

 5&6、通過鏈接元素的文本內容來精確匹配和模糊匹配定位元素,不是絕對唯一的(一個頁面內可能存在多個鏈接元素的文本內容是相同的)

      1、精確匹配——文本內容為“新聞”

            如果文本內容時唯一的,用find_element_by_link_text定位元素,返回值是一個值
            driver.find_element_by_link_text("新聞")

           如果文本內容不是唯一的,用elements_by_link_text定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
           driver.find_elements_by_link_text("新聞")

 

       2、模糊匹配——通過文本內容的部分內容,例如“hao123”,通過“hao”定位

            如果文本內容時唯一的,用find_element_by_partial_link_text定位元素,返回值是一個值
            driver.find_element_by_partial_link_text("hao123")

            如果文本內容不是唯一的,用find_elements_by_partial_link_text定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表

            driver.find_elements_by_partial_link_text("hao123")

 

 1 # 1、精確匹配——文本內容為“新聞”
 2 # 如果文本內容時唯一的,用find_element_by_link_text定位元素,返回值是一個值
 3 search=driver.find_element_by_link_text("新聞")
 4 
 5 # 如果文本內容不是唯一的,用elements_by_link_text定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
 6 search=driver.find_elements_by_link_text("新聞")
 7 
 8 search.click()
 9 
10 # 2、模糊匹配——通過文本內容的部分內容,例如“hao123”,通過“hao”定位
11 # 如果文本內容時唯一的,用find_element_by_partial_link_text定位元素,返回值是一個值
12 aa=driver.find_element_by_partial_link_text("hao123")
13 
14 # 如果文本內容不是唯一的,用find_elements_by_partial_link_text定位元素,返回符合條件的多個值,保存在列表中,即返回的是列表
15 
16 aa=driver.find_elements_by_partial_link_text("hao123")
linktext

 7、通過Xpath定位

      1、絕對路徑定位方法如下圖:

        find_element_by_xpath("/html/body/div[2]/div/form/div/input")——以/開頭,從根目錄逐級查找(父子關系),這種方式太依賴元素的位置和順序,稍微調整就會找不到,后期維護成本太高,所以一般不會用絕對定位

           

       2、相對定位——以//開頭,在整個頁面中尋找符合定位表達式的元素,不在乎元素的順序和位置

          

        單屬性定位: //標簽名[@屬性名稱=值]

         

         如果單屬性定位不到,就需要組合屬性定位://標簽名[@屬性名稱=值 and @屬性名稱=值 and @屬性名稱=值]

         

         如果頁面存在2個一模一樣的元素,只是位置不同,定位方式如下圖:從父類開始找,父類還不能唯一確定,繼續從父類的父類就找

         

   另外的方式:通過父類去找:  

  

 

 

 xpath模糊匹配:

 

 

a. 用contains關鍵字,尋找頁面中href屬性值包含有logout這個單詞的所有a元素,由於這個退出按鈕的href屬性里肯定會包含logout,所以這種方式是可行的,也會經常用到。其中@后面可以跟該元素任意的屬性名,定位代碼如下:

driver.find_element_by_xpath("//a[contains(@href, ‘logout’)]")

這句話的意思是

b. 用start-with:尋找rel屬性以nofo開頭的a元素。其中@后面的rel可以替換成元素的任意其他屬性,定位代碼如下

driver.find_element_by_xpath(("//a[starts-with(@rel, ‘nofo’)]")

c. 用Text關鍵字,尋找包含“退出”文本的所有a元素,定位代碼如下:

driver.find_element_by_xpath("//a[contains(text(), ’退出’)]")

3.XPath 關於網頁中的動態屬性的定位,例如,ASP.NET 應用程序中動態生成 id 屬性值,可以有以下三種方法:

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 屬性值

G.xpath文本精准定位

//a[text()='新聞']   #精准定位到本文屬性,contains則是模糊定位


免責聲明!

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



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