《最新出爐》系列初窺篇-Python+Playwright自動(dòng)化測(cè)試-2-API及其他知識(shí)

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ì)的入門到精通教程

Pycharm工具基礎(chǔ)使用教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容