Web 自动化测试与浏览器自动化工具指南
文档概述
本文档整理了关于 Microsoft Edge 浏览器命令行操作、Playwright for .NET 自动化框架以及现代 Web 自动化测试应用场景的完整指南。内容涵盖从基础命令到高级应用的各个方面。
目录
Edge 浏览器命令行操作
基础启动命令
常用启动方式
# 基础启动
msedge
start msedge
# 使用完整路径(备用)
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
带参数启动示例
# 启动并打开特定网页
start msedge https://www.example.com
# 隐身模式启动
start msedge --inprivate
# 应用模式启动(无浏览器框架)
start msedge --app=https://web.whatsapp.com
常用命令行参数
| 参数 | 说明 | 示例 |
|---|---|---|
--inprivate |
隐身模式 | msedge --inprivate |
--app=URL |
应用模式 | msedge --app=https://app.example.com |
--start-maximized |
启动最大化 | msedge --start-maximized |
--window-size=W,H |
设置窗口尺寸 | msedge --window-size=800,600 |
--headless |
无头模式 | msedge --headless |
--remote-debugging-port |
远程调试端口 | msedge --remote-debugging-port=9222 |
--user-data-dir |
自定义用户数据目录 | msedge --user-data-dir=C:\edge-profile |
PDF 相关参数
# PDF 打印命令(注意:--no-pdf-header 可能不总是有效)
msedge --headless --disable-gpu --print-to-pdf="output.pdf" --no-pdf-header https://www.example.com
Playwright for .NET 框架
框架简介
Playwright for .NET 是一个跨浏览器自动化框架,支持 Chromium、Firefox 和 WebKit,提供强大的浏览器控制和测试功能。
安装与配置
1. 安装 NuGet 包
dotnet add package Microsoft.Playwright
2. 安装浏览器二进制文件
# 方法一:通过命令行
pwsh bin/Debug/netX.X/playwright.ps1 install
# 方法二:通过代码
Microsoft.Playwright.Program.Main(new[] { "install" });
3. 项目配置
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Playwright" Version="1.42.0" />
</ItemGroup>
</Project>
核心功能
浏览器控制
using var playwright = await Playwright.CreateAsync();
// 多浏览器支持
await using var chromium = await playwright.Chromium.LaunchAsync();
await using var firefox = await playwright.Firefox.LaunchAsync();
await using var webkit = await playwright.Webkit.LaunchAsync();
// 启动选项配置
await using var browser = await playwright.Chromium.LaunchAsync(new()
{
Headless = false, // 显示界面
SlowMo = 100, // 慢动作调试
Timeout = 30000 // 超时设置
});
页面导航
var page = await browser.NewPageAsync();
// 基本导航
await page.GotoAsync("https://example.com");
// 带选项的导航
await page.GotoAsync("https://example.com", new()
{
WaitUntil = WaitUntilState.NetworkIdle,
Timeout = 60000
});
元素定位与交互
// 多种定位方式
await page.ClickAsync("button#submit"); // CSS 选择器
await page.ClickAsync("//button[text()='Submit']"); // XPath
await page.ClickAsync("text=Login"); // 文本内容
// 输入操作
await page.FillAsync("input[name='email']", "test@example.com");
await page.TypeAsync("#search", "keyword", new() { Delay = 100 });
// 键盘操作
await page.PressAsync("#input", "Enter");
PDF 生成功能
// 从 HTML 文件生成 PDF
await page.GotoAsync($"file:///{htmlFilePath}");
await page.PdfAsync(new PagePdfOptions
{
Path = "output.pdf",
DisplayHeaderFooter = false, // 禁用页眉页脚
PrintBackground = true,
Format = "A4",
Margin = new Margin { Top = "1cm", Right = "1cm", Bottom = "1cm", Left = "1cm" }
});
// 从 HTML 字符串生成 PDF
string htmlContent = "<h1>文档标题</h1><p>内容...</p>";
await page.SetContentAsync(htmlContent);
await page.PdfAsync(new() { Path = "output.pdf" });
截图功能
// 全屏截图
await page.ScreenshotAsync(new() { Path = "screenshot.png" });
// 元素截图
await page.Locator(".widget").ScreenshotAsync(new() { Path = "widget.png" });
// 完整页面截图
await page.ScreenshotAsync(new()
{
Path = "fullpage.png",
FullPage = true,
Type = ScreenshotType.Png
});
高级功能
网络请求拦截
// 拦截请求
await page.RouteAsync("**/*", async route =>
{
if (route.Request.ResourceType == "image")
await route.AbortAsync(); // 阻止图片加载
else
await route.ContinueAsync();
});
文件处理
// 文件上传
await page.SetInputFilesAsync("#file-input", "path/to/file.pdf");
// 文件下载监听
var download = await page.RunAndWaitForDownloadAsync(async () =>
{
await page.ClickAsync("#download-btn");
});
await download.SaveAsAsync("downloaded-file.pdf");
设备模拟
// 模拟 iPhone
var iPhone = playwright.Devices["iPhone 12"];
var context = await playwright.Chromium.LaunchPersistentContextAsync("", new()
{
...iPhone
});
Web 自动化测试应用场景
场景一:电商网站测试
防止购物车、支付流程等核心功能出现故障。
public async Task 购物车完整流程测试()
{
// 添加商品
await page.ClickAsync("text=加入购物车");
await Expect(page.Locator(".cart-count")).ToHaveTextAsync("1");
// 应用优惠券
await page.FillAsync("[data-testid=coupon-input]", "DISCOUNT10");
await page.ClickAsync("text=使用优惠券");
// 验证价格计算
var finalPrice = await page.TextContentAsync(".final-price");
Assert.Equal("¥900", finalPrice);
}
场景二:金融系统测试
确保利率计算准确性和安全性。
public async Task 贷款利率计算测试()
{
// 输入贷款信息
await page.FillAsync("#loan-amount", "100000");
await page.SelectOptionAsync("#loan-term", "36");
await page.ClickAsync("#calculate");
// 验证计算结果
var monthlyPayment = await page.TextContentAsync(".monthly-payment");
Assert.Equal("¥3,248.76", monthlyPayment); // 精确到分
}
场景三:SaaS 产品测试
保障核心业务功能的连续性。
public async Task 设计文件全流程测试()
{
// 创建设计
await page.ClickAsync("[data-testid=create-new]");
await page.WaitForSelectorAsync(".canvas-area");
// 添加内容
await page.DragAndDropAsync(".image-element", ".canvas");
await page.FillAsync(".text-element", "设计标题");
// 保存并验证
await page.ClickAsync("text=保存");
await Expect(page.Locator(".save-status")).ToHaveTextAsync("已保存");
}
场景四:跨浏览器兼容性测试
确保在所有浏览器上一致运行。
[Theory]
[InlineData("chromium")]
[InlineData("firefox")]
[InlineData("webkit")]
public async Task 跨浏览器布局一致性测试(string browserType)
{
await using var browser = await playwright[browserType].LaunchAsync();
var page = await browser.NewPageAsync();
await page.GotoAsync("https://our-website.com");
// 验证关键功能
await page.FillAsync("#contact-form input", "test@example.com");
await page.ClickAsync("#submit");
await Expect(page.Locator(".success-message")).ToBeVisibleAsync();
}
场景五:性能监控
检测页面性能退化。
public async Task 关键页面性能测试()
{
var stopwatch = Stopwatch.StartNew();
await page.GotoAsync("/home", new() {
WaitUntil = WaitUntilState.NetworkIdle
});
stopwatch.Stop();
Assert.True(stopwatch.ElapsedMilliseconds < 2000,
"首页加载应小于2秒");
}
为什么需要 Web 自动化测试
业务价值
- 保障核心业务 - 确保关键功能始终可用
- 提高开发效率 - 自动回归测试,减少手动测试时间
- 提升发布信心 - 频繁发布而不担心破坏现有功能
- 保证用户体验 - 跨浏览器、跨设备一致性
- 控制成本 - 预防线上故障,降低修复成本
技术价值
- 早期发现问题 - 在开发阶段发现缺陷
- 持续集成 - 与 CI/CD 流程无缝集成
- 可重复性 - 测试结果一致,不受人为因素影响
- 扩展性 - 支持大规模测试执行
- 文档化 - 测试代码作为活的文档
最佳实践
1. 测试设计原则
- 原子性:每个测试独立运行
- 可维护性:使用 Page Object 模式
- 可靠性:减少 flaky tests
- 快速执行:优化测试执行时间
2. 代码组织
// Page Object 模式示例
public class LoginPage
{
private readonly IPage _page;
public LoginPage(IPage page) => _page = page;
public ILocator UsernameInput => _page.Locator("#username");
public ILocator PasswordInput => _page.Locator("#password");
public ILocator LoginButton => _page.Locator("#login-btn");
public async Task LoginAsync(string username, string password)
{
await UsernameInput.FillAsync(username);
await PasswordInput.FillAsync(password);
await LoginButton.ClickAsync();
}
}
3. CI/CD 集成
# GitHub Actions 示例
name: Playwright Tests
on: [push]
jobs:
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
- run: dotnet restore
- run: dotnet build
- run: pwsh bin/Debug/net8.0/playwright.ps1 install
- run: dotnet test
故障排除
常见问题
-
Playwright 安装失败
bash # 设置镜像源 set PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright pwsh bin/Debug/net8.0/playwright.ps1 install -
浏览器启动失败
csharp // 增加超时时间 await playwright.Chromium.LaunchAsync(new() { Timeout = 60000, Headless = true }); -
元素定位失败 ```csharp // 增加等待时间 await page.ClickAsync("#button", new() { Timeout = 10000 });
// 或使用显式等待 await page.WaitForSelectorAsync("#button", new() { State = WaitForSelectorState.Visible }); ```
总结
Web 自动化测试在现代软件开发中扮演着至关重要的角色。通过使用 Playwright for .NET 这样的强大框架,开发团队可以:
- 提高质量 - 自动发现潜在问题
- 加速交付 - 快速验证功能变更
- 降低风险 - 预防生产环境故障
- 改善协作 - 明确的功能定义和验证标准
本指南提供的工具和技术可以帮助团队构建可靠的自动化测试体系,为业务成功提供坚实的技术保障。
文档最后更新:2024年
基于 Microsoft Edge 和 Playwright for .NET 的最新版本整理