你是否还在为Selenium WebDriver的各种兼容性问题而头疼?是否曾因为元素定位不稳定而通宵达旦调试测试脚本?作为一名.NET开发者,我深知这些痛点。今天要介绍的Playwright for .NET,就是为了解决这些传统Web自动化测试中的老大难问题而生的现代化解决方案。
微软开发的这款工具不仅性能更强、更稳定,还天生支持现代Web应用的各种特性。本文将通过实际案例,带你快速上手这个被誉为"Selenium终结者"的自动化测试框架,并创建你的第一个自动化脚本。
Playwright是由微软开发的现代Web自动化测试框架,专为现代Web应用而设计。它支持Chromium、Firefox和Safari三大浏览器引擎,提供了统一的API来进行Web自动化操作。
1. 天生的异步支持
C#// Playwright天生支持async/await模式
await page.GotoAsync("https://www.baidu.com");
await page.FillAsync("#kw", "Playwright");
await page.ClickAsync("#su");
2. 自动等待机制
3. 多浏览器原生支持
C#// 一套代码,多浏览器运行
var browsers = new[] { "chromium", "firefox", "webkit" };
foreach (var browserType in browsers)
{
await using var browser = await playwright[browserType].LaunchAsync();
// 相同的测试逻辑
}
| 特性 | Selenium | Playwright |
|---|---|---|
| 启动速度 | 3-5秒 | 1-2秒 |
| 元素定位 | 需手动等待 | 自动等待 |
| 浏览器支持 | 需额外驱动 | 内置浏览器 |
| 并发能力 | 中等 | 优秀 |
Selenium传统写法:
C#// Selenium需要显式等待
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions
.ElementToBeClickable(By.Id("submit")));
element.Click();
Playwright现代写法:
C#// Playwright自动处理等待
await page.ClickAsync("#submit"); // 就这么简单!
Bash# 添加Playwright包
dotnet add package Microsoft.Playwright
dotnet add package Microsoft.Playwright.NUnit
Bash# 下载并安装浏览器二进制文件,在对应的debug目录下,我这是.net 8
.\playwright.ps1 install

⚠️ 重要提醒:首次运行需要下载约200MB的浏览器文件,建议在网络良好时进行。
C#using Microsoft.Playwright;
Console.WriteLine("Playwright安装验证中...");
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync();
Console.WriteLine("✅ 安装成功!");

C#using Microsoft.Playwright;
namespace AppPlaywright
{
internal class Program
{
static async Task Main(string[] args)
{
System.Console.OutputEncoding = System.Text.Encoding.UTF8;
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync(new()
{
Headless = false,
SlowMo = 1000
});
var page = await browser.NewPageAsync();
try
{
Console.WriteLine("🔍 开始百度搜索自动化演示...");
await page.GotoAsync("https://www.baidu.com");
Console.WriteLine("✅ 成功打开百度首页");
await page.FillAsync("#chat-textarea", "Playwright C# 教程");
Console.WriteLine("✅ 已输入搜索关键词");
await page.WaitForSelectorAsync(".result");
Console.WriteLine("✅ 搜索结果已加载");
var results = await page.QuerySelectorAllAsync(".result h3 a");
Console.WriteLine($"🎉 找到 {results.Count} 个搜索结果");
for (int i = 0; i < Math.Min(5, results.Count); i++)
{
var title = await results[i].InnerTextAsync();
var href = await results[i].GetAttributeAsync("href");
Console.WriteLine($"{i + 1}. {title}");
Console.WriteLine($" 链接: {href}");
Console.WriteLine();
}
await page.ScreenshotAsync(new() { Path = "baidu_search_result.png" });
Console.WriteLine("✅ 截图已保存为 baidu_search_result.png");
}
catch (Exception ex)
{
Console.WriteLine($"❌ 出现错误: {ex.Message}");
}
finally
{
Console.WriteLine("🏁 测试完成,按任意键关闭浏览器...");
Console.ReadKey();
}
}
}
}

1. 浏览器配置技巧
C#var launchOptions = new BrowserTypeLaunchOptions
{
Headless = false, // 开发时建议false,CI/CD时用true
SlowMo = 1000, // 调试时放慢速度
Timeout = 30000, // 启动超时时间
};
2. 元素定位策略
C#// 推荐:使用CSS选择器
await page.ClickAsync("#submit");
// 推荐:使用Playwright内置定位器
await page.Locator("text=搜索").ClickAsync();
// 避免:过于复杂的XPath
// await page.ClickAsync("//div[@class='complex']//span[1]");
3. 异常处理模式
C#try
{
await page.ClickAsync("#button", new() { Timeout = 5000 });
}
catch (TimeoutException)
{
Console.WriteLine("元素未找到,尝试备用方案");
await page.ClickAsync(".backup-button");
}
Program.csdotnet run解决方案:
Bash# 重新安装浏览器
.\playwright.ps1 install
解决方案:这个用过jquery应该都还好。
C#// 使用显式等待
await page.WaitForSelectorAsync("#element", new() {
State = WaitForSelectorState.Visible,
Timeout = 10000
});
解决方案:
C#// 设置全局超时
var context = await browser.NewContextAsync(new() {
ViewportSize = new() { Width = 1920, Height = 1080 },
ExtraHTTPHeaders = new Dictionary<string, string>
{
["Accept-Language"] = "zh-CN,zh;q=0.9"
}
});
通过本文的学习,你已经掌握了Playwright for .NET的基础使用方法。让我们回顾三个核心要点:
下期文章我们将深入探讨**《核心概念解析:Browser、Page、Element三剑客》**,学习如何进行复杂的页面操作和多标签页管理。
💬 互动时间:
欢迎在评论区分享你的想法和经验!如果觉得这篇文章对你有帮助,请转发给更多需要的.NET同行们!
🔥 金句总结:
关注我,获取更多C#实战干货!下篇文章见! 👋
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!