WebView2
简介
以下将解释如何使用Playwright与Microsoft Edge WebView2。WebView2是一个WinForms控件,底层会使用Microsoft Edge来渲染网页内容。它是Microsoft Edge浏览器的一部分,可在Windows 10和Windows 11上使用。Playwright可用于自动化WebView2应用程序,并测试WebView2中的网页内容。为了连接WebView2,Playwright使用browserType.connectOverCDP()通过Chrome DevTools协议(CDP)与其建立连接。
概述
可以通过设置环境变量WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS为--remote-debugging-port=9222,或者调用EnsureCoreWebView2Async方法并传入--remote-debugging-port=9222参数,来指示WebView2控件监听传入的CDP连接。这将启用Chrome开发者工具协议的WebView2进程启动,从而允许通过Playwright实现自动化。9222在此处是示例端口,也可以使用任何其他未被占用的端口。
await this.webView.EnsureCoreWebView2Async(await CoreWebView2Environment.CreateAsync(null, null, new CoreWebView2EnvironmentOptions()
{
AdditionalBrowserArguments = "--remote-debugging-port=9222",
})).ConfigureAwait(false);
一旦您的应用程序运行了WebView2控件,您就可以通过Playwright连接到它:
const browser = await playwright.chromium.connectOverCDP('http://localhost:9222');
const context = browser.contexts()[0];
const page = context.pages()[0];
为确保WebView2控件准备就绪,您可以等待CoreWebView2InitializationCompleted事件:
this.webView.CoreWebView2InitializationCompleted += (_, e) =>
{
if (e.IsSuccess)
{
Console.WriteLine("WebView2 initialized");
}
};
编写和运行测试
默认情况下,WebView2控件会为所有实例使用相同的用户数据目录。这意味着如果您并行运行多个测试,它们会相互干扰。为避免这种情况,您应该为每个测试设置不同的WEBVIEW2_USER_DATA_FOLDER环境变量(或使用WebView2.EnsureCoreWebView2Async Method)指向不同文件夹。这样可以确保每个测试都在自己的用户数据目录中运行。
使用以下方法,Playwright将以子进程方式运行您的WebView2应用程序,为其分配唯一的用户数据目录,并将Page实例提供给您的测试:
import { test as base } from '@playwright/test';
import fs from 'fs';
import os from 'os';
import path from 'path';
import childProcess from 'child_process';
const EXECUTABLE_PATH = path.join(
__dirname,
'../../webview2-app/bin/Debug/net8.0-windows/webview2.exe',
);
export const test = base.extend({
browser: async ({ playwright }, use, testInfo) => {
const cdpPort = 10000 + testInfo.workerIndex;
// Make sure that the executable exists and is executable
fs.accessSync(EXECUTABLE_PATH, fs.constants.X_OK);
const userDataDir = path.join(
fs.realpathSync.native(os.tmpdir()),
`playwright-webview2-tests/user-data-dir-${testInfo.workerIndex}`,
);
const webView2Process = childProcess.spawn(EXECUTABLE_PATH, [], {
shell: true,
env: {
...process.env,
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS: `--remote-debugging-port=${cdpPort}`,
WEBVIEW2_USER_DATA_FOLDER: userDataDir,
}
});
await new Promise<void>(resolve => webView2Process.stdout.on('data', data => {
if (data.toString().includes('WebView2 initialized'))
resolve();
}));
const browser = await playwright.chromium.connectOverCDP(`http://127.0.0.1:${cdpPort}`);
await use(browser);
await browser.close();
childProcess.execSync(`taskkill /pid ${webView2Process.pid} /T /F`);
fs.rmdirSync(userDataDir, { recursive: true });
},
context: async ({ browser }, use) => {
const context = browser.contexts()[0];
await use(context);
},
page: async ({ context }, use) => {
const page = context.pages()[0];
await use(page);
},
});
export { expect } from '@playwright/test';
import { test, expect } from './webView2Test';
test('test WebView2', async ({ page }) => {
await page.goto('https://playwright.dev');
const getStarted = page.getByText('Get Started');
await expect(getStarted).toBeVisible();
});
调试
在您的webview2控件内,只需右键点击即可打开上下文菜单并选择"Inspect"以打开开发者工具,或按下F12键。您也可以使用WebView2.CoreWebView2.OpenDevToolsWindow方法以编程方式打开开发者工具。
如需调试测试,请参阅Playwright的调试指南。