目录

Puppeteer

Puppeteer Sharp 原生支持 DevTools 协议,可以驱动应用程序已嵌入的浏览器。本教程介绍连接代码,以及该连接不涵盖的内容。

Puppeteer Sharp 是 Puppeteer 的 .NET 移植版本。它原生支持 Chrome DevTools Protocol(即 CDP),因此只需端点 URL 即可连接到 DotNetBrowser。

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

前提条件 

在运行该场景的项目中引用 PuppeteerSharp NuGet 包。

Puppeteer Sharp 可以通过 BrowserFetcher 下载 Chromium 版本。此处无需执行该步骤,因为它所驱动的浏览器就是应用程序已经运行的浏览器。

启动端点 

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

连接 Puppeteer 

将 ConnectOptions.BrowserURL 指向该端点:

C#
VB

ConnectOptions options = new ConnectOptions
{
    BrowserURL = $"http://127.0.0.1:{RemoteDebuggingPort}",
};

Dim options As New ConnectOptions With {
        .BrowserURL = $"http://127.0.0.1:{RemoteDebuggingPort}"
        }

然后将这些选项传递给 Puppeteer.ConnectAsync,并操作已经打开的页面:

C#
VB

PuppeteerSharp.IBrowser browser =
    await PuppeteerSharp.Puppeteer.ConnectAsync(options);

await browser.DefaultContext.OverridePermissionsAsync(LocationUrl, new[]
{
    OverridePermission.Geolocation
});

IPage page = (await browser.PagesAsync()).FirstOrDefault();
await page.GoToAsync(LocationUrl);
await page.WaitForSelectorAsync("title");

await page.SetGeolocationAsync(new GeolocationOption
{
    Latitude = 42.746635M, Longitude = -75.770045M
});
await (await page.QuerySelectorAsync("#map")).ScrollIntoViewAsync();

Dim puppeteerBrowser As IBrowser =
        Await PuppeteerSharp.Puppeteer.ConnectAsync(options)

Await puppeteerBrowser.DefaultContext.OverridePermissionsAsync(
    LocationUrl,
    New OverridePermission() {OverridePermission.Geolocation}
    )

Dim page As IPage = (Await puppeteerBrowser.PagesAsync()).FirstOrDefault()
Await page.GoToAsync(LocationUrl)
Await page.WaitForSelectorAsync("title")

Await page.SetGeolocationAsync(New GeolocationOption With {
                                  .Latitude = 42.746635D,
                                  .Longitude = - 75.770045D
                                  })
Await (Await page.QuerySelectorAsync("#map")).ScrollIntoViewAsync()

ConnectAsync 连接到正在运行的引擎,并返回一个浏览器对象。PagesAsync 返回引擎中已经打开的页面;示例使用其中的第一个页面,即 BrowserView 控件中显示的页面。

该连接不涵盖的内容 

Puppeteer 并不拥有该浏览器进程,因此其 API 中以拥有浏览器进程为前提的部分并不适用。DotNetBrowser 不支持 NewPageAsync,因为浏览器是通过其他方式创建的:您的应用程序通过 IEngine.CreateBrowser 创建浏览器,而页面会打开弹出窗口。用于配置 Puppeteer 自行启动的浏览器的启动选项在这里同样不起作用。

线程与生命周期 

示例在调用 Navigation.LoadUrl 后立即通过后台任务开始连接,因此 Puppeteer 建立连接时,引擎已经在运行。Puppeteer 调用是异步的,并且在 UI 线程之外运行;在操作控件之前,请先将结果封送回 UI 线程。

IBrowser 名称冲突 

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

using IBrowser = DotNetBrowser.Browser.IBrowser;

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

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