.NET Core + Microsoft.Playwright 快速上手教程
.NET Core + Microsoft.Playwright 快速上手教程
Playwright 是微软推出的跨浏览器自动化测试工具,支持 Chromium、Firefox、WebKit,在.NET Core 中使用
Microsoft.Playwright 可以轻松实现网页自动化、爬虫、UI 测试等场景。下面从环境搭建到常用操作,带你快速掌握核心用法。一、环境准备
1. 创建项目并安装依赖
首先创建一个 .NET Core 控制台项目(也可以是测试项目),然后安装 Playwright 包:
# 创建控制台项目(可选)
dotnet new console -n PlaywrightDemo
cd PlaywrightDemo
# 安装 Playwright 核心包
dotnet add package Microsoft.Playwright
# 安装浏览器驱动(首次使用必须执行,会下载 Chromium/Firefox/WebKit)
playwright install
2. 基础代码结构
新建
Program.cs,基础模板如下(.NET 6+ 顶级语句):using Microsoft.Playwright;
// 1. 创建 Playwright 实例
using var playwright = await Playwright.CreateAsync();
// 2. 启动浏览器(可选参数:Headless=false 显示浏览器窗口,方便调试)
await using var browser = await playwright.Chromium.LaunchAsync(new()
{
Headless = false, // 调试时设为 false,生产环境设为 true
SlowMo = 500, // 每个操作延迟 500ms,方便看执行过程
});
// 3. 创建新页面
var page = await browser.NewPageAsync();
// 4. 核心操作(后续示例都基于这个 page 对象)
await page.GotoAsync("https://www.baidu.com");
// 5. 关闭浏览器(using 会自动释放,也可手动关闭)
await browser.CloseAsync();
二、核心常用操作
1. 页面基础操作
|
操作
|
代码示例
|
说明
|
|---|---|---|
|
打开网页
|
await page.GotoAsync("https://xxx.com"); |
跳转到指定 URL,默认等待页面加载完成
|
|
等待页面加载
|
await page.WaitForLoadStateAsync(LoadState.NetworkIdle); |
等待网络空闲(适合异步加载的页面)
|
|
刷新页面
|
await page.ReloadAsync(); |
刷新当前页面
|
|
前进/后退
|
await page.GoForwardAsync();<br>await page.GoBackAsync(); |
浏览器前进/后退
|
|
截图
|
await page.ScreenshotAsync(new() { Path = "screenshot.png", FullPage = true }); |
截取整页截图,保存到指定路径
|
|
保存页面
|
await page.SaveAsAsync("page.html"); |
保存当前页面为 HTML 文件
|
|
设置视图大小
|
await page.SetViewportSizeAsync(1920, 1080); |
设置浏览器窗口大小
|
2. 页面元素定位(核心)
Playwright 支持多种定位方式,优先级推荐:
Locator(最强大)> CSS > XPath > 文本定位。(1)基础定位方法
// 1. 按 CSS 选择器(最常用)
var searchInput = page.Locator("#kw"); // 百度搜索框(id=kw)
var submitBtn = page.Locator("#su"); // 百度搜索按钮(id=su)
// 2. 按 XPath
var searchInputXPath = page.Locator("//input[@id='kw']");
// 3. 按文本(精确匹配)
var loginBtn = page.Locator("text=登录");
// 4. 按文本(包含匹配)
var helpLink = page.Locator("text=/帮助/");
// 5. 按属性
var userNameInput = page.Locator("[name='username']");
(2)高级定位(过滤、嵌套)
// 嵌套定位:先找父元素,再找子元素
var form = page.Locator("#loginForm");
var passwordInput = form.Locator("input[type='password']");
// 过滤:取第N个元素(索引从0开始)
var secondItem = page.Locator(".list-item").Nth(1);
// 过滤:包含文本的元素
var activeTab = page.Locator(".tab").Filter(new() { HasText = "已激活" });
3. 元素交互操作
所有交互操作都基于
Locator 对象,Playwright 会自动等待元素可交互(无需手动加 sleep)。(1)输入/清空文本
// 输入文本(自动清空原有内容)
await searchInput.FillAsync("Playwright .NET Core 教程");
// 逐字符输入(模拟人工输入)
await searchInput.TypeAsync("Playwright .NET Core 教程");
// 清空文本
await searchInput.ClearAsync();
(2)点击操作
// 普通点击
await submitBtn.ClickAsync();
// 双击
await page.Locator(".double-click-btn").DblClickAsync();
// 右键点击
await page.Locator(".context-menu-btn").ClickAsync(new() { Button = MouseButton.Right });
(3)复选框/单选框
// 勾选复选框
await page.Locator("#agree-terms").CheckAsync();
// 取消勾选
await page.Locator("#agree-terms").UncheckAsync();
// 选中单选框
await page.Locator("input[name='gender'][value='male']").CheckAsync();
(4)下拉框(Select)
// 按值选择
await page.Locator("#city-select").SelectOptionAsync(new[] { "beijing" });
// 按文本选择
await page.Locator("#city-select").SelectOptionAsync(new() { Label = "北京" });
// 按索引选择(第2个选项)
await page.Locator("#city-select").SelectOptionAsync(new() { Index = 1 });
(5)键盘操作
// 按下回车(替代点击搜索按钮)
await searchInput.PressAsync("Enter");
// 组合键:Ctrl+A 全选
await searchInput.PressAsync("Control+A");
// 组合键:Ctrl+C 复制
await page.Locator(".result-text").PressAsync("Control+C");
4. 数据提取(获取元素信息)
// 获取元素文本
var btnText = await submitBtn.TextContentAsync();
Console.WriteLine($"按钮文本:{btnText}");
// 获取元素属性(如 href、value)
var inputValue = await searchInput.GetAttributeAsync("value");
Console.WriteLine($"输入框值:{inputValue}");
// 获取元素是否可见
var isVisible = await submitBtn.IsVisibleAsync();
Console.WriteLine($"按钮是否可见:{isVisible}");
// 获取元素是否可点击
var isEnabled = await submitBtn.IsEnabledAsync();
Console.WriteLine($"按钮是否可点击:{isEnabled}");
// 提取页面所有匹配元素的文本
var allItems = await page.Locator(".list-item").AllTextContentsAsync();
foreach (var item in allItems)
{
Console.WriteLine($"列表项:{item}");
}
5. 弹窗处理
Playwright 自动监听弹窗(Alert/Confirm/Prompt),无需手动等待:
// 监听 Alert 弹窗并接受
page.Dialog += (sender, e) =>
{
Console.WriteLine($"弹窗内容:{e.Dialog.Message}");
e.Dialog.AcceptAsync().Wait();
};
// 监听 Confirm 弹窗并取消
page.Dialog += (sender, e) =>
{
if (e.Dialog.Type == DialogType.Confirm)
{
e.Dialog.DismissAsync().Wait();
}
};
// 监听 Prompt 弹窗并输入内容
page.Dialog += (sender, e) =>
{
if (e.Dialog.Type == DialogType.Prompt)
{
e.Dialog.AcceptAsync("自定义输入内容").Wait();
}
};
// 触发弹窗
await page.Locator("#show-alert-btn").ClickAsync();
6. 异步加载/等待操作
针对动态加载的页面,Playwright 提供灵活的等待方式:
// 等待元素出现(最多等5秒)
await page.Locator(".dynamic-element").WaitForAsync(new() { Timeout = 5000 });
// 等待网络请求完成(比如等待接口返回)
var response = await page.WaitForResponseAsync(r => r.Url.Contains("api/data") && r.Ok);
// 等待页面跳转
await page.WaitForURLAsync("https://xxx.com/result");
三、完整示例(百度搜索)
using Microsoft.Playwright;
// 创建 Playwright 实例
using var playwright = await Playwright.CreateAsync();
// 启动 Chromium 浏览器(显示窗口,延迟500ms)
await using var browser = await playwright.Chromium.LaunchAsync(new()
{
Headless = false,
SlowMo = 500
});
// 创建新页面
var page = await browser.NewPageAsync();
// 设置窗口大小
await page.SetViewportSizeAsync(1920, 1080);
try
{
// 打开百度首页
await page.GotoAsync("https://www.baidu.com");
// 定位搜索框并输入内容
var searchInput = page.Locator("#kw");
await searchInput.FillAsync("Playwright .NET Core 教程");
// 定位搜索按钮并点击
var submitBtn = page.Locator("#su");
await submitBtn.ClickAsync();
// 等待搜索结果加载完成(等待网络空闲)
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
// 提取第一个搜索结果的文本
var firstResult = page.Locator(".result-op h3 a").First;
var resultText = await firstResult.TextContentAsync();
Console.WriteLine($"第一个搜索结果:{resultText}");
// 截图保存
await page.ScreenshotAsync(new() { Path = "baidu-result.png", FullPage = true });
}
catch (Exception ex)
{
Console.WriteLine($"执行出错:{ex.Message}");
}
finally
{
// 等待5秒,方便查看结果
await Task.Delay(5000);
// 关闭浏览器
await browser.CloseAsync();
}
四、常见问题&注意事项
- Headless 模式:生产环境建议设为
Headless = true(无界面),调试时设为false。 - 超时设置:默认操作超时30秒,可全局设置:
page.SetDefaultTimeout(60000);(60秒)。 - 元素等待:Playwright 自动等待元素可交互,无需手动
Thread.Sleep(),如需强制等待用await Task.Delay()。 - 浏览器复用:如果需要多次操作,可复用浏览器实例(避免重复启动),但注意多线程安全。
总结
- 核心流程:创建 Playwright 实例 → 启动浏览器 → 创建页面 → 定位元素 → 交互操作 → 释放资源。
- 元素操作核心:优先使用
Locator定位元素,支持 CSS/XPath/文本等多种方式,交互操作(Fill/Click/Check 等)自动等待元素就绪。 - 关键优势:跨浏览器支持、自动等待、异步友好、内置截图/网络监听等功能,是.NET Core 中做网页自动化的首选工具。

浙公网安备 33010602011771号