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)槔鐖D 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()
注意:用此方法定位元素超鏈接,中文字需要寫全。
1.5 partial_link_text 定位
即用超鏈接文字的部分文本來(lái)定位元素,類似數(shù)據(jù)庫(kù)的模糊查詢。以“新聞”超鏈接為例,只需“新”一個(gè)字即可,即取超鏈接全部文本的一個(gè)子集。
代碼如下:
driver = webdriver.Firefox() # 打開(kāi)百度 driver.get('https://www.baidu.com/') # 通過(guò)partial_link_text定位,用超鏈接文字的部分文本來(lái)定位元素,類似數(shù)據(jù)庫(kù)的模糊查詢 driver.find_element(By.PARTIAL_LINK_TEXT, '新').click() # 關(guān)閉瀏覽器 driver.close()
1.6 tag_name 定位
tag_name 定位即通過(guò)標(biāo)簽名稱定位,如圖 1.6所示,定位標(biāo)簽“form”并打印標(biāo)簽屬性值“name”。
代碼如下:
driver = webdriver.Firefox() # 打開(kāi)百度 driver.get('https://www.baidu.com/') # tag_name 定位即通過(guò)標(biāo)簽名稱定位 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)簽名稱來(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ì)路徑的寫法和直接利用標(biāo)簽名稱來(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ǔ)言的縮寫,是一種用來(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)類型,便于理解 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),以此類推。如上代碼所示,name 元素節(jié)點(diǎn)的先輩節(jié)點(diǎn)有 animal 和 animalList。
• 后代節(jié)點(diǎn)。它表示某節(jié)點(diǎn)的子節(jié)點(diǎn)、子節(jié)點(diǎn)的子節(jié)點(diǎn),以此類推。如上代碼所示,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)單直觀的就是寫出元素的絕對(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)文章
Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(附件)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,附件方面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Python實(shí)現(xiàn)自動(dòng)化處理Word文檔的方法詳解
本文主要介紹了如何使用Python實(shí)現(xiàn)Word文檔的自動(dòng)化處理,包括批量生成Word文檔、在Word文檔中批量進(jìn)行查找和替換、將Word文檔批量轉(zhuǎn)換成PDF等,希望對(duì)你有所幫助2022-08-08Python實(shí)現(xiàn)批量下載文件的示例代碼
下載文件是我們?cè)谌粘9ぷ髦谐3R龅囊患虑?當(dāng)我們需要從互聯(lián)網(wǎng)上批量下載大量文件時(shí),手動(dòng)一個(gè)一個(gè)去下載顯然不夠高效,所以本文為大家介紹一下如何利用python批量下載文件吧2023-11-11Django實(shí)現(xiàn)后臺(tái)上傳并顯示圖片功能
這篇文章主要介紹了Django實(shí)現(xiàn)后臺(tái)上傳并顯示圖片功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python3.8+django2+celery5.2.7環(huán)境準(zhǔn)備(python測(cè)試開(kāi)發(fā)django)
這篇文章主要介紹了python測(cè)試開(kāi)發(fā)django之python3.8+django2+celery5.2.7環(huán)境準(zhǔn)備工作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Python Django 頁(yè)面上展示固定的頁(yè)碼數(shù)實(shí)現(xiàn)代碼
這篇文章主要介紹了Python Django 頁(yè)面上展示固定的頁(yè)碼數(shù)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08