正如 #23514 中所讨论的,这是playwright-crx的 PR ,这是一个可以在 Chrome 扩展服务工作线程中运行的 playwright 版本。
为此,它依赖chrome.debugger.sendCommand
/chrome.debugger.onEvent
来实现ConnectionTransport
接口。
可以用作@playwright/experimental-crx
库来创建新的 chrome 扩展。
这是使用playwright-crx的 chrome 扩展的后台服务工作者的简单示例:
import { _crx } from '@playwright/experimental-crx';
const crxPromise = _crx.start({ slowMo: 500 });
chrome.action.onClicked.addListener(async ({ id: tabId }) => {
const crx = await crxPromise;
// tries to connect to the active tab, or creates a new one
const page = await crx.attach(tabId!).catch(() => crx.newPage());
await page.goto('https://demo.playwright.dev/todomvc/#/');
await page.getByPlaceholder('What needs to be done?').click();
await page.getByPlaceholder('What needs to be done?').fill('Hello World!');
await page.getByPlaceholder('What needs to be done?').press('Enter');
// page stays open, but no longer controlled by playwright
await crx.detach(page);
});
更完整的示例可以在 中找到example/todomvc-crx
。
大多数playwright-crx测试都在tests/crx/test-extension
.它的后台 Service Worker 接收带有一些固定装置(当时有限,请参阅 参考资料crxFixtureRunner.ts
)的序列化测试方法并运行它。
为了在模式下运行测试crx
,我创建了一个新的 npm 脚本:npm run xtest
。
即使有一些限制(类似于page.evaluate
),它已经通过了超过 1k 次测试。
然而,这是需要很大改进的地方:
- 如果在测试函数之外声明函数或变量,测试将不会运行
- 测试运行缓慢,因为它需要使用我们的测试 chrome 扩展为每个测试重新启动一个新的持久上下文
- 目前固定装置非常有限
我决定将记录器 chrome 扩展集成到packages/recorder
.
这样,该应用程序将继续像以前一样工作,但现在也可以作为 Chrome 扩展安装。
对原始应用程序的唯一更改只是一个内容脚本,用于在检测到扩展后台服务工作线程在 Chrome 扩展上下文中运行时与其进行通信。
在chrome扩展功能方面,它提供了:
- 用于将当前选项卡附加到记录器中的操作按钮(如果记录器关闭,则会打开记录器)
- 出于相同目的的上下文菜单
- 页面必须明确附加才能录制,除非从已附加的页面打开它们
- 关闭记录器窗口将分离所有页面并卸载注入的脚本(突出显示和事件侦听器)
这是一个更新的视频(我用来录制视频的应用程序存在鼠标位置错误):
https://github.com/microsoft/playwright/assets/1374559/3c67d830-3eb2-48f5-b409-28354c101b87
记录仪测试在模式下,测试tests/library/inspector
也会作为 chrome 扩展针对记录器运行crx
。
它使用我们的记录器 chrome 扩展启动持久上下文,然后使用 chrome 剧作家页面附加到其选项卡。
请注意,它使用 playwright chrome 风格而不是 crx 风格来自动化这些特定测试,但记录的指令由crx
.请参阅inspectorTests.ts
了解更多详情。
除剧作家捆绑包外,大部分require
s 均已替换为相应的import
s。对于这些,我创建了一个 vite 插件来替换BundleImpl
编译时导入对应的需求
请参阅packages/playwright-crx/vite.config.ts
了解更多详情。
为了编译和运行playwright-crx,我必须依赖 shims/polyfills。
以下是它使用的当前填充程序库的列表(在 中声明packages/playwright-crx/package.json
):
- @isomorphic-git/lightning-fs
- 断言
- browserify-zlib
- 缓冲
- 加密浏览器
- 事件
- https-browserify - 不可用
- 操作系统浏览器
- 小路
- 过程
- 可读流
- 立即设置
- 流-http
- 网址
- 实用程序
我还在 下创建了一些垫片packages/playwright-crx/src/shims
,主要带有noop
函数。
参考文献:#23514