.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();
}

四、常见问题&注意事项

  1. Headless 模式:生产环境建议设为 Headless = true(无界面),调试时设为 false
  2. 超时设置:默认操作超时30秒,可全局设置:page.SetDefaultTimeout(60000);(60秒)。
  3. 元素等待:Playwright 自动等待元素可交互,无需手动 Thread.Sleep(),如需强制等待用 await Task.Delay()
  4. 浏览器复用:如果需要多次操作,可复用浏览器实例(避免重复启动),但注意多线程安全。

总结

  1. 核心流程:创建 Playwright 实例 → 启动浏览器 → 创建页面 → 定位元素 → 交互操作 → 释放资源。
  2. 元素操作核心:优先使用 Locator 定位元素,支持 CSS/XPath/文本等多种方式,交互操作(Fill/Click/Check 等)自动等待元素就绪。
  3. 关键优势:跨浏览器支持、自动等待、异步友好、内置截图/网络监听等功能,是.NET Core 中做网页自动化的首选工具。
posted @ 2026-03-23 16:15  耿中伟  阅读(151)  评论(0)    收藏  举报