接口文档

Playwright Python接口文档

常用API操作

如何指定chrome的userDataDir?

如果在args中指定,会报下面的错误:
playwright._impl._api_types.Error: Pass userDataDir parameter instead of specifying --user-data-dir argument

正确方法如下:

  1. with sync_playwright() as playwright:
  2. self.__browser = playwright.chromium.launch_persistent_context(configs['chrome_user_data_dir'],
  3. headless=configs['record_headless'],
  4. executable_path=configs['ext_chrome_path'])
  5. print(f'start to load page,{time.time()}')
  6. self.recordInfo.status = RecordStatus.page_start
  7. self.start_load_timer()
  8. page = self.__browser.new_page()
  9. page.goto(param['url'])

更多参数,参考:链接

如何去掉提示:Chrome正受到自动测试软件的控制

image.png

代码如下:
image.png

如何启动指定的插件?

NOTE Extensions in Chrome / Chromium currently only work in non-headless mode. 参考:https://playwright.dev/docs/1.3.0/api/working-with-chrome-extensions/

  1. args: [<br />`--disable-extensions-except=${pathToExtension}`,<br />`--load-extension=${pathToExtension}`<br />]<br />通过上面的两个参数来指定,加载指定的插件。

如何加载自定义插件?

https://stackoverflow.com/questions/32280949/enable-developer-mode-extension-for-chrome-browser-using-cmd
https://github.com/Rob—W/extension-dev-tools/blob/master/chrome/master_preferences

如何指定chrome启动参数?

  1. webkit = playwright.chromium
  2. browser = webkit.launch(headless=False, devtools=True, args=['--auto-select-desktop-capture-source=Sharing'])
  3. context = browser.new_context(record_video_dir="../record/", record_video_size={"width": 1920, "height": 1080},
  4. viewport={"width": 1920, "height": 1080})

在args中指定具体的chrome参数,可选的参数有:链接

如何模拟按钮点击?

主要代码如下:

  1. # 等待分享视频按钮能看到
  2. page.wait_for_selector('#share-screen')
  3. # 点击分享屏幕按钮
  4. page.click("#share-screen")

下面是完整代码:

  1. from playwright.sync_api import sync_playwright
  2. def run(playwright):
  3. # webkit = playwright.firefox
  4. webkit = playwright.chromium
  5. # devtools=True 开启调试窗口
  6. browser = webkit.launch(headless=False, devtools=True, args=['--auto-select-desktop-capture-source=Sharing'])
  7. context = browser.new_context(record_video_dir="../record/", record_video_size={"width": 1920, "height": 1080},
  8. viewport={"width": 1920, "height": 1080})
  9. print(f'start to load page,{time.time()}')
  10. page = context.new_page()
  11. page.goto("https://www.webrtc-experiment.com/Pluginfree-Screen-Sharing/#8249560123750639")
  12. def print_args(msg):
  13. for arg in msg.args:
  14. value = arg.json_value()
  15. if value == 'video_start':
  16. print(f'start to play video,{time.time()}')
  17. if value == "video_end":
  18. print(f"video is end, start to close browser, {time.time()}")
  19. browser.close()
  20. page.on("console", print_args)
  21. # 等待分享视频按钮能看到
  22. page.wait_for_selector('#share-screen')
  23. # 点击分享屏幕按钮
  24. page.click("#share-screen")
  25. page.wait_for_timeout(10040 * 1000)
  26. with sync_playwright() as playwright:
  27. run(playwright)

如何让页面保持在等待状态,避免退出?

page.wait_for_timeout(10040 * 1000)

如何监听console消息?

    def print_args(msg):
        for arg in msg.args:
            value = arg.json_value()
            if value == 'video_start':
                print(f'start to play video,{time.time()}')
            if value == "video_end":
                print(f"video is end, start to close browser, {time.time()}")
                browser.close()

    page.on("console", print_args)

初步实现和页面的交互

交互通过收到页面发来的console消息,来实现的,目前还是单向通讯。

myweb.zip
页面:index.html

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>菜鸟教程(runoob.com)</title> 
</head>
<body>

<video id="myVideo" autoplay muted width="320" height="240" controls src="movie.ogg">
 您的浏览器不支持 video 标签。
</video>

<p><b>注意:</b>  IE 和 Safari 浏览器不支持 .ogg 文件格式。</p>

<script type='text/javascript'>
    myvideo = document.getElementById('myVideo');
    myvideo.addEventListener('playing',function(){console.log("video_start");},false);
    myvideo.addEventListener('ended',function(){console.log("video_end");},false);
</script>

</body>
</html>

下面是python代码:

import asyncio
from playwright.async_api import async_playwright
import time

async def run(playwright):
    webkit = playwright.chromium
    browser = await webkit.launch(headless=False)
    context = await browser.new_context(record_video_dir="./record/", record_video_size={"width": 1920, "height": 1080},
                                  viewport={"width": 1920, "height": 1080})

    print(f'start to load page,{time.time()}')
    page = await context.new_page()
    await page.goto("http://127.0.0.1/index.html")
    await page.screenshot(path="screenshot.png")

    async def print_args(msg):
        for arg in msg.args:
            value = await arg.json_value()
            if value == 'video_start':
                print(f'start to play video,{time.time()}')
            if value == "video_end":
                print(f"video is end, start to close browser, {time.time()}")
                await browser.close()

    page.on("console", print_args)

    await page.wait_for_timeout(60 * 60 * 1000)

async def main():
    async with async_playwright() as playwright:
        await run(playwright)
asyncio.run(main())

如何解决ERR_CERT_AUTHORITY_INVALID错误?

在加载非安全的https页面时,报了下面的错误:

playwright._impl._api_types.Error: net::ERR_CERT_AUTHORITY_INVALID at https://192.168.6.61:8080/duix/#/render

解决办法:
增加参数:ignore_https_errors=True

    webkit = playwright.chromium
    # devtools=True 开启调试窗口
    browser = webkit.launch(headless=False, devtools=True, args=['--auto-select-desktop-capture-source=DUIX'])
    context = browser.new_context(ignore_https_errors=True, record_video_dir="../record/", record_video_size={"width": 1920, "height": 1080},
                                        viewport={"width": 1920, "height": 1080})

打开浏览器自带的devtools

await chromium.launch({ devtools: true });

检查视频播放完毕事件,然后停止录制

视频停止事件: ended

问题:playwright打开的视频,无法自动播放

链接
chrome默认禁止音频的播放,如果视频中有音频,也会被禁止播放。
解决方法:在video中增加muted标签

问题:playwright使用chrome打开浏览器,播放页面中的mp4失败

打开含有mp4的页面时,直接显示空白,加载失败。
解决方法:使用playwright中的firefox打开页面即可

注: firefox打开的页面布局和chrome会有一些不同,需要注意处理。

或者使用低版本的chrome浏览器

问题:录制视频的时候,是否需要headless=False

不需要,不用弹出浏览器窗口也可以的。

问题:在运行过程中,如何获取录制的视频文件的名称?

video_name = await page.video.path()
print(f’video name: {video_name}’)
完整代码如下:

import asyncio
from playwright.async_api import async_playwright
import time

"""用于验证是否能获取到录制的视频文件名称,目前还没有验证通过"""


async def run(playwright):
    webkit = playwright.chromium
    browser = await webkit.launch(headless=True)
    context = await browser.new_context(record_video_dir="./record/", record_video_size={"width": 1920, "height": 1080},
                                        viewport={"width": 1920, "height": 1080})

    print(f'start to load page,{time.time()}')
    page = await context.new_page()
    await page.goto("http://127.0.0.1/index.html")

    async def print_args(msg):
        for arg in msg.args:
            value = await arg.json_value()
            if value == 'video_start':
                print(f'start to play video,{time.time()}')
            if value == "video_end":
                print(f"video is end, start to close browser, {time.time()}")
                await browser.close()

    page.on("console", print_args)

    video_name = await page.video.path()
    print(f'video name: {video_name}')

    await page.wait_for_timeout(60 * 60 * 1000)


async def main():
    async with async_playwright() as playwright:
        await run(playwright)


asyncio.run(main())

Linux部署

运行报错: Unable to open X display.

参考:链接