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# 教程。