1. 常用工具簡介及對比
主流網頁自動化工具對比
工具 | 支持語言 | 瀏覽器支持 | 特點 | 適用場景 |
---|---|---|---|---|
Playwright | Python, JS, .NET | Chromium, Firefox, WebKit | 跨瀏覽器、速度快、API簡潔 | 自動化測試、爬蟲、網頁操作 |
Selenium | 多語言 | 所有主流瀏覽器 | 歷史悠久、社區大 | 傳統自動化測試、兼容性測試 |
Puppeteer | JavaScript | Chromium | Chrome官方工具、性能好 | Chrome相關開發、爬蟲 |
Cypress | JavaScript | Chromium, Firefox | 專注于測試、內置斷言庫 | 前端測試 |
Playwright優勢:
支持所有現代瀏覽器
自動等待機制完善
可以攔截修改網絡請求
提供設備模擬功能
支持移動端網頁測試
2. 安裝及自動生成代碼
安裝步驟
# 安裝Python包 pip install playwright# 安裝瀏覽器二進制文件 playwright install
自動生成代碼
Playwright提供代碼生成工具,可以錄制操作并生成代碼:
# 啟動代碼生成器 playwright codegen https://example.com
這會打開瀏覽器窗口和代碼編輯器,你的操作會被實時轉換為代碼。
3. 基本思路及對象介紹
Playwright核心對象
Browser:對應一個瀏覽器實例
BrowserContext:獨立的會話上下文(類似隱身模式)
Page:單個標簽頁或彈出窗口
Frame:頁面中的iframe
Locator:元素定位器
基本工作流程
啟動瀏覽器
創建頁面
導航到目標URL
定位頁面元素
執行操作
提取數據
關閉瀏覽器
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在網頁自動化中的常見應用場景。根據實際需求,你可以組合這些基本操作來實現更復雜的自動化任務。