1.簡(jiǎn)介
上一篇宏哥已經(jīng)將Python+Playwright的環(huán)境搭建好了,而且也簡(jiǎn)單的演示了一下三款瀏覽器的啟動(dòng)和關(guān)閉,是不是很簡(jiǎn)單啊。今天主要是把一篇的中的代碼進(jìn)行一次詳細(xì)的注釋,然后說一下playwright的API和其他相關(guān)知識(shí)點(diǎn)。那么首先將上一篇中的代碼進(jìn)行一下詳細(xì)的解釋。
2.代碼解釋
2.1創(chuàng)建瀏覽器對(duì)象
'''默認(rèn)為無頭瀏覽器方式啟動(dòng) '''
browser = p.webkit.launch(headless=False)
2.2創(chuàng)建page對(duì)象
一般來說,一個(gè)page對(duì)應(yīng)一個(gè)瀏覽器選項(xiàng)卡,而Page對(duì)象的作用在于和頁(yè)面的內(nèi)容進(jìn)行交互,以及導(dǎo)航和加載新的頁(yè)面。這點(diǎn)和selenium有點(diǎn)像,也可以說是比selenium劃分的更加細(xì)致精確。
page = browser.new_page()
2.3其他
其他的是一些選擇器和操作方法,在后續(xù)的文章中宏哥都會(huì)一一的介紹到。
3.playwright的API
Playwright支持同步和異步兩種API,使用異步API需要導(dǎo)入asyncio庫(kù),它是一個(gè)可以用來實(shí)現(xiàn)Python協(xié)程的庫(kù),更詳細(xì)介紹可參考Python協(xié)程 。我們可以根據(jù)自己的偏好選擇適合的模式。
3.1同步與異步模式原理
同步操作方式:在代碼執(zhí)行時(shí),程序會(huì)阻塞等待每個(gè)操作執(zhí)行的結(jié)果,直到該操作執(zhí)行結(jié)束才能繼續(xù)執(zhí)行后面的代碼。同步代碼容易理解和編寫,但如果在網(wǎng)絡(luò)請(qǐng)求等 I/O 操作時(shí)會(huì)造成大量的等待時(shí)間,影響程序的執(zhí)行效率。
異步操作方式:在代碼執(zhí)行時(shí),當(dāng)遇到需要等待操作執(zhí)行的時(shí)候,程序不會(huì)被阻塞,而是繼續(xù)執(zhí)行其他的代碼。當(dāng)該操作執(zhí)行的結(jié)果返回時(shí),程序會(huì)自動(dòng)跳回去接著執(zhí)行之前被暫停的代碼。異步操作雖然需要一定的學(xué)習(xí)成本,但可以提升程序的執(zhí)行效率。
3.1.1同步模式
· 直接順序執(zhí)行測(cè)試邏輯,直到完成。
· 使用上下文管理器或啟動(dòng)/關(guān)閉方法控制瀏覽器生命周期。
· 簡(jiǎn)單易用,適合同步測(cè)試場(chǎng)景。
· 但無法實(shí)現(xiàn)異步或重疊的測(cè)試邏輯。
3.1.2異步模式
· 利用asyncio模塊以異步非阻塞方式執(zhí)行測(cè)試邏輯。
· 瀏覽器啟動(dòng)/關(guān)閉和大多數(shù)Playwright API也是異步的,需要await。
· 可以實(shí)現(xiàn)復(fù)雜的異步或重疊測(cè)試邏輯。
· 但較難調(diào)試,有一定學(xué)習(xí)成本。
3.2同步和異步的概念
同步:發(fā)送一個(gè)請(qǐng)求,等待返回,然后再發(fā)送下一個(gè)請(qǐng)求。
異步:發(fā)送一個(gè)請(qǐng)求,不等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求。
3.3同步和異步實(shí)踐
3.3.1測(cè)試用例
宏哥這里假設(shè)一共有2條測(cè)試用例,用例1步驟如下:
1)chrome瀏覽器打開百度
2)搜索框輸入“test”
3)點(diǎn)擊百度一下搜索
4)點(diǎn)擊搜索結(jié)果的第2頁(yè)
用例2步驟:
1)chrome瀏覽器打開搜狗搜索
2)搜索框輸入“test”
3)點(diǎn)擊搜狗搜索
4)點(diǎn)擊搜索結(jié)果的第2頁(yè)
3.3.2同步
這里我們使用sync_playwright上下文管理器同步啟動(dòng)Playwright,然后編寫同步測(cè)試邏輯。
3.3.2.1參考代碼
根據(jù)上述測(cè)試用例編寫自動(dòng)化測(cè)試腳本代碼如下:
# coding=utf-8??
# 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
# 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
'''
Created on 2023-05-18
@author: 北京-宏哥 QQ交流群:705269076
Project: 《最新出爐》系列初窺篇-Python+Playwright自動(dòng)化測(cè)試-2-playwright的API及其他知識(shí)公眾號(hào):北京宏哥
'''
# 3.導(dǎo)入模塊
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運(yùn)行代碼
運(yùn)行代碼后,控制臺(tái)打印,如下圖所示:

3.3.3異步
這里我們使用asyncio模塊異步啟動(dòng)Playwright,然后編寫異步測(cè)試邏輯。需要使用await關(guān)鍵字標(biāo)識(shí)異步操作。
3.3.3.1參考代碼
根據(jù)上述測(cè)試用例編寫自動(dòng)化測(cè)試腳本代碼如下:
# coding=utf-8??
# 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
# 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
'''
Created on 2023-05-18
@author: 北京-宏哥 QQ交流群:705269076
公眾號(hào):北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動(dòng)化測(cè)試-2-playwright的API及其他知識(shí)
'''
# 3.導(dǎo)入模塊
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運(yùn)行代碼
運(yùn)行代碼后,控制臺(tái)打印,如下圖所示:

通過對(duì)比同步和異步的運(yùn)行時(shí)間可以看到,使用異步編程的方式可以顯著提升測(cè)試效率。
4.headless 模式
在launch方法的參數(shù)中添加 headless=False playwright默認(rèn)是無頭模式運(yùn)行,True是無頭模式,F(xiàn)alse是有頭模式,即在電腦上能看到瀏覽器的運(yùn)行界面。默認(rèn)情況下,Playwright 以無頭模式運(yùn)行瀏覽器。要查看瀏覽器 UI,請(qǐng)headless=False在啟動(dòng)瀏覽器時(shí)傳遞標(biāo)志。有頭模式適用于調(diào)試,而無頭模式適用于CI / cloud執(zhí)行。
4.1headless
headless 無頭模式運(yùn)行瀏覽器示例:
# coding=utf-8??
# 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
# 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
'''
Created on 2023-05-19
@author: 北京-宏哥 QQ交流群:705269076
公眾號(hào):北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動(dòng)化測(cè)試-2-playwright的API及其他知識(shí)
'''
# 3.導(dǎo)入模塊
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch() # 啟動(dòng) chromium 瀏覽器
page = browser.new_page() # 打開一個(gè)標(biāo)簽頁(yè)
page.goto("https://www.baidu.com") # 打開百度地址
print(page.title()) # 打印當(dāng)前頁(yè)面title
page.click("input[name=\"wd\"]") # 點(diǎn)擊輸入框
page.fill("input[name=\"wd\"]", "chromium") # 在輸入框輸入瀏覽器名字
page.screenshot(path=f'example-{p.chromium.name}.png')
browser.close() # 關(guān)閉瀏覽器對(duì)象
4.2非headless
非headless 無頭模式運(yùn)行瀏覽器示例:
# coding=utf-8??
# 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
# 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
'''
Created on 2023-05-19
@author: 北京-宏哥 QQ交流群:705269076
公眾號(hào):北京宏哥
Project: 《最新出爐》系列初窺篇-Python+Playwright自動(dòng)化測(cè)試-2-playwright的API及其他知識(shí)
'''
# 3.導(dǎo)入模塊
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 啟動(dòng) chromium 瀏覽器
page = browser.new_page() # 打開一個(gè)標(biāo)簽頁(yè)
page.goto("https://www.baidu.com") # 打開百度地址
print(page.title()) # 打印當(dāng)前頁(yè)面title
page.click("input[name=\"wd\"]") # 點(diǎn)擊輸入框
page.fill("input[name=\"wd\"]", "chromium") # 在輸入框輸入瀏覽器名字
page.screenshot(path=f'example-{p.chromium.name}.png')
browser.close() # 關(guān)閉瀏覽器對(duì)象
5.小結(jié)
5.1同步和異步
Python Playwright 支持同步和異步兩種操作方式。
同步操作方式:在代碼執(zhí)行時(shí),程序會(huì)阻塞等待每個(gè)操作執(zhí)行的結(jié)果,直到該操作執(zhí)行結(jié)束才能繼續(xù)執(zhí)行后面的代碼。同步代碼容易理解和編寫,但如果在網(wǎng)絡(luò)請(qǐng)求等 I/O 操作時(shí)會(huì)造成大量的等待時(shí)間,影響程序的執(zhí)行效率。
異步操作方式:在代碼執(zhí)行時(shí),當(dāng)遇到需要等待操作執(zhí)行的時(shí)候,程序不會(huì)被阻塞,而是繼續(xù)執(zhí)行其他的代碼。當(dāng)該操作執(zhí)行的結(jié)果返回時(shí),程序會(huì)自動(dòng)跳回去接著執(zhí)行之前被暫停的代碼。異步操作雖然需要一定的學(xué)習(xí)成本,但可以提升程序的執(zhí)行效率。
Python Playwright 默認(rèn)使用異步操作方式??梢酝ㄟ^使用 await 關(guān)鍵字或 async with 語(yǔ)法來定義異步操作,或者使用 sync 關(guān)鍵字來定義同步操作。
今天這一篇主要給大家分享了playwright的同步和異步、有頭和無頭。它們各有利弊,要靈活掌握其適合使用的測(cè)試場(chǎng)景。好了,今天時(shí)間也不早了,宏哥就講解和分享到這里,感謝您耐心的閱讀,希望對(duì)您有所幫助。
每天學(xué)習(xí)一點(diǎn),今后必成大神-
往期推薦(由于跳轉(zhuǎn)參數(shù)丟失了,所有建議選中要訪問的右鍵,在新標(biāo)簽頁(yè)中打開鏈接即可訪問)或者微信搜索: 北京宏哥 公眾號(hào)提前解鎖更多干貨。
Appium自動(dòng)化系列,耗時(shí)80天打造的從搭建環(huán)境到實(shí)際應(yīng)用精品教程測(cè)試
Python接口自動(dòng)化測(cè)試教程,熬夜87天整理出這一份上萬字的超全學(xué)習(xí)指南
Python+Selenium自動(dòng)化系列,通宵700天從無到有搭建一個(gè)自動(dòng)化測(cè)試框架
Java+Selenium自動(dòng)化系列,仿照Python趁熱打鐵嘔心瀝血317天搭建價(jià)值好幾K的自動(dòng)化測(cè)試框架
Jmeter工具從基礎(chǔ)->進(jìn)階->高級(jí),費(fèi)時(shí)2年多整理出這一份全網(wǎng)超詳細(xì)的入門到精通教程
Fiddler工具從基礎(chǔ)->進(jìn)階->高級(jí),費(fèi)時(shí)100多天吐血整理出這一份全網(wǎng)超詳細(xì)的入門到精通教程