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