(1)同步函數
from playwright.sync_api import sync_playwright
doubanMovieURL = "https://movie.douban.com/"
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto(doubanMovieURL)
print(page.title())
browser.close()
(2) 異步函數
import asyncio
from playwright.async_api import async_playwright
doubanMovieURL = "https://movie.douban.com/"
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto(doubanMovieURL)
print(await page.title())
await browser.close()
asyncio.run(main())
(3) 錄制代碼
在terminal中輸入:playwright codegen url
playwright codegen www.douban.com
(4) 保留經過身份驗證的狀態(tài)
playwright codegen --save-storage=auth.json
生成auth.json文件
保存好cookie后顽耳,執(zhí)行以下代碼做裙,可以直接跳轉至登錄后的頁面:
playwright open --load-storage=auth.json https://www.bizreach.jp/mypage/(網頁登錄后的首頁url)
playwright codegen --load-storage=auth.json https://www.bizreach.jp/mypage/(網頁登錄后的首頁url)
(5)playwright錄制器自動生成元素定位語句
(6)page.pause()斷點
在代碼中加入page.pause()進入斷點狀態(tài)秉沼,可以在頁面上直接調試代碼
(7)網頁最大化
方法一:args =['--start-maximized']
不過試了一下在mac系統沒有生效
from playwright.sync_api import sync_playwright
doubanMovieURL = "https://movie.douban.com/"
with sync_playwright() as p:
browser = playwright.chromium.launch(
headless=False,
args=['--start-maximized']
)
context = browser.new_context(no_viewport=True)
page = context.new_page()
page.goto(doubanMovieURL)
print(page.title())
page.pause()
context.close()
browser.close()
方法二 直接設置分辨率
from playwright.sync_api import sync_playwright
doubanMovieURL = "https://movie.douban.com/"
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(viewport={"width": 1920, "height": 1080}) # 設置 viewport 為屏幕分辨率
page = context.new_page()
page.goto(doubanMovieURL)
print(page.title())
page.pause()
context.close()
browser.close()
(8)啟動chrome唠雕,edge瀏覽器(無痕瀏覽器)
playwright install --help 可以查看playwright支持的瀏覽器
在browser = p.chromium.launch(headless=False)中指定限府,channel=“chrome”
指定channel=“msedge”,將打開edge瀏覽器
指定打開safari瀏覽器:
browser = p.webkit.launch(headless=False)
from time import sleep
from playwright.sync_api import sync_playwright
import os
doubanMovieURL = "https://movie.douban.com/"
USER_DIR_PATH = os.path.expanduser("~/Library/Caches/Safari/User_Data")
with sync_playwright() as p:
context = p.webkit.launch_persistent_context(
user_data_dir=USER_DIR_PATH,
headless=False
)
page = context.new_page()
page.goto(doubanMovieURL)
print(page.title())
sleep(1)
context.close()
(9)啟動帶緩存的本地瀏覽器
啟動帶本地緩存的瀏覽器可读拆,繞過登錄時的一些驗證祠肥。
windows系統啟動帶緩存的chrome瀏覽器
from time import sleep
from playwright.sync_api import sync_playwright
import getpass
doubanMovieURL = "https://movie.douban.com/"
USER_DIR_PATH = fr"C:\Users\{getpass.getuser()}\AppData\Local\Google\Chrome\User Data"
with sync_playwright() as p:
context = p.chromium.launch_persistent_context(
user_data_dir=USER_DIR_PATH,
headless=False,
channel="chrome"
)
page = context.new_page()
page.goto(doubanMovieURL)
print(page.title())
sleep(1)
context.close()
在macOS瀏覽器啟動帶緩存的webkit瀏覽器
根據chatgpt的回答痢虹,目前好像還無法支持啟動帶緩存的Safari瀏覽器
from time import sleep
from playwright.sync_api import sync_playwright
import os
doubanMovieURL = "https://movie.douban.com/"
with sync_playwright() as p:
context = p.webkit.launch_persistent_context(
user_data_dir=os.path.expanduser("~/Library/Caches/Safari/User_Data"),
headless=False
)
page = context.new_page()
page.goto(doubanMovieURL)
print(page.title())
sleep(1)
context.close()
(10)錄制視頻
視頻在瀏覽器上下文關閉時保存被去。如果您手動創(chuàng)建瀏覽器上下文,請確保browser_context.close(),會在調用close的時候保存視頻奖唯。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
#slow_mo=1000 每個操作有1s的停頓
browser = p.chromium.launch(headless=False, slow_mo=1000)
#record_video_dir="videos/"指定視頻存放路徑
context = browser.new_context(record_video_dir="videos/")
page = context.new_page()
page.goto("https://www.bizreach.jp/")
page.get_by_role("link", name="ログイン", exact=True).click()
page.get_by_test_id("form-input__email").click()
page.get_by_test_id("form-input__email").fill("123@gmail.com")
page.get_by_test_id("form-input__password").click()
page.get_by_test_id("form-input__password").fill("password123")
page.get_by_test_id("form__submit-button").click()
#context.close()時保存視頻
context.close()
browser.close()
執(zhí)行后視頻自動保存
視頻默認800*800惨缆,也可以指定視頻大小
context = browser.new_context(
record_video_dir = "videos/",
record_video_size={"width": 640, "height": 480}
)
(11)Trace Viewer測試追蹤功能
Playwright Trace Viewer可以探索記錄playwright測試跟蹤。使用browser_context.tracing API記錄追蹤
browser = chromium.lanch()
context = browser.new_context()
#Start tracing before creating/ navigating page.
context.tracing.start(screenshots=True,snapshots=True,sources =True)
page = context.new_page()
page.goto("https//playwright.dev")
#Stop tracing and export it into a zip archive.
context.tracing.stop(path = "trace.zip")
這將記錄跟蹤并將其放入名為trace.zip
可以使用playwright CLI活在您的瀏覽器中打開保存的trace.playwright.dev
playwright show-trace trace.zip
from playwright.sync_api import sync_playwright
# 復制 Chrome 用戶數據到新目錄
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
slow_mo=1000,
channel="chrome"
)
context = browser.new_context()
# 開始追蹤 trace.start
context.tracing.start(screenshots=True, snapshots=True, sources=True)
page = context.new_page() # 創(chuàng)建新頁面
page.goto("https://www.douban.com/")
page.frame_locator("#anony-reg-new iframe").get_by_text("密碼登錄").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").fill("123@123.com")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").press("Tab")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("密碼").fill("password")
page.frame_locator("#anony-reg-new iframe").get_by_text("登錄豆瓣").click()
print(page.title())
# 追蹤結束
context.tracing.stop(path="trace.zip")
page.close() # 關閉頁面
context.close()
browser.close()
查看trace:
方法一:在terminal中丰捷,進入trace.zip的文件夾坯墨,然后執(zhí)行:playwright show-trace trace.zip
方法二,訪問https://trace.playwright.dev/ 選中trace.zip查看
選中call病往,可以查看每一步的詳細參數
(12)保存cookie捣染,解決反復登錄問題
方法一: storageState保存登錄cookies
playwright提供了一種在測試中重用登錄狀態(tài)的方法。這樣可以只登錄一次荣恐,然后跳過所有測試的登錄步驟液斜。
playwright提供browserContext.storageState(options)方法,可用于從景觀身份驗證的上下文中檢索存儲狀態(tài)叠穆,然后創(chuàng)建具有與填充狀態(tài)的新上下文少漆。
cookie和本地存儲狀態(tài)可以跨不同的瀏覽器使用。取決于應用程序的身份驗證模型:某些應用程序可能需要cookie和本地存儲硼被。
...登錄操作代碼
#保存storage state 到指定文件
storage = context.storage_state(path="auth/state.json")
#-----------------------------
context.close()
browser.close()
執(zhí)行后會在本地保存一個state.json文件
這樣在其他地方就可以使用本地的cookies示损,實現免登錄
#create a new context with the saved storage state
context = browser.new_context(storage_state ="state.json")
登錄豆瓣(!H铝颉检访!登錄之后一定要預留登錄跳轉時間,有些登錄時還有其他滑動驗證等等仔掸,不然取不到cookie信息)
from time import sleep
from playwright.sync_api import sync_playwright
# 復制 Chrome 用戶數據到新目錄
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
slow_mo=1000,
channel="chrome"
)
context = browser.new_context()
# 開始追蹤 trace.start
# context.tracing.start(screenshots=True, snapshots=True, sources=True)
page = context.new_page() # 創(chuàng)建新頁面
page.goto("https://www.douban.com/")
page.frame_locator("#anony-reg-new iframe").get_by_text("密碼登錄").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").fill("123@123.com")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").press("Tab")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("密碼").fill("pswd")
page.frame_locator("#anony-reg-new iframe").get_by_text("登錄豆瓣").click()
# 等待登錄完成
sleep(20)
# 保存storage state 到指定文件
# 若目錄不存在脆贵,不會自動創(chuàng)建,需要自己手動創(chuàng)建
storage = context.storage_state(path="auth/douban_state.json")
print(page.title())
# 追蹤結束
# context.tracing.stop(path="trace.zip")
page.close() # 關閉頁面
context.close()
browser.close()
調用保存下來的douban_state.json文件起暮,直接進入豆瓣小組頁面
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
slow_mo=1000,
channel="chrome"
)
# 讀取cookie卖氨,實現免登錄
context = browser.new_context(
storage_state="auth/douban_state.json"
)
# 開始追蹤 trace.start
# context.tracing.start(screenshots=True, snapshots=True, sources=True)
page = context.new_page() # 創(chuàng)建新頁面
page.goto("https://www.douban.com/group/")
page.pause()
# 保存storage state 到指定文件
# 若目錄不存在,不會自動創(chuàng)建负懦,需要自己手動創(chuàng)建
print(page.title())
# 追蹤結束
# context.tracing.stop(path="trace.zip")
page.close() # 關閉頁面
context.close()
browser.close()
(13)Mock接口返回筒捺,模擬各種異常場景
# mock 處理方法,狀態(tài)碼改成500 模擬服務器異常
def handle(route):
route.fulfill(status=502)
# 攔截請求,模擬返回
page.route("要訪問的url", handler=handle)
from time import sleep
from playwright.sync_api import sync_playwright
# 復制 Chrome 用戶數據到新目錄
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
slow_mo=1000,
channel="chrome"
)
context = browser.new_context()
page = context.new_page() # 創(chuàng)建新頁面
page.goto("https://www.douban.com/")
page.frame_locator("#anony-reg-new iframe").get_by_text("密碼登錄").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").click()
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").fill("1111@qq.com")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("手機號 / 郵箱").press("Tab")
page.frame_locator("#anony-reg-new iframe").get_by_placeholder("密碼").fill("111")
# mock 處理方法,狀態(tài)碼改成500 模擬服務器異常
def handle(route):
route.fulfill(status=502)
# 攔截請求纸厉,模擬返回
page.route("https://accounts.douban.com/j/mobile/login/basic", handler=handle)
page.frame_locator("#anony-reg-new iframe").get_by_text("登錄豆瓣").click()
sleep(20)
page.pause()
# --------------------
page.close() # 關閉頁面
context.close()
browser.close()