Selenium常見八大定位法總結(jié)
1.1 ID定位
HTML Tag 的 id 屬性值是唯一的,故不存在根據(jù) id 定位多個元素的情況。下面以在百度首頁搜索框輸入文本“python”為例。搜索框的 id 屬性值為“kw”,如圖1.1所示:

代碼如下,“find_element_by_id”方法已廢棄,使用find_element(By.ID, 'kw')
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
# 需要將瀏覽器驅(qū)動添加到環(huán)境變量中
# 打開百度
driver.get('https://www.baidu.com/')
# 通過id,在搜索輸入框中輸入文本“python”
driver.find_element(By.ID, 'kw').send_keys('python')
# 點擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()1.2 name 定位
以上百度搜索框也可以用 name 來實現(xiàn),如圖 1.1 所示,其 name 屬性值為“wd”,方法“find_element(By.NAME, 'wd')”表示通過 name 來定位
代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# 通過name,在搜索輸入框中輸入文本“自動化測試”
driver.find_element(By.NAME, 'wd').send_keys('自動化測試')
# 點擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()注意:用 name 方式定位需要保證 name 值唯一,否則定位失敗。
1.3 class 定位
以百度首頁搜索框為例,如圖 1.1所示,其 class 屬性值為“s_ipt”,“By.CLASS_NAME, 's_ipt'”表示通過 class_name 來定位
代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# 通過class,在搜索輸入框中輸入文本“web測試”
driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('web測試')
# 點擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()1.4 link_text 定位
link_text 是以超鏈接全部名字作為關(guān)鍵字來定位元素的。以百度首頁“新聞”超鏈接為例,如圖 1.2 所示,關(guān)鍵字為“新聞”。

代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# 通過link_text定位,點擊‘新聞'超鏈接
driver.find_element(By.LINK_TEXT, '新聞').click()
# 關(guān)閉瀏覽器
driver.close()注意:用此方法定位元素超鏈接,中文字需要寫全。
1.5 partial_link_text 定位
即用超鏈接文字的部分文本來定位元素,類似數(shù)據(jù)庫的模糊查詢。以“新聞”超鏈接為例,只需“新”一個字即可,即取超鏈接全部文本的一個子集。
代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# 通過partial_link_text定位,用超鏈接文字的部分文本來定位元素,類似數(shù)據(jù)庫的模糊查詢
driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()
# 關(guān)閉瀏覽器
driver.close()1.6 tag_name 定位
tag_name 定位即通過標(biāo)簽名稱定位,如圖 1.6所示,定位標(biāo)簽“form”并打印標(biāo)簽屬性值“name”。

代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# tag_name 定位即通過標(biāo)簽名稱定位
print(driver.find_element(By.TAG_NAME, 'form').get_attribute('name'))成功后控制臺輸出“f”:

1.7 CSS 定位
CSS 定位的優(yōu)點是速度快、語法簡潔。表 1.1 中的內(nèi)容出自 W3School 的 CSS 參考手冊。CSS 定位的選擇器有十幾種,在本節(jié)中主要介紹幾種比較常用的選擇器。


仍以百度搜索框為例,代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# 以class選擇器為例,實現(xiàn)CSS定位,在搜索框輸入“python3”
driver.find_element(By.CSS_SELECTOR, '.s_ipt').send_keys('python3')
# 以id定位語法結(jié)構(gòu)為:#加 id 名,實現(xiàn)CSS定位,在搜索框輸入“python3”
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('python3')
# CSS 定位主要利用屬性 class 和 id 進(jìn)行元素定位。也可以利用常規(guī)的標(biāo)簽名稱來定位,如輸入框標(biāo)簽“input”,在標(biāo)簽內(nèi)部又設(shè)置了屬性值為“name='wd'”
driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3')
# CSS 定位方式可以使用元素在頁面布局中的絕對路徑來實現(xiàn)元素定位。百度首頁搜索輸入框元素的絕對路
# 徑為“html>body>div>div>div>div>div>form>span>input[name="wd"]”
driver.find_element(By.CSS_SELECTOR, 'html>body>div>div>div>div>div>form>span>input[name="wd"]').send_keys('python3')
# CSS 定位也可以使用元素在頁面布局中的相對路徑來實現(xiàn)元素定位。相對路徑的寫法和直接利用標(biāo)簽名稱來定位,兩者
# 的代碼實現(xiàn)的功能是一致的
driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3')
# 點擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()1.8 XPath 定位
通過 XPath 來定位元素的方式,對比較難以定位的元素來說很有效,幾乎都可以解決,特別是對于有些元素沒有 id、name 等屬性的情況。
XPath 是 XML Path 語言的縮寫,是一種用來確定 XML 文檔中某部分位置的語言。它在 XML 文檔中通過元素名和屬性進(jìn)行搜索,主要用途是在 XML 文檔中尋找節(jié)點。XPath定位比 CSS 定位有更大的靈活性。XPath 可以向前搜索也可以向后搜索,而 CSS 定位只能向前搜索,但是 XPath 定位的速度比 CSS 慢一些。
XPath 語言包含根節(jié)點、元素、屬性、文本、處理指令、命名空間等。以下文本為 XML實例文檔,用于演示 XML 的各種節(jié)點類型,便于理解 XPath。
<?xml version = "1.0" encoding = "utf-8" ?> <!-- 這是一個注釋節(jié)點 --> <animalList type="mammal"> <animal categoruy = "forest"> <name>Tiger</name> <size>big</size> <action>run</action> </animal> </animalList>
其中<animalList>為文檔節(jié)點,也是根節(jié)點;<name>為元素節(jié)點;type=“mammal”為屬性節(jié)點。
節(jié)點之間的關(guān)系:
• 父節(jié)點。每個元素都有一個父節(jié)點,如上面的 XML 示例中,animal 元素是 name、size,以及 action 元素的父節(jié)點。
• 子節(jié)點。與父節(jié)點相反,這里不再贅述。
• 兄弟節(jié)點,有些也叫同胞節(jié)點。它表示擁有相同父節(jié)點的節(jié)點。如上代碼所示,name、size 和 action 元素都是同胞節(jié)點。
• 先輩節(jié)點。它是指某節(jié)點的父節(jié)點,或者父節(jié)點的父節(jié)點,以此類推。如上代碼所示,name 元素節(jié)點的先輩節(jié)點有 animal 和 animalList。
• 后代節(jié)點。它表示某節(jié)點的子節(jié)點、子節(jié)點的子節(jié)點,以此類推。如上代碼所示,animalList 元素節(jié)點的后代節(jié)點有 animal、name 等。
仍以百度搜索框為例,代碼如下:
driver = webdriver.Firefox()
# 打開百度
driver.get('https://www.baidu.com/')
# XPath 有多種定位策略,最簡單直觀的就是寫出元素的絕對路徑。
driver.find_element(By.XPATH, '/html/body/div/div/div/div/div/form/span/input').send_keys('python3')
# XPath還可以使用元素的屬性值來定位。//input 表示當(dāng)前頁面某個 input 標(biāo)簽,[@id='kw'] 表示這個元素的 id 值是 kw。
driver.find_element(By.XPATH, "http://input[@id='kw']").send_keys('python3')
# 如果一個元素本身沒有可以唯一標(biāo)識這個元素的屬性值,我們可以查找其上一級元素。
# form[@class='fm has-soutu']通過 class 定位到父元素,后面的/span/input 表示父元素下面的子元素。
driver.find_element(By.XPATH, "http://form[@class='fm has-soutu']/span/input").send_keys('python3')
# 如果一個屬性不能唯一區(qū)分一個元素,那么我們可以使用邏輯運算符連接多個屬性來查找元素
driver.find_element(By.XPATH, "http://input[@id='kw' and @class='s_ipt']").send_keys('python3')
# 點擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()本章主要介紹了 Selenium 元素的八大定位,每一種定位方式都有其特殊的用法,讀者只要掌握其特殊性即可。需要在項目中多用多想、總結(jié)經(jīng)驗,時間久了會對這些定位方式有更深的理解。
總結(jié)
到此這篇關(guān)于Selenium常見八大定位法總結(jié)的文章就介紹到這了,更多相關(guān)Selenium定位法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch中with?torch.no_grad():的用法實例
最近在看別人寫的代碼,遇到經(jīng)常使用with torch.no_grad(),所以下面這篇文章主要給大家介紹了關(guān)于pytorch中with?torch.no_grad():用法的相關(guān)資料,需要的朋友可以參考下2022-03-03
Python編程在flask中模擬進(jìn)行Restful的CRUD操作
今天小編就為大家分享一篇關(guān)于Python編程在flask中模擬進(jìn)行Restful的CRUD操作,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

