一、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")
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")
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")
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")
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")
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則是模糊定位