Python+Selenium瀏覽器自動化測試與網(wǎng)頁自動登錄
引言
在日常開發(fā)、測試和辦公自動化中,我們經(jīng)常會遇到一些重復(fù)性的瀏覽器操作,例如打開網(wǎng)頁、輸入賬號密碼、點擊登錄按鈕、檢查頁面是否加載成功、保存截圖、批量處理后臺數(shù)據(jù)等。
如果這些操作每天都要重復(fù)執(zhí)行,手動處理不僅浪費時間,還容易因為漏點、輸錯、忘記截圖而出錯。Python 的 selenium 庫可以幫助我們自動控制瀏覽器,完成網(wǎng)頁自動化測試和網(wǎng)頁自動登錄等任務(wù)。
本文面向 Python 自動化測試初學(xué)者,通過一個完整案例講解如何使用 Selenium 自動打開網(wǎng)頁、輸入用戶名密碼、點擊按鈕、等待頁面元素加載,并自動截圖保存。
一、Selenium 庫介紹
Selenium 是一個常用的瀏覽器自動化測試工具,可以模擬真實用戶在瀏覽器中的操作,例如:
- 打開網(wǎng)頁
- 查找頁面元素
- 輸入文本
- 點擊按鈕
- 切換窗口
- 等待元素加載
- 獲取頁面內(nèi)容
- 截圖保存
- 執(zhí)行 JavaScript
- 驗證頁面結(jié)果
Selenium 支持多種瀏覽器,包括:
- Chrome
- Edge
- Firefox
- Safari
在 Python 中使用 Selenium,可以編寫自動化測試腳本,也可以完成一些辦公自動化任務(wù),例如后臺系統(tǒng)自動登錄、自動導(dǎo)出報表、自動截圖留檔、自動巡檢頁面狀態(tài)等。
安裝 Selenium:
pip install selenium
查看版本:
python -c "import selenium; print(selenium.__version__)"
二、ChromeDriver 安裝配置
Selenium 需要通過瀏覽器驅(qū)動來控制瀏覽器。控制 Chrome 瀏覽器時,常用的是 ChromeDriver。
1. Selenium 4 的自動驅(qū)動管理
如果你使用的是 Selenium 4.6 及以上版本,Selenium Manager 通??梢宰詣庸芾頌g覽器驅(qū)動。很多情況下,你只需要安裝 Selenium,然后直接運行:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
Selenium 會嘗試自動找到本機 Chrome,并匹配合適的驅(qū)動。
2. 手動安裝 ChromeDriver
如果自動管理失敗,可以手動安裝 ChromeDriver。
步驟如下:
- 打開 Chrome 瀏覽器
- 在地址欄輸入
chrome://version/ - 查看 Chrome 主版本號
- 下載對應(yīng)版本的 ChromeDriver
- 將
chromedriver.exe放到一個固定目錄 - 將該目錄加入系統(tǒng)環(huán)境變量
Path
例如 Windows 中可以放到:
C:\WebDriver\chromedriver.exe
并把:
C:\WebDriver
加入環(huán)境變量 Path。
配置完成后,在命令行輸入:
chromedriver --version
如果能看到版本號,說明配置成功。
3. 指定 ChromeDriver 路徑
如果不想配置環(huán)境變量,也可以在代碼中指定驅(qū)動路徑:
from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service(r"C:\WebDriver\chromedriver.exe") driver = webdriver.Chrome(service=service)
對初學(xué)者來說,建議優(yōu)先使用 Selenium 4 的自動驅(qū)動管理;如果失敗,再手動配置 ChromeDriver。
三、自動打開網(wǎng)頁
Selenium 打開網(wǎng)頁的基本代碼如下:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
常用窗口操作:
driver.maximize_window() driver.set_window_size(1280, 800)
獲取網(wǎng)頁標(biāo)題:
print(driver.title)
獲取當(dāng)前地址:
print(driver.current_url)
關(guān)閉瀏覽器:
driver.quit()
注意:建議使用 driver.quit() 關(guān)閉整個瀏覽器進程,而不是只用 driver.close() 關(guān)閉當(dāng)前標(biāo)簽頁。
四、元素定位方法
網(wǎng)頁自動化的核心是“找到元素,然后操作元素”。Selenium 提供了多種元素定位方式。
需要先導(dǎo)入:
from selenium.webdriver.common.by import By
常見定位方式如下:
1. 通過 ID 定位
username_input = driver.find_element(By.ID, "username")
適合頁面元素有唯一 id 的情況。
2. 通過 name 定位
password_input = driver.find_element(By.NAME, "password")
表單輸入框經(jīng)常會有 name 屬性。
3. 通過 class name 定位
button = driver.find_element(By.CLASS_NAME, "login-btn")
注意:CLASS_NAME 只能寫單個 class,不能寫多個 class 組合。
4. 通過 CSS Selector 定位
login_button = driver.find_element(By.CSS_SELECTOR, "button.login-btn")
CSS Selector 非常靈活,是實際項目中最常用的方式之一。
例如:
driver.find_element(By.CSS_SELECTOR, "input[name='username']") driver.find_element(By.CSS_SELECTOR, "#login-form button[type='submit']")
5. 通過 XPath 定位
login_button = driver.find_element(By.XPATH, "http://button[text()='登錄']")
XPath 適合定位結(jié)構(gòu)復(fù)雜、缺少穩(wěn)定屬性的元素。
常見 XPath:
//input[@id='username'] //button[contains(text(), '登錄')] //div[@class='message']
6. find_element 與 find_elements 的區(qū)別
查找單個元素:
element = driver.find_element(By.CSS_SELECTOR, ".item")
查找多個元素:
elements = driver.find_elements(By.CSS_SELECTOR, ".item")
區(qū)別:
find_element找不到元素會拋異常find_elements找不到元素會返回空列表
五、自動輸入用戶名密碼
找到輸入框后,可以使用 send_keys() 輸入內(nèi)容。
username_input = driver.find_element(By.ID, "username")
password_input = driver.find_element(By.ID, "password")
username_input.send_keys("demo_user")
password_input.send_keys("demo_password")
如果輸入框中已有內(nèi)容,可以先清空:
username_input.clear()
username_input.send_keys("demo_user")
真實項目中,不建議把賬號密碼直接寫死在代碼里。更推薦使用環(huán)境變量:
import os
username = os.getenv("TEST_USERNAME")
password = os.getenv("TEST_PASSWORD")
運行前設(shè)置環(huán)境變量:
set TEST_USERNAME=demo_user set TEST_PASSWORD=demo_password
這樣可以避免賬號密碼泄露到代碼倉庫。
六、自動點擊按鈕
點擊按鈕使用 click():
login_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']") login_button.click()
有些頁面按鈕需要等待可點擊后再點擊,否則可能出現(xiàn)元素未加載、按鈕被遮擋等問題。更推薦結(jié)合顯式等待:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
wait = WebDriverWait(driver, 10)
login_button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))
)
login_button.click()
七、顯式等待與隱式等待
網(wǎng)頁不是瞬間加載完成的,尤其是現(xiàn)代前端頁面經(jīng)常使用 Ajax、Vue、React 等技術(shù)動態(tài)渲染內(nèi)容。如果元素還沒出現(xiàn)就去定位,很容易報錯。
Selenium 常用兩類等待方式:
- 隱式等待
- 顯式等待
1. 隱式等待
隱式等待會對所有元素查找生效。
driver.implicitly_wait(10)
含義:查找元素時,如果元素暫時不存在,最多等待 10 秒。
優(yōu)點:
- 寫法簡單
- 對全局生效
缺點:
- 不夠精確
- 復(fù)雜頁面中不容易控制具體等待條件
2. 顯式等待
顯式等待針對某個具體條件等待,更適合自動化測試。
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.presence_of_element_located((By.ID, "username"))
)
常見等待條件:
EC.presence_of_element_located(locator) # 元素存在于 DOM 中
EC.visibility_of_element_located(locator) # 元素可見
EC.element_to_be_clickable(locator) # 元素可點擊
EC.title_contains("首頁") # 標(biāo)題包含指定文字
EC.url_contains("dashboard") # URL 包含指定文字
實際項目中,建議以顯式等待為主,隱式等待可以設(shè)置一個較短時間作為兜底。
八、自動截圖保存
Selenium 可以保存當(dāng)前瀏覽器截圖,非常適合測試留痕、異常排查和自動化辦公。
driver.save_screenshot("login_result.png")
也可以截圖到指定目錄:
from pathlib import Path
from datetime import datetime
screenshot_dir = Path("screenshots")
screenshot_dir.mkdir(exist_ok=True)
file_name = datetime.now().strftime("login_%Y%m%d_%H%M%S.png")
driver.save_screenshot(str(screenshot_dir / file_name))
如果登錄失敗,可以截圖保存現(xiàn)場,方便后續(xù)分析。
九、完整實戰(zhàn)代碼:自動登錄并截圖
下面是一份完整實戰(zhàn)代碼。為了避免涉及真實網(wǎng)站賬號密碼,示例使用一個演示登錄頁地址和占位選擇器。你在實際項目中只需要把 URL、賬號密碼和元素定位方式替換成自己的系統(tǒng)即可。
建議保存為:
selenium_login_demo.py
完整代碼如下:
import os
from datetime import datetime
from pathlib import Path
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
LOGIN_URL = "https://example.com/login"
USERNAME = os.getenv("TEST_USERNAME", "demo_user")
PASSWORD = os.getenv("TEST_PASSWORD", "demo_password")
SCREENSHOT_DIR = Path("screenshots")
def create_driver():
"""創(chuàng)建 Chrome 瀏覽器對象。"""
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(3)
return driver
def save_screenshot(driver, name_prefix):
"""保存瀏覽器截圖。"""
SCREENSHOT_DIR.mkdir(exist_ok=True)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_path = SCREENSHOT_DIR / f"{name_prefix}_{timestamp}.png"
driver.save_screenshot(str(file_path))
return file_path
def login(driver):
"""自動打開網(wǎng)頁、輸入賬號密碼并點擊登錄。"""
wait = WebDriverWait(driver, 10)
driver.get(LOGIN_URL)
username_input = wait.until(
EC.visibility_of_element_located((By.ID, "username"))
)
password_input = wait.until(
EC.visibility_of_element_located((By.ID, "password"))
)
username_input.clear()
username_input.send_keys(USERNAME)
password_input.clear()
password_input.send_keys(PASSWORD)
login_button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))
)
login_button.click()
wait.until(
EC.url_contains("dashboard")
)
success_element = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".user-info"))
)
return success_element.text
def main():
driver = create_driver()
try:
user_info = login(driver)
print(f"登錄成功:{user_info}")
screenshot_path = save_screenshot(driver, "login_success")
print(f"成功截圖已保存:{screenshot_path}")
except TimeoutException:
screenshot_path = save_screenshot(driver, "login_failed")
print(f"登錄失敗或頁面加載超時,現(xiàn)場截圖已保存:{screenshot_path}")
raise
finally:
driver.quit()
if __name__ == "__main__":
main()
十、如何改成真實網(wǎng)站登錄
把示例代碼改成真實項目,一般只需要修改 5 個地方。
1. 修改登錄地址
LOGIN_URL = "https://your-company-system.com/login"
2. 修改用戶名輸入框定位
如果頁面 HTML 是:
<input id="account" name="account">
則代碼可以改成:
username_input = wait.until(
EC.visibility_of_element_located((By.ID, "account"))
)
3. 修改密碼輸入框定位
password_input = wait.until(
EC.visibility_of_element_located((By.NAME, "password"))
)
4. 修改登錄按鈕定位
login_button = wait.until(
EC.element_to_be_clickable((By.XPATH, "http://button[contains(text(), '登錄')]"))
)
5. 修改登錄成功判斷條件
登錄成功后,頁面可能跳轉(zhuǎn)到后臺首頁,也可能出現(xiàn)用戶頭像或用戶名。
例如:
wait.until(EC.url_contains("home"))
或者:
wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".avatar"))
)
自動化測試中,登錄成功判斷非常重要。不能只點擊按鈕就認為登錄成功,必須驗證頁面狀態(tài)。
十一、常見問題與解決方法
1. 找不到元素
常見報錯:
NoSuchElementException
原因可能是:
- 定位方式寫錯
- 頁面還沒加載完成
- 元素在 iframe 中
- 元素需要滾動后才出現(xiàn)
- 頁面結(jié)構(gòu)發(fā)生變化
解決建議:
- 使用瀏覽器開發(fā)者工具檢查元素
- 優(yōu)先使用穩(wěn)定的
id、name、data-*屬性 - 增加顯式等待
- 如果元素在 iframe 中,先切換 iframe
2. 元素不可點擊
常見報錯:
ElementClickInterceptedException
可能原因:
- 頁面彈窗遮擋
- 按鈕還沒變成可點擊狀態(tài)
- 頁面動畫還沒結(jié)束
解決方式:
login_button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))
)
login_button.click()
3. 頁面有驗證碼
如果登錄頁面有驗證碼、短信驗證碼、滑塊驗證,不建議繞過驗證碼。驗證碼本身就是為了防止自動化濫用。
企業(yè)內(nèi)部測試環(huán)境可以采用這些方式:
- 測試環(huán)境關(guān)閉驗證碼
- 使用專門的測試賬號白名單
- 后端提供測試登錄接口
- 自動化測試前寫入測試登錄 Cookie
4. 瀏覽器啟動失敗
可能原因:
- Chrome 沒安裝
- ChromeDriver 版本不匹配
- Selenium 版本過舊
- 驅(qū)動路徑?jīng)]有配置
建議先升級 Selenium:
pip install -U selenium
然后確認 Chrome 能正常打開。
十二、自動化辦公場景分析
Selenium 不只適合自動化測試,也可以用于一些辦公自動化場景。
1. 后臺系統(tǒng)自動登錄
很多公司內(nèi)部系統(tǒng)需要每天登錄查看數(shù)據(jù),例如 CRM、ERP、OA、工單系統(tǒng)、數(shù)據(jù)看板等。Selenium 可以自動登錄后臺,進入指定頁面。
2. 自動導(dǎo)出報表
如果系統(tǒng)沒有開放 API,但頁面上提供“導(dǎo)出 Excel”按鈕,可以使用 Selenium 自動點擊篩選條件、選擇日期、點擊導(dǎo)出。
3. 頁面巡檢與截圖留檔
運維或測試人員可以定時打開多個業(yè)務(wù)頁面,檢查是否出現(xiàn)錯誤提示,并自動保存截圖。
4. 批量錄入表單
一些舊系統(tǒng)沒有批量導(dǎo)入功能,只能手動填寫網(wǎng)頁表單。Selenium 可以讀取 Excel 數(shù)據(jù),然后自動填寫網(wǎng)頁表單。
5. 自動化回歸測試
開發(fā)完成新功能后,可以用 Selenium 編寫登錄、查詢、提交、刪除等流程測試腳本,減少人工回歸測試成本。
十三、自動化測試代碼編寫建議
初學(xué)者寫 Selenium 腳本時,建議注意以下幾點:
- 不要把真實賬號密碼寫死在代碼里
- 盡量使用顯式等待
- 優(yōu)先選擇穩(wěn)定的元素定位方式
- 每個關(guān)鍵步驟后都做結(jié)果驗證
- 失敗時保存截圖
- 用
try...finally確保瀏覽器最終關(guān)閉 - 不要對公共網(wǎng)站進行高頻自動化請求
- 遵守目標(biāo)網(wǎng)站的使用規(guī)則
一個好的自動化腳本,不只是能跑通一次,而是能穩(wěn)定、可維護、容易定位問題。
十四、總結(jié)
本文使用 Python + Selenium 完成了一個“瀏覽器自動化測試與網(wǎng)頁自動登錄”的入門實戰(zhàn)案例。
你已經(jīng)學(xué)習(xí)了:
- Selenium 庫的作用
- ChromeDriver 的安裝與配置
- 如何自動打開網(wǎng)頁
- 如何自動輸入用戶名和密碼
- 如何自動點擊登錄按鈕
- 常見元素定位方法
- 顯式等待與隱式等待的區(qū)別
- 如何自動截圖保存
- 一份完整的自動登錄實戰(zhàn)代碼
- Selenium 在自動化辦公中的應(yīng)用場景
對于 Python 自動化測試初學(xué)者來說,建議先從簡單頁面練習(xí)元素定位、輸入、點擊和等待,再逐步擴展到真實業(yè)務(wù)系統(tǒng)。
當(dāng)你掌握 Selenium 后,就可以把很多重復(fù)性的瀏覽器操作變成腳本,讓測試、辦公和數(shù)據(jù)處理流程更加高效。
以上就是Python+Selenium瀏覽器自動化測試與網(wǎng)頁自動登錄的詳細內(nèi)容,更多關(guān)于Python Selenium瀏覽器自動化測試與登錄的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python自動化測試框架:unittest、pytest、Selenium、requests和Pytest-BDD
- Python使用Selenium實現(xiàn)Web自動化的完整指南
- 從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實戰(zhàn)技巧
- 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服務(wù)的方法
相關(guān)文章
使用Python實現(xiàn)分組數(shù)據(jù)并保存到單獨的文件中
當(dāng)處理大型數(shù)據(jù)集時,通常需要將數(shù)據(jù)分組,并將每個分組的數(shù)據(jù)保存到單獨的文件中,本文將使用 Python 中的 pandas 庫來實現(xiàn)這一目標(biāo),需要的可以參考下2024-04-04
基于Python實現(xiàn)簡單學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細介紹了基于Python實現(xiàn)簡單學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07
python3實現(xiàn)抓取網(wǎng)頁資源的 N 種方法
這兩天學(xué)習(xí)了python3實現(xiàn)抓取網(wǎng)頁資源的方法,發(fā)現(xiàn)了很多種方法,所以,今天添加一點小筆記。2017-05-05
PyInstaller打包TkinterDnD應(yīng)用時窗口圖標(biāo)失效問題的解決詳解
在使用 Python 的 Tkinter 庫開發(fā)圖形用戶界面(GUI)應(yīng)用時,為應(yīng)用設(shè)置一個獨特的圖標(biāo)是提升用戶體驗的重要一步,但偶爾會遇到應(yīng)用窗口左上角的圖標(biāo)消失的問題,下面我們就來看看如何解決吧2025-11-11
Pytorch:dtype不一致問題(expected dtype Double but&
這篇文章主要介紹了Pytorch:dtype不一致問題(expected dtype Double but got dtype Float),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02

