目录

Playwright

Playwright for .NET 可以附加到应用程序已嵌入的浏览器上。本教程介绍连接代码以及 CDP 模式的限制。

Playwright 通常管理自己的浏览器版本。它也支持通过 Chrome DevTools Protocol(即 CDP)连接到正在运行的 Chromium;Playwright 正是通过这种方式连接到 DotNetBrowser。

请先阅读 DevTools 协议,了解适用于所有自动化工具的通用规则。

前提条件 

在运行该场景的项目中引用 Microsoft.Playwright NuGet 包。

由于 Playwright 连接的是已经存在的浏览器,因此无需运行 playwright install。其基于 Node 的驱动程序仍然不可或缺,但 NuGet 包会将该驱动程序与应用程序一起部署。

启用端点 

按照 DevTools 协议 中的说明,在创建引擎时将 RemoteDebuggingPort 设置为一个空闲端口。示例使用 9223。

连接 Playwright 

创建 Playwright 实例并将其连接到该端点:

C#
VB

using IPlaywright playwright = await Microsoft.Playwright.Playwright.CreateAsync();

// 使用 CDP 连接到浏览器
Microsoft.Playwright.IBrowser playwrightBrowser =
    await playwright.Chromium
                    .ConnectOverCDPAsync($"http://localhost:{RemoteDebuggingPort}");

IBrowserContext browserContext = playwrightBrowser.Contexts[0];
await browserContext.GrantPermissionsAsync(new[] { "geolocation" });
await browserContext.SetGeolocationAsync(new Geolocation
{
    Latitude = 42.746635f,
    Longitude = -75.770045f
});

IPage page = browserContext.Pages[0];
await page.GotoAsync(LocationUrl);
await page.WaitForSelectorAsync("title");

// 滚动页面,使地图进入可视区域
await page.Locator("#map").ScrollIntoViewIfNeededAsync();

Using _
    playwright As IPlaywright =
        Await Microsoft.Playwright.Playwright.CreateAsync()
    ' 使用 CDP 连接到浏览器
    Dim playwrightBrowser As IBrowser =
            Await _
            playwright.Chromium.ConnectOverCDPAsync(
                $"http://localhost:{RemoteDebuggingPort}")

    Dim browserContext As IBrowserContext = playwrightBrowser.Contexts(0)
    Await browserContext.GrantPermissionsAsync({"geolocation"})
    Await browserContext.SetGeolocationAsync(New Geolocation With {
                                                .Latitude = 42.746635F,
                                                .Longitude = - 75.770045F
                                                })

    Dim page As IPage = browserContext.Pages(0)
    Await page.GotoAsync(LocationUrl)
    Await page.WaitForSelectorAsync("title")

    ' 滚动页面,使地图进入可视区域
    Await page.Locator("#map").ScrollIntoViewIfNeededAsync()
End Using

ConnectOverCDPAsync 接收端点 URL(此处为 http://localhost:9223),并返回一个由正在运行的引擎提供支持的浏览器对象。

接下来,示例使用 Contexts[0] 和 Pages[0],而不是创建新的上下文或页面。它们就是应用程序已经显示的上下文和页面,因此该场景执行的所有操作都可以在 BrowserView 控件中看到。

CDP 模式的支持范围 

Playwright 文档指出,与 Playwright 自有协议相比,CDP 连接的功能完整性较低。页面级自动化可以照常运行,但存在以下两项限制:

  • Playwright 通常会使用一组固定的命令行开关启动 Chromium,并假定这些开关已经生效。DotNetBrowser 使用另一组开关启动 Chromium,因此,依赖其中某个开关的 Playwright 功能在此处的行为可能有所不同。有关详细信息,请参阅 Playwright 文档。
  • 任何以 Playwright 拥有浏览器进程为前提的功能——例如关闭浏览器、启动选项以及基于这些功能构建的工具——均不适用。

如果希望由 AI 代理而不是测试代码来操作页面,请将 Playwright MCP 连接到同一端点。MCP servers 教程介绍了相关配置以及 AI 代理特有的限制。

线程与生命周期 

示例会在首次调用 Navigation.LoadUrl 完成后建立连接,因此 Playwright 连接时引擎已经在运行。Playwright 调用是异步的,并且在 UI 线程之外运行;在操作控件之前,请先将结果封送回 UI 线程。

IBrowser 名称冲突 

两个库都定义了 IBrowser 接口。在 C# 中,示例使用别名解决这一冲突:

using IBrowser = DotNetBrowser.Browser.IBrowser;

随后,在需要使用 Microsoft.Playwright.IBrowser 的位置写出其完整名称。VB.NET 示例则对 DotNetBrowser 类型使用完全限定名称,即 DotNetBrowser.Browser.IBrowser。

完整示例可在我们的代码仓库中获取: C#, VB.NET。