接口文档
常用API操作
如何指定chrome的userDataDir?
如果在args中指定,会报下面的错误:playwright._impl._api_types.Error: Pass userDataDir parameter instead of specifying --user-data-dir argument
正确方法如下:
with sync_playwright() as playwright:
self.__browser = playwright.chromium.launch_persistent_context(configs['chrome_user_data_dir'],
headless=configs['record_headless'],
executable_path=configs['ext_chrome_path'])
print(f'start to load page,{time.time()}')
self.recordInfo.status = RecordStatus.page_start
self.start_load_timer()
page = self.__browser.new_page()
page.goto(param['url'])
更多参数,参考:链接
如何去掉提示:Chrome正受到自动测试软件的控制
代码如下:
如何启动指定的插件?
NOTE Extensions in Chrome / Chromium currently only work in non-headless mode. 参考:https://playwright.dev/docs/1.3.0/api/working-with-chrome-extensions/
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启动参数?
webkit = playwright.chromium
browser = webkit.launch(headless=False, devtools=True, args=['--auto-select-desktop-capture-source=Sharing'])
context = browser.new_context(record_video_dir="../record/", record_video_size={"width": 1920, "height": 1080},
viewport={"width": 1920, "height": 1080})
在args中指定具体的chrome参数,可选的参数有:链接
如何模拟按钮点击?
主要代码如下:
# 等待分享视频按钮能看到
page.wait_for_selector('#share-screen')
# 点击分享屏幕按钮
page.click("#share-screen")
下面是完整代码:
from playwright.sync_api import sync_playwright
def run(playwright):
# webkit = playwright.firefox
webkit = playwright.chromium
# devtools=True 开启调试窗口
browser = webkit.launch(headless=False, devtools=True, args=['--auto-select-desktop-capture-source=Sharing'])
context = 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 = context.new_page()
page.goto("https://www.webrtc-experiment.com/Pluginfree-Screen-Sharing/#8249560123750639")
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)
# 等待分享视频按钮能看到
page.wait_for_selector('#share-screen')
# 点击分享屏幕按钮
page.click("#share-screen")
page.wait_for_timeout(10040 * 1000)
with sync_playwright() as playwright:
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会有一些不同,需要注意处理。
问题:录制视频的时候,是否需要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.
参考:链接