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 获取标题
在第一个例子中,我们获取网页的标题。
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 标头
下一个示例将标头添加到请求中。
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 创建屏幕截图
下一个示例创建网页的屏幕截图。
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 方法单击与选择器匹配的元素。
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 方法查找与指定选择器匹配的第一个元素。
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 事件处理程序。
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 库来自动化浏览器。
作者
列出所有 C# 教程。