动态

详情 返回 返回

《最新出爐》系列初窺篇-Python+Playwright自動化測試-2-playwright的API及其他知識 - 动态 详情

1.簡介

上一篇宏哥已經將Python+Playwright的環境搭建好了,而且也簡單的演示了一下三款瀏覽器的啓動和關閉,是不是很簡單啊。今天主要是把一篇的中的代碼進行一次詳細的註釋,然後説一下playwright的API和其他相關知識點。那麼首先將上一篇中的代碼進行一下詳細的解釋。

2.代碼解釋

2.1創建瀏覽器對象

'''默認為無頭瀏覽器方式啓動  '''
browser = p.webkit.launch(headless=False)

2.2創建page對象

一般來説,一個page對應一個瀏覽器選項卡,而Page對象的作用在於和頁面的內容進行交互,以及導航和加載新的頁面。這點和selenium有點像,也可以説是比selenium劃分的更加細緻精確。

page = browser.new_page()

2.3其他

其他的是一些選擇器和操作方法,在後續的文章中宏哥都會一一的介紹到。

3.playwright的API

Playwright支持同步和異步兩種API,使用異步API需要導入asyncio庫,它是一個可以用來實現Python協程的庫,更詳細介紹可參考Python協程 。我們可以根據自己的偏好選擇適合的模式。

3.1同步與異步模式原理

同步操作方式:在代碼執行時,程序會阻塞等待每個操作執行的結果,直到該操作執行結束才能繼續執行後面的代碼。同步代碼容易理解和編寫,但如果在網絡請求等 I/O 操作時會造成大量的等待時間,影響程序的執行效率。

異步操作方式:在代碼執行時,當遇到需要等待操作執行的時候,程序不會被阻塞,而是繼續執行其他的代碼。當該操作執行的結果返回時,程序會自動跳回去接着執行之前被暫停的代碼。異步操作雖然需要一定的學習成本,但可以提升程序的執行效率。

3.1.1同步模式

· 直接順序執行測試邏輯,直到完成。

· 使用上下文管理器或啓動/關閉方法控制瀏覽器生命週期。

· 簡單易用,適合同步測試場景。

· 但無法實現異步或重疊的測試邏輯。

3.1.2異步模式

· 利用asyncio模塊以異步非阻塞方式執行測試邏輯。

· 瀏覽器啓動/關閉和大多數Playwright API也是異步的,需要await。

· 可以實現複雜的異步或重疊測試邏輯。

· 但較難調試,有一定學習成本。

3.2同步和異步的概念

同步:發送一個請求,等待返回,然後再發送下一個請求。

異步:發送一個請求,不等待返回,隨時可以再發送下一個請求。

3.3同步和異步實踐

3.3.1測試用例

宏哥這裏假設一共有2條測試用例,用例1步驟如下:
1)chrome瀏覽器打開百度
2)搜索框輸入“test”
3)點擊百度一下搜索
4)點擊搜索結果的第2頁
用例2步驟:
1)chrome瀏覽器打開搜狗搜索
2)搜索框輸入“test”
3)點擊搜狗搜索
4)點擊搜索結果的第2頁

3.3.2同步

這裏我們使用sync\_playwright上下文管理器同步啓動Playwright,然後編寫同步測試邏輯。

3.3.2.1參考代碼

根據上述測試用例編寫自動化測試腳本代碼如下:

# coding=utf-8🔥

# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2025-10-27
@author: 北京-宏哥   QQ交流羣:705269076
Project: 《最新出爐》系列初窺篇-Python+Playwright自動化測試-2-playwright的API及其他知識
公眾號:北京宏哥
'''

# 3.導入模塊
import time
from playwright.sync_api import sync_playwright


def testcase1():
    print('testcase1 start')
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        page.goto("https://www.baidu.com/")
        print(page.title())
        page.fill("input[name=\"wd\"]", "test")
        page.click("text=百度一下")
        page.click("#page >> text=2")
        browser.close()
    print('testcase1 done')

def testcase2():
    print('testcase2 start')
    with sync_playwright() as p:
        browser2 = p.chromium.launch(headless=False)
        page2 = browser2.new_page()
        page2.goto("https://www.sogou.com/")
        print(page2.title())
        page2.fill("input[name=\"query\"]", "test")
        page2.click("text=搜狗搜索")
        page2.click("#sogou_page_2")
        browser2.close()
    print('testcase2 done')

start = time.time()
testcase1()
testcase2()
end = time.time()
print('Running time: %s Seconds' % (end - start))
3.3.2.2運行代碼

運行代碼後,控制枱打印,如下圖所示:

3.3.3異步

這裏我們使用asyncio模塊異步啓動Playwright,然後編寫異步測試邏輯。需要使用await關鍵字標識異步操作。

3.3.3.1參考代碼

根據上述測試用例編寫自動化測試腳本代碼如下:

# coding=utf-8🔥

# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2023-10-27
@author: 北京-宏哥   QQ交流羣:705269076
公眾號:北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動化測試-2-playwright的API及其他知識
'''

# 3.導入模塊
import asyncio
import time

from playwright.async_api import async_playwright


async def testcase1():
    print('testcase1 start')
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://www.baidu.com/")
        print(await page.title())
        await page.fill("input[name=\"wd\"]", "test")
        await page.click("text=百度一下")
        await page.click("#page >> text=2")
        await browser.close()
    print('testcase1 done')


async def testcase2():
    print('testcase2 start')
    async with async_playwright() as p:
        browser2 = await p.chromium.launch(headless=False)
        page2 = await browser2.new_page()
        await page2.goto("https://www.sogou.com/")
        print(await page2.title())
        await page2.fill("input[name=\"query\"]", "test")
        await page2.click("text=搜狗搜索")
        await page2.click("#sogou_page_2")
        await browser2.close()
    print('testcase2 done')


async def main():
    task1 = asyncio.create_task(testcase1())
    task2 = asyncio.create_task(testcase2())
    tasks = [task1, task2]
    print('before await')
    await asyncio.gather(*tasks)


start = time.time()
asyncio.run(main())
end = time.time()
print('Running time: %s Seconds' % (end - start))
3.3.3.2運行代碼

運行代碼後,控制枱打印,如下圖所示:

通過對比同步和異步的運行時間可以看到,使用異步編程的方式可以顯著提升測試效率。

4.headless 模式

在launch方法的參數中添加 headless=False playwright默認是無頭模式運行,True是無頭模式,False是有頭模式,即在電腦上能看到瀏覽器的運行界面。默認情況下,Playwright 以無頭模式運行瀏覽器。要查看瀏覽器 UI,請headless=False在啓動瀏覽器時傳遞標誌。有頭模式適用於調試,而無頭模式適用於CI / cloud執行。

4.1headless

headless 無頭模式運行瀏覽器示例:

# coding=utf-8🔥

# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2025-10-27
@author: 北京-宏哥   QQ交流羣:705269076
公眾號:北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動化測試-2-playwright的API及其他知識
'''

# 3.導入模塊

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()          # 啓動 chromium 瀏覽器
    page = browser.new_page()              # 打開一個標籤頁
    page.goto("https://www.baidu.com")     # 打開百度地址
    print(page.title())                    # 打印當前頁面title
    page.click("input[name=\"wd\"]")       # 點擊輸入框
    page.fill("input[name=\"wd\"]", "chromium")  # 在輸入框輸入瀏覽器名字
    page.screenshot(path=f'example-{p.chromium.name}.png')
    browser.close()                        # 關閉瀏覽器對象

4.2非headless

非headless 無頭模式運行瀏覽器示例:

# coding=utf-8🔥

# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2025-10-27
@author: 北京-宏哥   QQ交流羣:705269076
公眾號:北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動化測試-2-playwright的API及其他知識
'''

# 3.導入模塊

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)          # 啓動 chromium 瀏覽器
    page = browser.new_page()              # 打開一個標籤頁
    page.goto("https://www.baidu.com")     # 打開百度地址
    print(page.title())                    # 打印當前頁面title
    page.click("input[name=\"wd\"]")       # 點擊輸入框
    page.fill("input[name=\"wd\"]", "chromium")  # 在輸入框輸入瀏覽器名字
    page.screenshot(path=f'example-{p.chromium.name}.png')
    browser.close()                        # 關閉瀏覽器對象

5.小結

5.1同步和異步

Python Playwright 支持同步和異步兩種操作方式。

同步操作方式:在代碼執行時,程序會阻塞等待每個操作執行的結果,直到該操作執行結束才能繼續執行後面的代碼。同步代碼容易理解和編寫,但如果在網絡請求等 I/O 操作時會造成大量的等待時間,影響程序的執行效率。

異步操作方式:在代碼執行時,當遇到需要等待操作執行的時候,程序不會被阻塞,而是繼續執行其他的代碼。當該操作執行的結果返回時,程序會自動跳回去接着執行之前被暫停的代碼。異步操作雖然需要一定的學習成本,但可以提升程序的執行效率。

Python Playwright 默認使用異步操作方式。可以通過使用 await 關鍵字或 async with 語法來定義異步操作,或者使用 sync 關鍵字來定義同步操作。

今天這一篇主要給大家分享了playwright的同步和異步、有頭和無頭。它們各有利弊,要靈活掌握其適合使用的測試場景。好了,今天時間也不早了,宏哥就講解和分享到這裏,感謝您耐心的閲讀,希望對您有所幫助。

user avatar u_17494575 头像 u_17037082 头像 u_14540126 头像 u_16281588 头像 gushiio 头像 itwhat 头像 huizhudev 头像 nocobase 头像 haoqidedalianmao 头像 codexiaosheng 头像 guishangguandao 头像 gmicloud 头像
点赞 45 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.