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 自动化测试

业务价值

  1. 保障核心业务 - 确保关键功能始终可用
  2. 提高开发效率 - 自动回归测试,减少手动测试时间
  3. 提升发布信心 - 频繁发布而不担心破坏现有功能
  4. 保证用户体验 - 跨浏览器、跨设备一致性
  5. 控制成本 - 预防线上故障,降低修复成本

技术价值

  1. 早期发现问题 - 在开发阶段发现缺陷
  2. 持续集成 - 与 CI/CD 流程无缝集成
  3. 可重复性 - 测试结果一致,不受人为因素影响
  4. 扩展性 - 支持大规模测试执行
  5. 文档化 - 测试代码作为活的文档

最佳实践

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

故障排除

常见问题

  1. Playwright 安装失败 bash # 设置镜像源 set PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright pwsh bin/Debug/net8.0/playwright.ps1 install

  2. 浏览器启动失败 csharp // 增加超时时间 await playwright.Chromium.LaunchAsync(new() { Timeout = 60000, Headless = true });

  3. 元素定位失败 ```csharp // 增加等待时间 await page.ClickAsync("#button", new() { Timeout = 10000 });

// 或使用显式等待 await page.WaitForSelectorAsync("#button", new() { State = WaitForSelectorState.Visible }); ```

总结

Web 自动化测试在现代软件开发中扮演着至关重要的角色。通过使用 Playwright for .NET 这样的强大框架,开发团队可以:

  1. 提高质量 - 自动发现潜在问题
  2. 加速交付 - 快速验证功能变更
  3. 降低风险 - 预防生产环境故障
  4. 改善协作 - 明确的功能定义和验证标准

本指南提供的工具和技术可以帮助团队构建可靠的自动化测试体系,为业务成功提供坚实的技术保障。


文档最后更新:2024年
基于 Microsoft Edge 和 Playwright for .NET 的最新版本整理