Playwright Python 教程:網頁自動化

1. 常用工具簡介及對比

主流網頁自動化工具對比

工具支持語言瀏覽器支持特點適用場景
PlaywrightPython, JS, .NETChromium, Firefox, WebKit跨瀏覽器、速度快、API簡潔自動化測試、爬蟲、網頁操作
Selenium多語言所有主流瀏覽器歷史悠久、社區大傳統自動化測試、兼容性測試
PuppeteerJavaScriptChromiumChrome官方工具、性能好Chrome相關開發、爬蟲
CypressJavaScriptChromium, Firefox專注于測試、內置斷言庫前端測試

Playwright優勢

  • 支持所有現代瀏覽器

  • 自動等待機制完善

  • 可以攔截修改網絡請求

  • 提供設備模擬功能

  • 支持移動端網頁測試

2. 安裝及自動生成代碼

安裝步驟

# 安裝Python包
pip install playwright# 安裝瀏覽器二進制文件
playwright install

自動生成代碼

Playwright提供代碼生成工具,可以錄制操作并生成代碼:

# 啟動代碼生成器
playwright codegen https://example.com

這會打開瀏覽器窗口和代碼編輯器,你的操作會被實時轉換為代碼。

3. 基本思路及對象介紹

Playwright核心對象

  1. Browser:對應一個瀏覽器實例

  2. BrowserContext:獨立的會話上下文(類似隱身模式)

  3. Page:單個標簽頁或彈出窗口

  4. Frame:頁面中的iframe

  5. Locator:元素定位器

基本工作流程

  1. 啟動瀏覽器

  2. 創建頁面

  3. 導航到目標URL

  4. 定位頁面元素

  5. 執行操作

  6. 提取數據

  7. 關閉瀏覽器

4. 打開瀏覽器

基本啟動方式

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 啟動Chromium瀏覽器(顯示界面)browser = p.chromium.launch(headless=False)# 創建新頁面page = browser.new_page()# 在這里添加操作代碼# 關閉瀏覽器browser.close()

不同瀏覽器啟動

# Firefox
browser = p.firefox.launch()# WebKit (Safari的渲染引擎)
browser = p.webkit.launch()

瀏覽器配置選項

browser = p.chromium.launch(headless=False,  # 顯示瀏覽器窗口slow_mo=1000,    # 操作間延遲(毫秒),方便觀察args=["--start-maximized"],  # 啟動參數channel="chrome"  # 使用Chrome而非Chromium
)

5. 訪問、等待、定位

訪問頁面

# 基本訪問
page.goto("https://example.com")# 帶選項的訪問
page.goto("https://example.com", timeout=10000, wait_until="networkidle")

等待策略

# 等待元素出現
page.wait_for_selector(".result")# 等待導航完成
page.click("a.link")
page.wait_for_url("**/target-page")# 等待函數返回True
page.wait_for_function("document.readyState === 'complete'")# 隱式等待(Playwright自動處理)

元素定位

推薦使用新的定位器API:

# 通過文本定位
page.get_by_text("Submit").click()# 通過角色定位
page.get_by_role("button", name="Sign in").click()# 通過標簽文本定位
page.get_by_label("Username").fill("admin")# 通過占位文本定位
page.get_by_placeholder("Enter your email").fill("test@example.com")# 傳統CSS/XPath選擇器
page.locator("button#submit").click()
page.locator("xpath=//button[@id='submit']").click()

6. 動作

基本交互

# 點擊
page.get_by_text("Click me").click()
page.get_by_role("button").click(button="right")  # 右鍵點擊# 輸入
page.get_by_label("Username").fill("admin")
page.get_by_label("Password").fill("password")# 鍵盤操作
page.get_by_label("Search").press("Enter")# 鼠標移動
page.get_by_text("Menu").hover()# 拖放
page.locator("#item").drag_to(page.locator("#target"))

表單操作

# 選擇單選按鈕
page.get_by_label("Agree").check()# 選擇復選框
page.get_by_label("Subscribe").set_checked(True)# 選擇下拉選項
page.get_by_label("Country").select_option("China")# 上傳文件
page.get_by_label("Upload file").set_input_files("myfile.pdf")# 日期選擇
page.get_by_label("Birthday").fill("1990-01-01")

7. 內容解析

獲取文本內容

# 獲取單個元素文本
title = page.locator("h1").text_content()# 獲取多個元素文本
items = page.locator(".item").all()
for item in items:print(item.text_content())

獲取屬性

# 獲取屬性值
href = page.locator("a").get_attribute("href")# 獲取輸入框值
value = page.locator("input").input_value()

獲取HTML和截圖

# 獲取整個頁面HTML
html = page.content()# 獲取元素內部HTML
inner_html = page.locator("div.container").inner_html()# 截圖
page.screenshot(path="screenshot.png")# 元素截圖
page.locator(".header").screenshot(path="header.png")

執行JavaScript獲取數據

# 執行JavaScript獲取數據
data = page.evaluate("""() => {return {title: document.title,width: window.innerWidth}
}""")
print(data["title"])

8. 案例

案例1:自動登錄并截圖

from playwright.sync_api import sync_playwrightdef auto_login():with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 訪問登錄頁page.goto("https://example.com/login")# 填寫登錄表單page.get_by_label("Username").fill("testuser")page.get_by_label("Password").fill("password123")page.get_by_role("button", name="Login").click()# 等待登錄成功page.wait_for_url("**/dashboard")# 截圖保存page.screenshot(path="dashboard.png")# 獲取歡迎信息welcome = page.get_by_text("Welcome,").text_content()print(welcome)browser.close()auto_login()

案例2:爬取商品列表

from playwright.sync_api import sync_playwright
import csvdef scrape_products():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com/products")products = []# 獲取所有商品元素items = page.locator(".product-item").all()for item in items:product = {"name": item.locator(".product-name").text_content(),"price": item.locator(".price").text_content(),"link": item.locator("a").get_attribute("href")}products.append(product)# 保存到CSVwith open("products.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["name", "price", "link"])writer.writeheader()writer.writerows(products)browser.close()scrape_products()

案例3:處理動態加載內容

from playwright.sync_api import sync_playwright
import timedef scrape_infinite_scroll():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com/infinite-scroll")# 獲取初始項目數items = page.locator(".item")last_count = items.count()while True:# 滾動到底部page.evaluate("window.scrollTo(0, document.body.scrollHeight)")# 等待新內容加載time.sleep(2)  # 簡單等待,實際項目應該用wait_for_selector# 檢查是否加載了新內容new_count = items.count()if new_count == last_count:break  # 沒有新內容了last_count = new_count# 提取所有內容all_items = items.all()for item in all_items:print(item.text_content())browser.close()scrape_infinite_scroll()

案例4:下載文件

from playwright.sync_api import sync_playwrightdef download_file():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()# 監聽下載事件with page.expect_download() as download_info:page.goto("https://example.com/download")page.click("#download-button")download = download_info.valueprint(f"Downloading: {download.url}")# 保存文件path = download.path()download.save_as("downloaded_file.pdf")print(f"File saved to: {path}")browser.close()download_file()

這些案例展示了Playwright在網頁自動化中的常見應用場景。根據實際需求,你可以組合這些基本操作來實現更復雜的自動化任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89099.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態數組:ArrayList的實現原理

動態數組:ArrayList的實現原理 大家好!今天我們來聊聊Java集合框架中一個非常重要的數據結構——ArrayList。就像我們日常生活中使用的伸縮收納盒一樣,ArrayList可以根據需要自動調整大小,既方便又高效。那么它是如何實現這種&quo…

MIPI DSI(五) DBI 和 DPI 格式

關于 DBI 和 DPI 這兩種格式的詳細協議內容,請參考《MIPI Alliance Standard for Display Bus Interface(V2.0) .pdf》和《MIPI Alliance Standard for Display Pixel Interface(DPI- 2) .pdf》這兩份文檔。首先先了解…

FRP Ubuntu 服務端 + MacOS 客戶端配置

一、服務端配置 1、下載frp并解壓 # 創建目錄并進入 mkdir -p /opt/frp && cd /opt/frp # 下載最新版(替換URL為GitHub發布頁最新版本) wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz # 解壓 …

Video Python(Pyav)解碼二

在 PyAV 中,input_container.decode() 和 input_container.demux() 是兩種處理視頻流數據的不同方法,它們分別適用于不同的場景。下面通過代碼示例和對比來詳細說明它們的用法和區別。1. input_container.decode()功能直接解碼:從容器中讀取數…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第十六課——圖像五行緩存的FPGA實現

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

頭文件與源文件及區別

使用場景上的區別頭文件:變量的聲明,函數的聲明,宏的定義,類的定義等。 源文件:變量的定義。函數的定義實現,類成員函數的定義實現等。這樣方便于我們去管理、規劃,更重要的是避免了重定義的問題…

圖機器學習(4)——圖機器學習與嵌入算法

圖機器學習(4)——圖機器學習與嵌入算法0. 前言1. 圖機器學習1.1 機器學習基本原理1.2 圖機器學習的獨特優勢2. 廣義圖嵌入問題3. 圖嵌入算法分類小結0. 前言 機器學習是人工智能的一個重要分支,它致力于讓系統能夠從數據中自主學習并持續優…

網絡基礎10--ACL與包過濾

一、ACL 定義與核心功能ACL(訪問控制列表)是通過規則匹配實現數據包過濾或分類的核心技術,廣泛應用于包過濾、NAT、QoS、路由策略等場景。其核心由規則條目組成,每條規則包含匹配條件(如源 / 目 IP、端口、協議&#x…

Web安全 - 基于 SM2/SM4 的前后端國產加解密方案詳解

文章目錄概述一、背景與法規要求二、算法選型三、核心流程四、前端實現要點(偽代碼)五、后端實現要點(偽代碼)六、公鑰存儲策略七、全流程示例圖八、總結與最佳實踐推薦概述 隨著信息安全法規日益嚴格,如《網絡安全法》《數據安全法》和等保…

ACL動態路由實驗全攻略:配置與安全實戰

實驗拓撲圖 實驗需求 步驟1.按照圖示配置IP地址2.按照圖示區域劃分配置對應的動態路由協議3.在R7上配置dhcp服務器,能夠讓pc可以獲取IP地址4.將所有環回宣告進ospf中,將環回17宣告進rip中,將rip路由引rospf中,ospf路由引.rip中5.要…

電動汽車制動系統及其工作原理

制動系統是實現車輛減速、停車功能的重要系統。電動汽車的制動系統按照制動實現方式分為機械制動和電機再生制動,機械制動根據制動力實現方式不同又可分為液壓機械制動系統、氣壓機械制動系統和電子機械制動系統。目前,電動汽車的制動系統實現一般為協調…

CentOS 7 Linux 離線安裝 docker-compose

CentOS 7 Linux 離線安裝 docker-compose 1. docker-compose 簡介 1.1. docker-compose 是什么? docker-compose 是 Docker 官方提供的工具,用于定義和運行多容器 Docker 應用程序。通過一個 YAML 文件(通常為 docker-compose.yml&#xf…

排序算法實戰(上)

一、引言在力扣刷題的旅程中,排序類題目是繞不開的重要板塊。今天就來分享兩道經典排序題——912. 排序數組和75. 顏色分類的解題思路與代碼實現,帶你深入理解排序算法在實際題目中的應用 。二、題目剖析與解題思路(一)912. 排序數…

python學智能算法(二十)|SVM基礎概念-感知機算法及代碼

引言 前序學習進程中,已經學習了超平面的基礎知識,學習鏈接為:超平面 在此基礎上,要想正確繪制超平面,還需要了解感知機的相關概念。 感知機 感知機是對生物神經網絡的模擬,當輸入信號達到感知機的閾值時…

操作HTML網頁

一、HTML網頁的介紹 HTML,即超文本標記語言(HyperText Markup Language),它不是一種編程語言,而是一種標記語言,用于描述網頁的結構。HTML 通過一系列標簽來定義網頁中的各種元素,如文本、圖片…

Django--03視圖和模板

Django–03視圖和模板 Part 3: Views and templates 本教程承接第二部分,我們將繼續開發投票應用,重點介紹 Django 的表單處理和通用視圖。 文章目錄Django--03視圖和模板前言概述一、編寫更多視圖二、編寫實際執行操作的視圖三、快捷方式:r…

《每日AI-人工智能-編程日報》--2025年7月15日

介紹:AI :英偉達恢復向中國銷售 H20 并推出新 GPU:7 月 15 日,英偉達官宣將恢復向中國銷售 H20,并推出全新的 NVIDIA RTX PRO GPU,其中 B30 性能約為 H20 的 75%,定價在 6500 至 8000 美元之間&…

C++STL-list

一.基礎概念相當于數據結構里面的雙向鏈表二.基礎操作1.list對象創建1. 默認構造函數list<int> l1;2. 初始化列表list<int> l2_1 { 9,8,7,6,5 };list<int> l2_2({ 9, 8, 7, 1, 5 });3. 迭代器list <int> l3(l2_1.begin(), l2_1.end());4. 全0初始化li…

【PTA數據結構 | C語言版】字符串插入操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將給定字符串 t 插入到另一個給定字符串 s 的第 pos 個字符的位置。 輸入格式&#xff1a; 輸入先后給出主串 s 和待插入的字符串 t&#xff0c;每個非空字符串占一行&#…

Postman + Newman + Jenkins 接口自動化測試

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </