美文网首页
详解使用asyncio实现playwright并发操作(复制源码

详解使用asyncio实现playwright并发操作(复制源码

作者: 测试开发Kevin | 来源:发表于2023-11-19 11:21 被阅读0次

    asyncio实现并发

    我们可以使用asyncio来解决palywright中并发的问题,asyncio即Asynchronous I/O是python一个用来处理并发(concurrent)事件的包,是很多python异步架构的基础,多用于处理高并发网络请求方面的问题。给大家举一个经典的应用场景就懂了,在不同的浏览器中同时执行打开百度首页,获取title的操作,代码如下:

    import asyncio

    import time

    from playwright.async_apiimport async_playwright

    async def playwright_async_chromium():

        async with async_playwright() as p:

            browser = await p.chromium.launch(headless=False)

            page = await browser.new_page()

            await page.goto('http://baidu.com/')

            #await asyncio.sleep(2)

            print(await page.title())

            await asyncio.sleep(10)

            await browser.close()

    async def playwright_async_firefox():

        async with async_playwright() as p:

            browser = await p.firefox.launch(headless=False)

            page = await browser.new_page()

            await page.goto('http://baidu.com/')

            #await asyncio.sleep(2)

            print(await page.title())

            await asyncio.sleep(10)

            await browser.close()

    async def playwright_async_webkit():

        async with async_playwright() as p:

            browser = await p.webkit.launch(headless=False)

            page = await browser.new_page()

            await page.goto('http://baidu.com/')

            #await asyncio.sleep(2)

            print(await page.title())

            await asyncio.sleep(10)

            await browser.close()

    #首先说明的是playwright中的并发操作需要对异步函数进行操作,因此定义了三个方法

    async def playwright_async_chromium

    async def playwright_async_firefox()

    async def playwright_async_webkit()

    接下来的代码实现是关于asyncio异步运行函数的,大家参考下面的形式实现即可

    #把这三个函数放入task是中

    tasks = [playwright_async_chromium(),playwright_async_firefox(),playwright_async_webkit()] # tasks列表用于存放task

    #事件循环event loop 是asyncio的核心,会运行异步任务和回调,执行网络IO操作,运行子进程。使用get_event_loop()获取当前事件循环。

    loop = asyncio.get_event_loop()

    startTime = time.time()

    #执行tasks队列中的函数,直到最晚的一个事件被处理完毕后结束

    loop.run_until_complete(asyncio.wait(tasks))

    #如果不在使用loop,建议使用关闭,类似操作文件的close()函数

    loop.close()

    endTime = time.time()

    print("sum time: ",endTime-startTime)

    代码执行,显示输出22s左右

    并发代码优化

    接下来我们可以优化一下代码,同样的操作在三个浏览器中运行没必要写三个函数,我们优化一下函数逻辑,直接上代码:

    async def playwright_async_browser(p_browser):

        async with async_playwright() as p:

            if p_browser.lower()=="webkit":

              browser = await p.webkit.launch(headless=False)

            elif p_browser.lower()=="firefox":

              browser = await p.firefox.launch(headless=False)

            else:

              browser = await p.chromium.launch(headless=False)

            page = await browser.new_page()

            await page.goto('http://baidu.com/')

            print(await page.title())

            await asyncio.sleep(10)

            await browser.close()

    可以看到,实现思路很简单,通过条件语句实现不同的参数输入来启动不同的浏览器,其他都不变,重新设置tasks即可,代码如下:

    tasks = [playwright_async_browser("webkit"),playwright_async_browser("Firefox"),playwright_async_browser("chromium")]

    代码执行,显示输出也是22s左右!

    上面的代码就是playwright 并发运行的实现思路,希望对大家有帮助!

    我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

    相关文章

      网友评论

          本文标题:详解使用asyncio实现playwright并发操作(复制源码

          本文链接:https://www.haomeiwen.com/subject/ezxmwdtx.html