Python自動(dòng)化神器Playwright的用法詳解
前言
誰說瀏覽器不能自動(dòng)化?
大家好,我是花姐!
前幾天加班到半夜,困得不行,但手上還有個(gè)網(wǎng)頁表單要填,填完才能下班。于是我突然靈光一閃:
"Python 不是萬能的嗎?干嘛不用它自動(dòng)填表?"
于是,我打開 VsCode,摸索了一會兒 Playwright,五分鐘后,代碼敲好,表單一鍵填寫完畢,我合上電腦,拎包走人。
這感覺,簡直爽爆了!
所以今天就來聊聊 Playwright —— 這個(gè)比 Selenium 還要快的自動(dòng)化測試庫,讓你的瀏覽器變成聽話的小貓咪!
Playwright 是啥?比 Selenium 強(qiáng)在哪?
Playwright 是微軟開源的一款瀏覽器自動(dòng)化測試工具,支持 Chrome、Firefox、WebKit(Safari)、Edge,還能在 無頭模式(Headless)運(yùn)行。
它比 Selenium 更快的原因:
- 原生支持多瀏覽器(Selenium 需要 WebDriver)
- 默認(rèn)無頭模式(Selenium 需要手動(dòng)設(shè)置)
- 自動(dòng)等待元素加載(Selenium 需要
time.sleep()
) - 支持 API 測試、手機(jī)模擬、下載/上傳文件等高級功能
總之,Playwright 適用于 自動(dòng)化爬取網(wǎng)頁、填表、截圖、數(shù)據(jù)抓取、自動(dòng)化測試 等等。
安裝 Playwright(3 秒搞定?。?/h2>
pip install playwright
playwright install
pip install playwright playwright install
第一個(gè)命令裝 Playwright,第二個(gè)命令下載瀏覽器內(nèi)核(不然它沒法控制瀏覽器)。
執(zhí)行完畢,你的 Python 已經(jīng)具備讓瀏覽器乖乖聽話的能力了!
Hello Playwright!讓瀏覽器跑起來
來看一個(gè)最簡單的示例,我們用 Playwright 打開百度,然后截圖。
from playwright.sync_api import sync_playwright def run(): with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://www.baidu.com") page.screenshot(path="baidu.png") browser.close() run()
代碼解析:
sync_playwright()
:啟動(dòng) Playwright,支持with
語法,確保程序結(jié)束后資源釋放。p.chromium.launch()
:啟動(dòng) Chrome(你也可以用p.firefox.launch()
)。page.goto("https://www.baidu.com")
:訪問百度。page.screenshot(path="baidu.png")
:截圖。browser.close()
:關(guān)閉瀏覽器。
執(zhí)行完代碼,你的項(xiàng)目目錄下就會多出一張 baidu.png,打開看看,百度首頁是不是靜靜地躺在那里?
自動(dòng)化填表(比你手速快 100 倍?。?/h2>
很多網(wǎng)站的登錄頁、搜索框、表單都能用 Playwright 輕松搞定,比如打開百度然后輸入Python
搜索相關(guān)內(nèi)容:
from playwright.sync_api import sync_playwright import time def run(): with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://www.baidu.com") page.fill(".s_ipt", "Python") # 輸入Python page.click("input[type='submit']") # 點(diǎn)擊登錄按鈕 page.screenshot(path="baidu_search.png") time.sleep(10) # 方便大家查看效果 這里等待10秒 browser.close() run()
代碼解析:
page.fill(selector, value)
:模擬輸入框輸入,s_ipt
是百度網(wǎng)頁輸入框?qū)?yīng)的class
名稱。page.click(selector)
:點(diǎn)擊按鈕。headless=False
:讓瀏覽器可見(默認(rèn)是無頭模式)。
執(zhí)行后,你會看到瀏覽器自動(dòng)打開百度,輸入Python
,然后搜索,整個(gè)過程行云流水,堪比黑客電影里的場景!??
模擬用戶操作(滑動(dòng)、點(diǎn)擊、拖拽)
讓 Playwright 模擬用戶操作簡直太簡單了,比如 滾動(dòng)頁面、點(diǎn)擊按鈕、拖拽元素:
page.click("button.submit") # 點(diǎn)擊按鈕 page.hover("#menu") # 鼠標(biāo)懸停 page.mouse.wheel(0, 500) # 模擬滾動(dòng)鼠標(biāo)(向下滾 500 像素) page.drag_and_drop("#source", "#target") # 拖拽元素
你可以用這個(gè)方法自動(dòng)化 點(diǎn)擊廣告、滾動(dòng)頁面、拖拽文件,甚至搶購秒殺商品(手動(dòng)狗頭??)!
網(wǎng)頁元素如何定位
1. 打開谷歌瀏覽器
輸入目標(biāo)網(wǎng)站,比如https://www.baidu.com
,然后按F12
打開開發(fā)者工具
點(diǎn)擊紅框里的按鈕
把鼠標(biāo)放到想查看對應(yīng)控件的地方,就可以看到控件對應(yīng)的id、class、類型了。比如我想查看百度輸入框控件對應(yīng)的內(nèi)容
我們可以看到百度輸入框?qū)?yīng)的類型是input
、id
是kw
,class
是s_ipt
2. 撰寫規(guī)則代碼掌控指定控件 —— 基礎(chǔ)定位方法
Playwright 定位元素的核心思想
Playwright 的定位 器(Locators)是其自動(dòng)等待和重試能力的核心,通過智能等待元素加載、重試機(jī)制避免因網(wǎng)絡(luò)延遲或動(dòng)態(tài)渲染導(dǎo)致的定位失敗。推薦優(yōu)先使用語義化定位 器(如角色、文本),而非傳統(tǒng) CSS/XPath,以提高代碼可讀性和穩(wěn)定性。
2.1. CSS 選擇器
通過 HTML 標(biāo)簽、類名、ID 等 CSS 語法定位:
# 定位 ID 為 "username" 的輸入框 page.locator("#username").fill("admin") # 定位類名為 "submit-btn" 的按鈕 page.locator("button.submit-btn").click()
適用場景:元素有固定 ID/類名,或需層級嵌套選擇(如 div > input
)。
2.2. XPath 表達(dá)式
通過 XML 路徑語法定位復(fù)雜結(jié)構(gòu):
# 定位 name 屬性為 "email" 的輸入框 page.locator("http://input[@name='email']").fill("test@example.com") # 定位包含特定文本的按鈕 page.locator("http://button[contains(text(), '提交')]").click()
適用場景:元素屬性動(dòng)態(tài)變化、需復(fù)雜條件篩選時(shí)。
2.3. 按角色定位(Role)
基于 ARIA 角色和可訪問性屬性,最接近用戶感知:
# 定位名稱為 "登錄" 的按鈕 page.get_by_role("button", name="登錄").click() # 定位角色為輸入框且名稱為 "用戶名" page.get_by_role("textbox", name="用戶名").fill("user123")
支持角色:button
、link
、checkbox
、heading
等。
2.4. 按文本內(nèi)容定位
# 精確匹配文本 page.get_by_text("歡迎回來").click() # 正則表達(dá)式模糊匹配 page.get_by_text(re.compile(r"訂單編號\d+")).hover()
適用場景:元素?zé)o固定屬性,但文本內(nèi)容穩(wěn)定。
2.5. 按標(biāo)簽關(guān)聯(lián)定位
# 通過關(guān)聯(lián)的 <label> 文本定位輸入框 page.get_by_label("密碼:").fill("secret") # 通過占位符定位 page.get_by_placeholder("請輸入手機(jī)號").type("13800138000")
優(yōu)勢:與表單控件天然綁定,避免層級依賴。
2.6. 按測試 ID 定位
專為測試設(shè)計(jì)的屬性,需頁面添加 data-testid
:
# 定位 data-testid="submit-button" 的元素 page.get_by_test_id("submit-button").click()
最佳實(shí)踐:與開發(fā)約定唯一測試 ID,提升定位穩(wěn)定性。
動(dòng)態(tài)元素處理技巧
1. 顯式等待元素加載
# 等待元素可見后再操作 page.locator(".loading").wait_for(state="visible") # 等待元素消失 page.wait_for_selector(".spinner", state="hidden")
2. 處理 iframe 嵌套
# 定位到 iframe 內(nèi)的元素 iframe = page.frame(name="payment-iframe") iframe.get_by_text("確認(rèn)支付").click()
3. Shadow DOM 穿透
通過 >>
符號穿透 Shadow DOM 層級:
page.locator("div#shadow-host >> input.custom-input").fill("data")
復(fù)雜場景定位策略
1. 多重條件篩選
# 定位類名為 "item" 且包含文本 "特價(jià)" 的元素 page.locator(".item", has_text="特價(jià)").click() # 組合角色和文本過濾 page.get_by_role("listitem").filter(has_text="待付款").nth(0).click()
2. 相對定位
# 父子關(guān)系定位 parent = page.locator("div.parent") child = parent.locator("span.child") # 兄弟元素定位 second_item = page.locator("ul > li").nth(1)
3. 動(dòng)態(tài)列表處理
# 遍歷商品列表并點(diǎn)擊第三個(gè)商品 items = page.locator(".product-list > li") await items.nth(2).click() # 根據(jù)文本動(dòng)態(tài)定位最新添加的條目 new_item = page.locator("tr:has-text('2024-03-18')").last
Playwright vs Selenium,選哪個(gè)?
功能 | Playwright | Selenium |
---|---|---|
速度 | 更快 | 較慢 |
多瀏覽器支持 | 內(nèi)置 | 需驅(qū)動(dòng) |
無頭模式 | 默認(rèn)支持 | 需手動(dòng)設(shè)置 |
等待元素加載 | 自動(dòng)等待 | 需手動(dòng) sleep |
API 自動(dòng)化 | 支持 | 不支持 |
移動(dòng)端模擬 | 支持 | 需插件 |
如果你要做 自動(dòng)化測試、爬蟲、網(wǎng)頁填表,Playwright 絕對是 優(yōu)選!但如果你的項(xiàng)目已經(jīng)基于 Selenium,那也沒必要急著換。
結(jié)語:用 Playwright 解放雙手!
學(xué)會 Playwright 之后,你會發(fā)現(xiàn)世界都不一樣了:
- 想自動(dòng)化登錄網(wǎng)站?沒問題!
- 想批量爬取網(wǎng)頁數(shù)據(jù)?小意思!
- 想定時(shí)打開某個(gè)網(wǎng)站?安排!
反正,只要是你手工操作的網(wǎng)頁任務(wù),基本都可以用 Playwright 自動(dòng)化完成。
以上就是Python自動(dòng)化神器Playwright的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Playwright庫用法的資料請關(guān)注腳本之家其它相關(guān)文章!
- 使用Playwright模擬API的項(xiàng)目實(shí)踐
- Python寫UI自動(dòng)化之playwright(點(diǎn)擊操作)詳解
- Python?Playwright進(jìn)行常見的頁面交互操作
- 深入理解Playwright的高級功能和用法
- Python中playwright啟動(dòng)瀏覽器與常見運(yùn)行方式詳解
- Python中Playwright模塊進(jìn)行自動(dòng)化測試的實(shí)現(xiàn)
- 使用Python中的Playwright制作測試視頻的實(shí)現(xiàn)步驟
- python+playwright 元素操作示例代碼
- 使用Playwright進(jìn)行視覺回歸測試詳解
- python playwright--pytest-playwright、pytest-base-url插件編寫用例
- Playwright 跟蹤查看器的高級用法
相關(guān)文章
Python?Matplotlib通過plt.subplots創(chuàng)建子繪圖
這篇文章主要介紹了Python?Matplotlib通過plt.subplots創(chuàng)建子繪圖,plt.subplots調(diào)用后將會產(chǎn)生一個(gè)圖表和默認(rèn)網(wǎng)格,與此同時(shí)提供一個(gè)合理的控制策略布局子繪圖,更多相關(guān)需要的朋友可以參考下面文章內(nèi)容2022-07-07python中ThreadPoolExecutor線程池和ProcessPoolExecutor進(jìn)程池
這篇文章主要介紹了python中ThreadPoolExecutor線程池和ProcessPoolExecutor進(jìn)程池,文章圍繞主題相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗
這篇文章主要介紹了如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-05-05如何使用Django默認(rèn)的Auth權(quán)限管理系統(tǒng)
本文主要介紹了如何使用Django默認(rèn)的Auth權(quán)限管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02media配置及把用戶頭像從數(shù)據(jù)庫展示到前端的操作方法
media配置可以讓用戶上傳的所有文件都固定的存放在某一個(gè)指定的文件夾下,接下來通過本文給大家介紹下media配置及把用戶頭像從數(shù)據(jù)庫展示到前端的操作,需要的朋友可以參考下2022-09-09基于Python的圖像數(shù)據(jù)增強(qiáng)Data Augmentation解析
這篇文章主要介紹了基于Python的圖像數(shù)據(jù)增強(qiáng)Data Augmentation解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)忽略大小寫對字符串列表排序的方法
這篇文章主要介紹了python實(shí)現(xiàn)忽略大小寫對字符串列表排序的方法,通過三種不同的方法實(shí)現(xiàn)了對字符串的排序,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09Python實(shí)現(xiàn)將HTML轉(zhuǎn)換成doc格式文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)將HTML轉(zhuǎn)換成doc格式文件的方法,涉及Python htmlparser及docx模塊的相關(guān)使用技巧,需要的朋友可以參考下2017-11-11