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

