成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Async 與 Await,帶您理解Playwright使用異步方法的正確姿勢!

開發 前端
如果大家需要并行執行用例,那么需要考慮async (這里建議基于場景設計),如果沒有這個需求,這部分只是點做為了解即可。

大家在使用python做playwright自動化測試的過程中,一定會發現下面這種異步用法

async def func():
      await api
      await api

很多同學可能只是按照這種寫法來編寫項目的自動化測試代碼,對于具體細節可能并不了解,今天我就來講一下playwright異步用法的相關技術細節。建議大家拷貝文檔中的腳本實際運行一下,學習的效果會更好!

同步和異步的概念

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

async 與 await

python在3.5以后引入async和await來強化自身的異步編程,提升效率。async 是異步的簡寫,而 await 可以認為是 async wait 的簡寫。async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執行完成。異步函數的特點是能在函數執行過程中掛起,去執行其他異步函數,等到掛起條件結束后再回來繼續執行。await的作用是掛起函數,等待函數操作完成,這時候回去執行其他的異步函數,而不是傻等,等掛起的執行完成以后將會從其他異步函數處返回,執行掛起結束的函數。await只可以對異步函數使用,普通函數使用會報錯。await的本質是通過yield from 實現的,關于yield生成器相關知識點這里就不詳細介紹了。

例如:兩個異步程序async a、async b:

a中一步有await,當程序碰到關鍵字await后,異步程序a掛起,去執行異步b程序(就相當于從一個函數內部跳出去執行其他函數);當掛起條件結束時候,不管b是否執行完,要馬上從b程序中跳出來,回到原程序a執行原來的操作;如果await后面跟的b函數不是異步函數,那么操作就只能等b執行完再返回,無法在b執行的過程中返回,這樣就相當于直接調用b函數,沒必要使用await關鍵字了。因此,需要await后面跟的是異步函數。

舉個例子

import time
import asyncio
async def wait1():
    print('wait1 start')
    await asyncio.sleep(1)
    print('wait1 end')

async def wait3():
    print('wait3 start')
    await asyncio.sleep(3)
    print('wait3 end')

async def wait5():

    print('wait5 start')
    await asyncio.sleep(5)
    print('wait5 end')

# 2. 將異步函數加入事件隊列

tasks = [
    wait1(),
    wait3(),
    wait5(),
]

if __name__ == '__main__':

    # 創建一個事件循環
    loop = asyncio.get_event_loop()
    startTime = time.time()
    # 執行隊列實踐,直到最晚的一個事件被處理完畢后結束
    loop.run_until_complete(asyncio.wait(tasks))
    # 如果不在使用loop,建議使用關閉,類似操作文件的close()函數
    loop.close()
    endTime = time.time()
    print("sum time: ",endTime-startTime)

運行結果

wait5 start

wait3 start

wait1 start

wait1 end

wait3 end

wait5 end

sum time: 5.000609874725342

上面這段代碼大家可以多執行幾次,我們會發現:不管wait1 wait3,wait5 哪個函數先執行,但是最后end的順序一定是 wait1>wait3>wait5。一共運行的時間 在5s左右,充分地證明了三個函數是并行執行的!

接下來,我們可以對代碼進行如下修改:

async def wait3():
    print('wait3 start')
    time.sleep(3)
    print('wait3 end')

然后再次運行代碼,結果如下:

wait5 start

wait3 start

wait3 end

wait1 start

wait1 end

wait5 end

sum time: 5.002418518066406

大家會發現,只有wait3 end 發生后,才會出現wait1 end 和wait5 end(),很好的證明了上面的話:如果await后面跟的b函數不是異步函數,那么操作就只能等b執行完再返回,無法在b執行的過程中返回,這樣就相當于直接調用b函數,沒必要使用await關鍵字了。我們可以任意調整task的執行順序,例如:

tasks = [
    wait1(),
    wait5(),
    wait3(),
]

執行最慢的情況就是,wait3 第一個start,等待wait3 end后,才能執行wait1 或者wait5

wait3 start

wait3 end

wait5 start

wait1 start

wait1 end

wait5 end

sum time: 8.000799894332886

一個易犯的錯誤

當我們在同步方法中加入await,執行代碼的時候會報錯,也就是說像下面這樣編寫playwright腳步是不對的,因為sync_playwright() 是同步方法!

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
 browser = p.chromium.launch(channel="chrome")
 page = browser.new_page()
 await page.goto("http://www.baidu.com")
 print(page.title())
 browser.close()

Playwright使用異步方法的正確姿勢

如下代碼會正常運行,通過await可以保證腳本的運行順序

async def playwright_async_demo():
  async with async_playwright() as p:
     browser = await p.chromium.launch(channel="chrome")
     page = await browser.new_page()
     await page.goto("http://www.baidu.com")
asyncio.run(playwright_async_demo())

如果我們把上面代碼中 browser = await p.chromium.launch(channel="chrome")的await關鍵字去掉就會報錯

page = await browser.new_page()

AttributeError: 'coroutine' object has no attribute 'new_page'

sys:1: RuntimeWarning: coroutine 'BrowserType.launch' was never awaited

原因就是代碼行 browser = p.chromium.launch(channel="chrome")還沒執行完就執行了下一行 page = await browser.new_page()

最后的總結,如果大家需要并行執行用例,那么需要考慮async (這里建議基于場景設計),如果沒有這個需求,這部分只是點做為了解即可。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2016-11-22 11:08:34

asyncjavascript

2024-09-02 14:12:56

2024-06-25 08:33:48

2017-08-02 14:17:08

前端asyncawait

2023-04-14 08:10:59

asyncawait

2024-08-12 10:13:01

2023-04-27 11:06:54

Chromium開源項目

2021-02-09 09:53:11

C#多線程異步

2024-12-23 08:00:45

2014-07-15 10:08:42

異步編程In .NET

2022-11-21 09:01:00

Swift并發結構

2017-02-23 15:37:44

OptionObject容器

2012-07-22 15:59:42

Silverlight

2017-07-10 13:09:45

前端Flexbox

2021-06-28 08:10:59

JavaScript異步編程

2014-07-15 10:31:07

asyncawait

2021-03-29 09:26:44

SpringBoot異步調用@Async

2021-08-18 07:05:57

ES6Asyncawait

2021-09-15 16:20:02

Spring BootFilterJava

2023-10-08 10:21:11

JavaScriptAsync
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜桃视频在线观看免费视频网站www | 欧美不卡视频一区发布 | 精产国产伦理一二三区 | 国产成人精品在线 | 日韩av手机在线观看 | 欧美日韩久久 | 91精品久久久久久久久 | 国产一级在线观看 | 黄色网址免费看 | 韩日在线视频 | 亚洲欧洲色视频 | 欧美在线视频一区 | 日日噜噜夜夜爽爽狠狠 | 日韩一区二区三区视频 | www.亚洲一区二区三区 | 婷婷综合在线 | 精品欧美一区二区精品久久 | 午夜视频网站 | 国产精品国产三级国产aⅴ原创 | 一级大片网站 | 国产精品一区二区视频 | 国产欧美日韩综合精品一区二区 | 一级黄色片在线免费观看 | 久久精品成人 | 免费成人在线网站 | 亚洲精品视频在线 | 99精品免费久久久久久久久日本 | 亚洲精品三级 | 欧美在线观看黄色 | 精产国产伦理一二三区 | 国产三级在线观看播放 | 99热99| 日本不卡一区二区三区 | 成人在线播放网址 | 日韩中文字幕高清 | 国产综合精品 | 欧美精品久久 | 久久久久久国模大尺度人体 | 国产精品自拍一区 | 精品啪啪| 精品视频成人 |