從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實(shí)戰(zhàn)技巧
一、Selenium簡(jiǎn)介
1. 什么是Selenium
Selenium是一個(gè)用于Web應(yīng)用程序自動(dòng)化測(cè)試的工具集,支持多瀏覽器(Chrome、Firefox、Edge等)、多語(yǔ)言(Python、Java、C#等),核心功能是模擬人類操作瀏覽器(點(diǎn)擊、輸入、跳轉(zhuǎn)等)。
2. Selenium的組成
- Selenium WebDriver:核心組件,通過代碼驅(qū)動(dòng)瀏覽器,支持跨語(yǔ)言(本文以Python為例)。
- Selenium IDE:瀏覽器插件,用于錄制/回放操作(適合快速生成簡(jiǎn)單腳本)。
- Selenium Grid:用于分布式測(cè)試,可在多臺(tái)機(jī)器/瀏覽器上同時(shí)執(zhí)行用例。
3. 應(yīng)用場(chǎng)景
- 自動(dòng)化測(cè)試(功能測(cè)試、回歸測(cè)試)。
- 網(wǎng)頁(yè)數(shù)據(jù)爬?。M登錄、動(dòng)態(tài)內(nèi)容獲?。?。
- 自動(dòng)化操作(如批量填寫表單、定時(shí)任務(wù))。
二、環(huán)境搭建
1. 安裝Python
Selenium需依賴Python環(huán)境,安裝時(shí)勾選“Add Python to PATH”。
2. 安裝Selenium
打開命令行,執(zhí)行:
pip install selenium # 安裝最新版Selenium 4
3. 瀏覽器驅(qū)動(dòng)配置
WebDriver需要通過“瀏覽器驅(qū)動(dòng)”與瀏覽器通信,不同瀏覽器需對(duì)應(yīng)驅(qū)動(dòng):
| 瀏覽器 | 驅(qū)動(dòng)名稱 |
|---|---|
| Chrome | ChromeDriver |
| Firefox | GeckoDriver |
| Edge | EdgeDriver |
配置步驟:
- 下載與瀏覽器版本匹配的驅(qū)動(dòng)(如Chrome 114需對(duì)應(yīng)ChromeDriver 114.x)。
- 將驅(qū)動(dòng)文件(如
chromedriver.exe)放在任意目錄,建議放在Python安裝目錄或添加到系統(tǒng)環(huán)境變量PATH。
4. 驗(yàn)證環(huán)境
運(yùn)行以下代碼,若能打開Chrome并訪問百度,則配置成功:
三、基礎(chǔ)操作
1. 啟動(dòng)瀏覽器與訪問網(wǎng)頁(yè)
from selenium import webdriver
# 啟動(dòng)瀏覽器(Chrome/Firefox/Edge)
driver = webdriver.Chrome() # Chrome
# driver = webdriver.Firefox() # Firefox
# driver = webdriver.Edge() # Edge
# 訪問網(wǎng)頁(yè)
driver.get("https://www.baidu.com")
# 獲取當(dāng)前頁(yè)面標(biāo)題和URL
print("標(biāo)題:", driver.title) # 輸出:百度一下,你就知道
print("URL:", driver.current_url) # 輸出:https://www.baidu.com/
# 關(guān)閉瀏覽器(quit()關(guān)閉所有窗口,close()關(guān)閉當(dāng)前窗口)
driver.quit()
2. 元素定位(核心!)
Selenium提供8種元素定位方式,需結(jié)合網(wǎng)頁(yè)HTML結(jié)構(gòu)使用。推薦使用By類(Selenium 4推薦寫法)。
步驟:
- 打開網(wǎng)頁(yè),按F12打開開發(fā)者工具,通過“元素選擇器”定位元素。
- 復(fù)制元素屬性(如ID、XPath等)。
| 定位方式 | 說明 | 示例代碼 |
|---|---|---|
| ID | 通過元素id屬性定位(唯一) | driver.find_element(By.ID, "kw") |
| Name | 通過元素name屬性定位 | driver.find_element(By.NAME, "wd") |
| Class Name | 通過元素class屬性定位 | driver.find_element(By.CLASS_NAME, "s_ipt") |
| Tag Name | 通過標(biāo)簽名定位(如<input>) | driver.find_element(By.TAG_NAME, "input") |
| Link Text | 通過鏈接文本定位(精確匹配) | driver.find_element(By.LINK_TEXT, "新聞") |
| Partial Link Text | 通過鏈接文本模糊匹配 | driver.find_element(By.PARTIAL_LINK_TEXT, "新") |
| XPath | 基于XML路徑定位(萬能) | driver.find_element(By.XPATH, '//input[@id="kw"]') |
| CSS Selector | 基于CSS選擇器定位 | driver.find_element(By.CSS_SELECTOR, "#kw") |
示例:定位百度搜索框并輸入內(nèi)容
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 定位搜索框(id為"kw")
search_box = driver.find_element(By.ID, "kw")
# 輸入文本
search_box.send_keys("Selenium教程")
# 定位搜索按鈕(id為"su")并點(diǎn)擊
search_btn = driver.find_element(By.ID, "su")
search_btn.click()
time.sleep(3)
driver.quit()
XPath進(jìn)階:XPath是最靈活的定位方式,支持復(fù)雜場(chǎng)景:
- 絕對(duì)路徑:
/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input(不推薦,易變)。 - 相對(duì)路徑:
//input[@name="wd" and @class="s_ipt"](通過多屬性定位)。 - 文本定位:
//a[text()="新聞"](精確匹配文本)。 - 包含文本:
//a[contains(text(), "新")](模糊匹配)。
3. 操作元素
| 方法 | 說明 |
|---|---|
send_keys("文本") | 輸入文本 |
click() | 點(diǎn)擊元素 |
clear() | 清空輸入框內(nèi)容 |
get_attribute("屬性名") | 獲取元素屬性(如value、href) |
text | 獲取元素文本內(nèi)容 |
is_displayed() | 判斷元素是否可見 |
示例:
# 獲取搜索框的value屬性(輸入的內(nèi)容)
print(search_box.get_attribute("value")) # 輸出:Selenium教程
# 獲取百度logo的文本(實(shí)際為空,logo通常無文本)
logo = driver.find_element(By.CLASS_NAME, "index-logo-src")
print(logo.text) # 輸出:空字符串
# 判斷搜索按鈕是否可見
print(search_btn.is_displayed()) # 輸出:True
四、等待機(jī)制
網(wǎng)頁(yè)加載存在延遲(如JS渲染、網(wǎng)絡(luò)延遲),直接操作元素可能導(dǎo)致“元素未找到”錯(cuò)誤,需設(shè)置等待。
1. 隱式等待
全局等待,設(shè)置一次后對(duì)所有元素生效,等待元素加載完成(最多等待指定時(shí)間)。
driver.implicitly_wait(10) # 等待10秒(單位:秒)
2. 顯式等待
針對(duì)特定元素的等待,更靈活,需結(jié)合WebDriverWait和expected_conditions(預(yù)期條件)。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待搜索結(jié)果加載(最多10秒,每0.5秒檢查一次)
# 條件:id為"content_left"的元素可見
result = WebDriverWait(driver, 10, 0.5).until(
EC.visibility_of_element_located((By.ID, "content_left"))
)
print("搜索結(jié)果已加載")
常用預(yù)期條件:
visibility_of_element_located:元素可見。element_to_be_clickable:元素可點(diǎn)擊。text_to_be_present_in_element:元素包含指定文本。
3. 強(qiáng)制等待
直接暫停程序,不推薦(硬編碼等待時(shí)間,效率低):
import time time.sleep(3) # 強(qiáng)制等待3秒
五、瀏覽器操作
1. 窗口操作
# 設(shè)置窗口大?。ㄗ畲蠡?指定尺寸)
driver.maximize_window() # 最大化
driver.set_window_size(1200, 800) # 寬1200,高800
# 獲取窗口句柄(唯一標(biāo)識(shí))
current_window = driver.current_window_handle # 當(dāng)前窗口
all_windows = driver.window_handles # 所有窗口
# 切換窗口(如點(diǎn)擊鏈接打開新窗口后切換)
driver.find_element(By.LINK_TEXT, "新聞").click() # 打開新窗口
for window in all_windows:
if window != current_window:
driver.switch_to.window(window) # 切換到新窗口
2. 導(dǎo)航操作
driver.get("https://www.baidu.com")
driver.get("https://www.bing.com") # 訪問必應(yīng)
driver.back() # 后退到百度
driver.forward() # 前進(jìn)到必應(yīng)
driver.refresh() # 刷新頁(yè)面
3. 處理iframe
iframe是嵌套在網(wǎng)頁(yè)中的子頁(yè)面(如登錄框、廣告),需先切換到iframe才能操作內(nèi)部元素。
# 切換到iframe(通過id、name、索引或WebElement)
driver.switch_to.frame("iframe_id") # 通過id
# driver.switch_to.frame(0) # 通過索引(第1個(gè)iframe)
# 操作iframe內(nèi)的元素(如輸入用戶名)
driver.find_element(By.ID, "username").send_keys("test")
# 切回主文檔(必須!否則無法操作主頁(yè)面元素)
driver.switch_to.default_content()
六、彈窗處理
網(wǎng)頁(yè)彈窗(Alert、Confirm、Prompt)需通過switch_to.alert處理:
| 彈窗類型 | 說明 | 操作方法 |
|---|---|---|
| Alert | 只有“確定”按鈕 | alert.accept()(確認(rèn)) |
| Confirm | 有“確定”和“取消”按鈕 | alert.accept()(確認(rèn))/ alert.dismiss()(取消) |
| Prompt | 可輸入文本的彈窗 | alert.send_keys("文本") + alert.accept() |
示例:
# 觸發(fā)彈窗(假設(shè)點(diǎn)擊按鈕后彈出Confirm)
driver.find_element(By.ID, "show_confirm").click()
# 切換到彈窗
alert = driver.switch_to.alert
print("彈窗文本:", alert.text) # 獲取彈窗文本
# 取消彈窗
alert.dismiss()
七、文件操作
1. 文件上傳
通過定位<input type="file">元素,使用send_keys傳入文件路徑(無需點(diǎn)擊上傳按鈕):
# 定位上傳按鈕(必須是input標(biāo)簽)
upload_btn = driver.find_element(By.ID, "upload")
# 傳入文件絕對(duì)路徑
upload_btn.send_keys("C:/test.txt")
2. 文件下載
需配置瀏覽器默認(rèn)下載路徑(以Chrome為例):
from selenium.webdriver.chrome.options import Options
# 配置Chrome下載路徑
chrome_options = Options()
prefs = {
"download.default_directory": "C:/downloads", # 下載路徑
"download.prompt_for_download": False # 不彈出下載提示
}
chrome_options.add_experimental_option("prefs", prefs)
# 啟動(dòng)配置后的Chrome
driver = webdriver.Chrome(options=chrome_options)
# 點(diǎn)擊下載鏈接
driver.find_element(By.LINK_TEXT, "下載文件").click()
八、鍵盤與鼠標(biāo)操作
需使用ActionChains類模擬鍵盤和鼠標(biāo)動(dòng)作。
1. 鍵盤操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# 定位搜索框
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium")
# 全選(Ctrl+A)→ 復(fù)制(Ctrl+C)→ 清空 → 粘貼(Ctrl+V)
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()
search_box.clear()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()
2. 鼠標(biāo)操作
# 定位元素 element = driver.find_element(By.ID, "xxx") # 右鍵點(diǎn)擊 ActionChains(driver).context_click(element).perform() # 雙擊 ActionChains(driver).double_click(element).perform() # 拖拽(從元素A拖到元素B) source = driver.find_element(By.ID, "source") target = driver.find_element(By.ID, "target") ActionChains(driver).drag_and_drop(source, target).perform()
九、測(cè)試框架集成
Selenium常與Python測(cè)試框架(如unittest、pytest)結(jié)合,實(shí)現(xiàn)用例管理和報(bào)告生成。
1. 與unittest結(jié)合
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestBaidu(unittest.TestCase):
def setUp(self):
# 前置操作:?jiǎn)?dòng)瀏覽器
self.driver = webdriver.Chrome()
self.driver.get("https://www.baidu.com")
def test_search(self):
# 測(cè)試用例:搜索
self.driver.find_element(By.ID, "kw").send_keys("unittest")
self.driver.find_element(By.ID, "su").click()
# 斷言:頁(yè)面標(biāo)題包含"unittest"
self.assertIn("unittest", self.driver.title)
def tearDown(self):
# 后置操作:關(guān)閉瀏覽器
self.driver.quit()
if __name__ == "__main__":
unittest.main()
2. 生成測(cè)試報(bào)告
使用HTMLTestRunner生成HTML報(bào)告:
pip install html-testRunner
import HtmlTestRunner
# 運(yùn)行用例并生成報(bào)告
if __name__ == "__main__":
unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(
output="report", # 報(bào)告目錄
report_name="百度搜索測(cè)試報(bào)告"
))
十、高級(jí)技巧與最佳實(shí)踐
封裝公共方法:將常用操作(如打開網(wǎng)頁(yè)、定位元素)封裝為工具類,減少重復(fù)代碼。
class BrowserUtils:
def __init__(self, driver):
self.driver = driver
def open_url(self, url):
self.driver.get(url)
def find_element(self, by, value):
return self.driver.find_element(by, value)
處理動(dòng)態(tài)元素:動(dòng)態(tài)ID(如包含時(shí)間戳)可通過XPath模糊匹配://div[contains(@id, "dynamic_")]。
避免硬編碼:將URL、賬號(hào)密碼等配置存入config.ini,通過configparser讀取。
Selenium Grid:分布式執(zhí)行用例,需啟動(dòng)Hub和Node:
# 啟動(dòng)Hub(端口4444) java -jar selenium-server-4.xx.xx.jar hub # 啟動(dòng)Node(連接Hub) java -jar selenium-server-4.xx.xx.jar node --hub http://localhost:4444/grid/register
十一、常見問題與解決方案
| 問題 | 可能原因 | 解決方案 |
|---|---|---|
| 元素定位不到 | 元素在iframe內(nèi);未加載完成;動(dòng)態(tài)ID | 切換iframe;增加等待;使用模糊定位 |
| 瀏覽器自動(dòng)關(guān)閉 | 代碼執(zhí)行完畢;驅(qū)動(dòng)與瀏覽器版本不匹配 | 檢查代碼是否有quit();更新驅(qū)動(dòng)版本 |
| 彈窗切換失敗 | 彈窗未加載;非Alert類型彈窗 | 增加等待;通過元素定位處理非Alert彈窗 |
通過以上內(nèi)容,可系統(tǒng)掌握Selenium的核心用法。實(shí)際使用中需結(jié)合具體場(chǎng)景靈活調(diào)整,多練習(xí)元素定位和等待機(jī)制是關(guān)鍵!
到此這篇關(guān)于從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實(shí)戰(zhàn)技巧的文章就介紹到這了,更多相關(guān)Python Selenium教程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python+Selenium瀏覽器自動(dòng)化測(cè)試與網(wǎng)頁(yè)自動(dòng)登錄
- Python自動(dòng)化測(cè)試框架:unittest、pytest、Selenium、requests和Pytest-BDD
- Python使用Selenium實(shí)現(xiàn)Web自動(dòng)化的完整指南
- Python使用Selenium將網(wǎng)頁(yè)保存為圖片或PDF
- 從入門到精通解析Python Selenium如何模擬瀏覽器操作
- Python使用Selenium實(shí)現(xiàn)自動(dòng)化網(wǎng)頁(yè)批量錄入
- Python Selenium 滾動(dòng)到特定元素的幾種實(shí)現(xiàn)方法
- python中selenium安裝配置與使用示例
- Python使用Selenium檢查元素是否存在的方法
- python利用Selenium搭建免費(fèi)Web搜索API服務(wù)的方法
相關(guān)文章
Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解
開發(fā)應(yīng)用程序時(shí),若只有一個(gè)窗口則只需關(guān)心這個(gè)窗口里面的各控件之間如何傳遞數(shù)據(jù)。如果程序有多個(gè)窗口,就要關(guān)心不同的窗口之間是如何傳遞數(shù)據(jù)。本文介紹了PyQt5中三種窗口數(shù)據(jù)傳遞,需要的可以了解一下2022-12-12
Django基于Token的驗(yàn)證使用的實(shí)現(xiàn)
本文主要介紹了Django基于Token的驗(yàn)證使用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
python 借助numpy保存數(shù)據(jù)為csv格式的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 借助numpy保存數(shù)據(jù)為csv格式的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python Pygame實(shí)戰(zhàn)之打地鼠小游戲
Pygame庫(kù)是專門為了幫助做出的游戲和其他多媒體應(yīng)用Python編程語(yǔ)言的一個(gè)開放源代碼模塊。本文將利用Pygame模塊制作一個(gè)打地鼠的小游戲,快跟隨小編一起學(xué)習(xí)一下吧2022-01-01
python 30行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)偷能量
這篇文章主要介紹了python 30行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)偷能量的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-02-02
Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作
這篇文章主要介紹了Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

