Selenium常見(jiàn)八大定位法總結(jié)
1.1 ID定位
HTML Tag 的 id 屬性值是唯一的,故不存在根據(jù) id 定位多個(gè)元素的情況。下面以在百度首頁(yè)搜索框輸入文本“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ū)動(dòng)添加到環(huán)境變量中
# 打開(kāi)百度
driver.get('https://www.baidu.com/')
# 通過(guò)id,在搜索輸入框中輸入文本“python”
driver.find_element(By.ID, 'kw').send_keys('python')
# 點(diǎn)擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()1.2 name 定位
以上百度搜索框也可以用 name 來(lái)實(shí)現(xiàn),如圖 1.1 所示,其 name 屬性值為“wd”,方法“find_element(By.NAME, 'wd')”表示通過(guò) name 來(lái)定位
代碼如下:
driver = webdriver.Firefox()
# 打開(kāi)百度
driver.get('https://www.baidu.com/')
# 通過(guò)name,在搜索輸入框中輸入文本“自動(dòng)化測(cè)試”
driver.find_element(By.NAME, 'wd').send_keys('自動(dòng)化測(cè)試')
# 點(diǎn)擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()注意:用 name 方式定位需要保證 name 值唯一,否則定位失敗。
1.3 class 定位
以百度首頁(yè)搜索框?yàn)槔?,如圖 1.1所示,其 class 屬性值為“s_ipt”,“By.CLASS_NAME, 's_ipt'”表示通過(guò) class_name 來(lái)定位
代碼如下:
driver = webdriver.Firefox()
# 打開(kāi)百度
driver.get('https://www.baidu.com/')
# 通過(guò)class,在搜索輸入框中輸入文本“web測(cè)試”
driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('web測(cè)試')
# 點(diǎn)擊搜索
driver.find_element(By.ID, 'su').click()
# 關(guān)閉瀏覽器
driver.close()1.4 link_text 定位
link_text 是以超鏈接全部名字作為關(guān)鍵字來(lái)定位元素的。以百度首頁(yè)“新聞”超鏈接為例,如圖 1.2 所示,關(guān)鍵字為“新聞”。

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

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

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


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

