ZetCode

C# Playwright

最后修改于 2023 年 7 月 5 日

C# Playwright 教程展示了如何使用 Microsoft Playwright 库在 C# 中自动化浏览器。

Playwright

Playwright 是一个由 Microsoft 创建的跨浏览器自动化库。它支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。

Playwright 可用于 Node、Python、.NET 和 JVM。

Playwright 允许在无头模式(默认模式)下使用浏览器,该模式无需 UI 即可工作。 这非常适合脚本编写。

在使用 Playwright 之前,我们需要下载对浏览器的支持。

$ dotnet tool update --global PowerShell

我们更新 PowerShell 工具。

$ playwright.ps1 install

我们需要运行一个脚本来下载 DLL。 该脚本位于 bin/Debug/net6.x 子目录中。

$ dotnet add package Microsoft.Playwright

该编程库通过 dotnet add package 命令安装。

C# Playwright 获取标题

在第一个例子中,我们获取网页的标题。

Program.cs
using Microsoft.Playwright;

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync();

var page = await browser.NewPageAsync();
await page.GotoAsync("http://webcode.me");

var title = await page.TitleAsync();
Console.WriteLine(title);

该示例对网站发出异步请求并检索其标题。

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync();

我们设置 Playwright 和浏览器引擎。

var page = await browser.NewPageAsync();

NewPageAsync 在新的浏览器上下文中创建一个新页面。

await page.GotoAsync("http://webcode.me");

我们使用 GotoAsync 对 webcode.me 创建一个异步请求。

var title = await page.TitleAsync();
Console.WriteLine(title);

网站的标题通过 TitleAsync 检索。

$ dotnet run
My html page

C# Playwright 标头

下一个示例将标头添加到请求中。

Program.cs
using Microsoft.Playwright;
using System.Text;

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync();

var page = await browser.NewPageAsync();

var ehds = new Dictionary<string, string>{ {"User-Agent", "C# program" } };
await page.SetExtraHTTPHeadersAsync(ehds);

var resp = await page.GotoAsync("http://webcode.me/ua.php");
var body = await resp!.BodyAsync();

Console.WriteLine(Encoding.UTF8.GetString(body));

我们将 User-Agent 标头设置为请求。

var ehds = new Dictionary<string, string>{ {"User-Agent", "C# program" } };
await page.SetExtraHTTPHeadersAsync(ehds);

标头值使用 SetExtraHTTPHeadersAsync 设置。

var resp = await page.GotoAsync("http://webcode.me/ua.php");
var body = await resp!.BodyAsync();

Console.WriteLine(Encoding.UTF8.GetString(body));

我们转到 PHP 资源,该资源返回用户代理名称。 我们使用 BodyAsync 从响应正文中检索它。

$ dotnet run
C# program

C# Playwright 创建屏幕截图

下一个示例创建网页的屏幕截图。

Program.cs
using Microsoft.Playwright;

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync(new() { Headless = false });

var page = await browser.NewPageAsync();

await page.GotoAsync("http://webcode.me");
await page.ScreenshotAsync(new() { Path = "screenshot.png" });

屏幕截图使用 ScreenshotAsync 创建。 此外,我们通过将 Headless 选项设置为 false,在 GUI 中运行该程序。

C# Playwright 点击元素

ClickAsync 方法单击与选择器匹配的元素。

Program.cs
using Microsoft.Playwright;

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync();

var page = await browser.NewPageAsync();

await page.GotoAsync("http://example.com");
await page.ClickAsync("a");

var title = await page.TitleAsync();

Console.WriteLine(title);

在该示例中,我们转到一个网站并单击其链接。 该链接将我们导航到另一个网站,我们获取并打印该网站的标题。

$ dotnet run
IANA-managed Reserved Domains

C# Playwright 查找元素

QuerySelectorAllAsync 方法查找页面中与指定选择器匹配的所有元素,而 QuerySelectorAsync 方法查找与指定选择器匹配的第一个元素。

Program.cs
using Microsoft.Playwright;

using var pw = await Playwright.CreateAsync();
await using var browser = await pw.Chromium.LaunchAsync();

var page = await browser.NewPageAsync();

await page.GotoAsync("http://webcode.me");

var es1 = await page.QuerySelectorAllAsync("p");

foreach (var e in es1)
{
    var r = await e.TextContentAsync();
    Console.WriteLine(r);
}

var e2 = await page.QuerySelectorAsync("p");
var r2 = await e2!.TextContentAsync();

Console.WriteLine(r2);

该示例从网页段落中选择文本内容。 元素的文本内容通过 TextContentAsync 检索。

C# Playwright 监视请求和响应

当页面发出请求时,会发出 Request 事件处理程序。 当收到请求的响应时,会发出 Respose 事件处理程序。

Program.cs
using Microsoft.Playwright;

using var playwright = await Playwright.CreateAsync();

var opts = new BrowserTypeLaunchOptions() { Headless = false };
await using var browser = await playwright.Chromium.LaunchAsync(opts);

var page = await browser.NewPageAsync();
page.Request += (_, req) => Console.WriteLine($">> {req.Method} {req.Url}");
page.Response += (_, resp) => Console.WriteLine($"<< {resp.Status} {resp.Url}");

var url = "http://webcode.me";
await page.GotoAsync(url);

我们为每个请求和响应记录一条消息。

$ dotnet run
>> GET http://webcode.me/
<< 200 http://webcode.me/
>> GET http://webcode.me/format.css
<< 200 http://webcode.me/format.css

来源

Playwright 文档

在本文中,我们使用了 Playwright 库来自动化浏览器。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程