You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于runsettings手动实例化Playwright的IBrowser?

手动实例化IBrowser并读取RunSettings配置的解决方案

当继承PageTest类时,IBrowser会自动通过runsettings完成配置,但如果需要在AssemblyInitialize方法中手动创建IBrowser,硬编码的playwright.Chromium.LaunchAsync()会忽略runsettings里指定的浏览器(比如firefox)。以下是实现动态读取runsettings配置、创建对应浏览器实例的解决方案:


实现步骤

1. 读取RunSettings中的Playwright配置

通过解析runsettings的XML文件,提取<Playwright>节点下的浏览器名称和启动选项,确保配置与runsettings完全同步。

2. 动态初始化浏览器实例

根据读取到的配置,选择对应浏览器类型,并应用启动选项,同时在AssemblyInitialize中完成全局初始化,避免重复创建实例。


完整代码示例

全局初始化类(AssemblyInitialize)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Playwright;
using System.Xml.Linq;

[TestClass]
public class BrowserAssemblyInitializer
{
    private static IBrowser _globalBrowser;
    private static IPlaywright _playwright;

    [AssemblyInitialize]
    public static void InitializeGlobalBrowser(TestContext testContext)
    {
        // 获取runsettings文件路径
        var runSettingsPath = testContext.Properties["RunSettingsFile"]?.ToString() 
            ?? Path.Combine(Directory.GetCurrentDirectory(), "../../../YourTestConfig.runsettings");

        // 解析XML配置
        var doc = XDocument.Load(runSettingsPath);
        var playwrightNode = doc.Root?.Element("Playwright") 
            ?? throw new InvalidOperationException("RunSettings中未配置Playwright节点");

        // 提取浏览器名称
        var targetBrowser = playwrightNode.Element("BrowserName")?.Value.ToLower() ?? "chromium";

        // 解析启动选项
        var launchOptionsNode = playwrightNode.Element("LaunchOptions");
        var launchOptions = new BrowserTypeLaunchOptions();
        if (launchOptionsNode != null)
        {
            if (bool.TryParse(launchOptionsNode.Element("Headless")?.Value, out var headless))
                launchOptions.Headless = headless;
            launchOptions.Channel = launchOptionsNode.Element("Channel")?.Value;
        }

        // 初始化Playwright和浏览器
        _playwright = Playwright.CreateAsync().GetAwaiter().GetResult();
        _globalBrowser = targetBrowser switch
        {
            "firefox" => _playwright.Firefox.LaunchAsync(launchOptions).GetAwaiter().GetResult(),
            "webkit" => _playwright.Webkit.LaunchAsync(launchOptions).GetAwaiter().GetResult(),
            _ => _playwright.Chromium.LaunchAsync(launchOptions).GetAwaiter().GetResult()
        };
    }

    [AssemblyCleanup]
    public static void CleanupGlobalBrowser()
    {
        _globalBrowser?.CloseAsync().GetAwaiter().GetResult();
        _playwright?.Dispose();
    }

    // 提供给测试类获取全局浏览器的方法
    public static IBrowser GetGlobalBrowser() => _globalBrowser;
}

测试类使用示例

[TestClass]
public class UnitTest1
{
    private IBrowserContext _context;
    private IPage _page;

    [TestInitialize]
    public void SetupTest()
    {
        var browser = BrowserAssemblyInitializer.GetGlobalBrowser();
        _context = browser.NewContextAsync().GetAwaiter().GetResult();
        _page = _context.NewPageAsync().GetAwaiter().GetResult();
    }

    [TestCleanup]
    public void TeardownTest()
    {
        _context?.CloseAsync().GetAwaiter().GetResult();
    }

    [TestMethod]
    public async Task HomepageHasPlaywrightInTitleAndValidGetStartedLink()
    {
        await _page.GotoAsync("https://playwright.dev");

        // 验证标题包含Playwright
        await Expect(_page).ToHaveTitleAsync(new Regex("Playwright"));

        // 定位并验证Get Started链接
        var getStarted = _page.Locator("text=Get Started");
        await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/intro");

        // 跳转后验证URL
        await getStarted.ClickAsync();
        await Expect(_page).ToHaveURLAsync(new Regex(".*intro"));
    }
}

关键说明

  • 使用GetAwaiter().GetResult()替代.Result,避免异步操作产生的死锁问题
  • 全局浏览器实例在AssemblyInitialize中仅创建一次,提升测试执行效率
  • 完全遵循runsettings中的配置,支持切换chromium/firefox/webkit及自定义启动选项

内容的提问来源于stack exchange,提问作者Simon20185012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:30:34