Web / Playwright SDK
@midscene/web/playwright 提供绑定 Playwright 页面或 BrowserContext 的 Agent。两种 Agent 都继承基础 Agent 的 AI 方法,并支持 Web 配置选项。
导入与 API 概览
以下签名中的 Page、BrowserContext 来自 playwright;配置类型来自 @midscene/web/playwright。
PlaywrightPageAgent
page:必填,已有的 Playwright 页面。未传入时抛出错误。options:可选,支持通用 Agent 配置和下方的 Web 配置。
Agent 绑定传入的页面。默认 forceSameTabNavigation: true,会拦截 window.open 和 target="_blank" 链接,使其在当前页面打开。设为 false 后保留新标签页行为,但 Agent 不会自动切换到新页面。
PlaywrightBrowserAgent
context:必填,用于监听页面创建事件、列出和创建页面的 BrowserContext。initialPage:必填,初始 active page,应使用该 context 中的页面。options:可选,支持通用 Agent 配置、Web 配置和下面的专属选项。
未传入 context 或 initialPage 时抛出错误。Browser Agent 不接受 forceSameTabNavigation;即使通过 JavaScript 传入 false 也会报错。
PlaywrightBrowserAgent.create()
异步创建 Agent。初始页面按以下顺序选择:options.initialPage → context.pages()[0] → await context.newPage()。
专属配置
页面管理 API
以下属性和方法仅属于 PlaywrightBrowserAgent。
activePage
只读属性,返回当前 AI 操作使用的 Playwright 页面。使用 setActivePage() 切换。
pages()
返回绑定 context 中的页面,不改 变 active page。
newPage()
在绑定的 context 中创建页面,将其设为 active page,并返回该页面。
setActivePage()
将指定页面设为 active page,并尝试将其置于前台。传入无效或已关闭的页面时抛出错误。应传入绑定 context 中的页面。
waitForNewPage()
先监听 context 的新页面事件,再执行可选的 action,返回监听到的新页面。options.timeout 覆盖本次等待时间,单位毫秒;默认使用 newPageTimeout。超时或 action 失败时抛出错误。
此方法本身不会切换 active page。若设置了 autoFollowNewPage: true,独立的新页面监听器仍会自动切换。需要显式控制切换时,保持该选项为 false:
配置选项
除下表外,两种 Agent 均接受通用 Agent 配置,例如模型、报告和缓存配置。
inputStrategy: 'bulk' 要求不设置 keyboardTypeDelay 或将其设为 0。需要延迟输入时使用 'sequential'。等待业务界面就绪时,使用 aiWaitFor() 或 Playwright 自身的等待 API。
生命周期
两种 Agent 都遵循通用 destroy() 约定:等待相关操作完成,清理 Agent 持有的资源、调用内部 Device 的 destroy(),并完成报告处理。Browser Agent 还会移除自动跟随新页面的监听器。
Playwright Device 的 destroy() 不关闭传入的 Page、BrowserContext 或 Browser,也不主动断开远程浏览器连接。由调用方管理这些 Playwright 资源;销毁 Agent 后,页面和浏览器仍可继续使用。
浏览器支持与限制
推荐使用 Chromium。部分能力依赖 CDP,包括浏览器级事件、触摸手势和部分交互的 fallback 路径。Firefox 和 WebKit 可能支持基础 Playwright 操作,但依赖 CDP 的能力可能报错。
远程浏览器
Agent 接受已有的 Playwright 页面,创建方式与本地浏览器一致。例如使用 CDP 连接后:
连接、身份验证和浏览器关闭由调用方管理。
获取 CDP WebSocket URL
你可以从多种来源获取 CDP WebSocket URL:
- BrowserBase:在 https://browserbase.com 注册并获取你的 CDP URL
- Browserless:使用 https://browserless.io 或运行你自己的实例
- 本地 Chrome:使用
--remote-debugging-port=9222参数运行 Chrome,然后使用ws://localhost:9222/devtools/browser/... - Docker:在 Docker 容器中运行 Chrome 并暴露调试端口
FAQ
Playwright 下载浏览器耗时太久
Playwright 在 pnpm install 时默认不会下载浏览器镜像,需要单独执行 pnpm exec playwright install。网络较慢时,可以使用代理镜像,或只下载 Chromium:
下拉框点击不到
原生 select 的选项可能由操作系统 渲染,无法被 Playwright 截图捕捉。先检查报告截图中是否有下拉选项。
默认开启的 forceChromeSelectRendering 会强制使用 Chrome 的 base-select 样式,使选项出现在截图中。样式可能与系统默认样式不同;设置为 false 可恢复原生渲染。
浏览器界面持续闪动
本地可视化界面持续闪烁,通常是因为 deviceScaleFactor 与系统或浏览器的像素比不匹配。该现象不影响 Midscene 截图或自动化运行,但会影响本地预览。
将 deviceScaleFactor 设置为浏览器的 window.devicePixelRatio:
Playwright 不支持像 Puppeteer 一样使用 0 自动适配。可在浏览器控制台输入 window.devicePixelRatio 查看实际值。
自定义网络超时
waitForNetworkIdleTimeout 对 Playwright 不生效。waitForNavigationTimeout 只控制页面 html 元素的等待时间,不保证应用就绪。具体行为见配置选项。
Puppeteer 的 waitForNetworkIdleTimeout 默认为 2000 毫秒,设为 0 可关闭检查。参阅默认等待策略。
截图时报 waiting for fonts to load 或 page.screenshot: Timeout ... exceeded
Playwright 截图时默认等待字体加载。在 CI、容器或网络较慢的环境中,字体加载可能导致截图超时:
可以通过环境变量跳过等待:
也可以只为当前命令设置:
相关说明见 Playwright issue。

