常用操作

(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錄制器自動生成元素定位語句

image.png

(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支持的瀏覽器


image.png

在browser = p.chromium.launch(headless=False)中指定限府,channel=“chrome”


image.png

指定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í)行后視頻自動保存


image.png

視頻默認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病往,可以查看每一步的詳細參數

image.png

(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()
image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末系吭,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子颗品,更是在濱河造成了極大的恐慌肯尺,老刑警劉巖沃缘,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蟆盹,居然都是意外死亡孩灯,警方通過查閱死者的電腦和手機闺金,發(fā)現死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門逾滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人败匹,你說我怎么就攤上這事寨昙。” “怎么了掀亩?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵舔哪,是天一觀的道長。 經常有香客問我槽棍,道長捉蚤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任炼七,我火速辦了婚禮缆巧,結果婚禮上,老公的妹妹穿的比我還像新娘豌拙。我一直安慰自己陕悬,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布按傅。 她就那樣靜靜地躺著捉超,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唯绍。 梳的紋絲不亂的頭發(fā)上拼岳,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音况芒,去河邊找鬼惜纸。 笑死,一個胖子當著我的面吹牛牛柒,可吹牛的內容都是我干的堪簿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼皮壁,長吁一口氣:“原來是場噩夢啊……” “哼椭更!你這毒婦竟也來了?” 一聲冷哼從身側響起蛾魄,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虑瀑,失蹤者是張志新(化名)和其女友劉穎湿滓,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體舌狗,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡叽奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了痛侍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝氓。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖主届,靈堂內的尸體忽然破棺而出赵哲,到底是詐尸還是另有隱情,我是刑警寧澤君丁,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布枫夺,位于F島的核電站,受9級特大地震影響绘闷,放射性物質發(fā)生泄漏橡庞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一印蔗、第九天 我趴在偏房一處隱蔽的房頂上張望扒最。 院中可真熱鬧,春花似錦喻鳄、人聲如沸扼倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽再菊。三九已至,卻和暖如春颜曾,著一層夾襖步出監(jiān)牢的瞬間纠拔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工泛豪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稠诲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓诡曙,卻偏偏與公主長得像臀叙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子价卤,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容