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

如何在C#中对包含Selenium的方法进行排队调用

解决方案

一、通用C#锁实现(适用于所有场景)

用SemaphoreSlim实现串行排队,确保同一时间只有一个Demo方法实例运行,后续调用自动等待:

// 类级别静态信号量,初始仅1个执行许可
private static readonly SemaphoreSlim _demoExecutionLock = new SemaphoreSlim(1, int.MaxValue);

public void Demo()
{
    // 等待获取执行许可,无许可则进入队列
    _demoExecutionLock.Wait();
    try
    {
        int f = 2; 
        driver.Navigate.GoToUrl("www.google.com");
        // 其他Selenium操作写在这里
    }
    finally
    {
        // 无论是否异常,都释放许可让下一个等待的实例执行
        _demoExecutionLock.Release();
    }
}

SemaphoreSlim比传统lock更灵活,支持异步场景,也能避免死锁问题。

二、结合NUnit的专属方案

1. 简单串行测试方法

如果Demo是NUnit测试方法,直接给方法加[NonParallelizable]特性,禁止该方法并行执行:

[Test]
[NonParallelizable]
public void Demo()
{
    int f = 2; 
    driver.Navigate.GoToUrl("www.google.com");
}

NUnit默认可能并行执行测试,加该特性后,这个方法会排队等待前一个实例执行完毕再启动。

2. 整个测试类串行执行

如果测试类中所有方法都需要串行,给类添加[NonParallelizable]特性:

[TestFixture]
[NonParallelizable]
public class SeleniumTestClass
{
    private IWebDriver driver;

    [SetUp]
    public void InitDriver()
    {
        driver = new ChromeDriver();
    }

    [Test]
    public void Demo()
    {
        int f = 2; 
        driver.Navigate.GoToUrl("www.google.com");
    }

    [TearDown]
    public void QuitDriver()
    {
        driver.Quit();
    }
}

这样类内所有测试方法都会按顺序执行,自然实现Demo方法的排队等待。

3. 自定义串行特性(精细控制)

如果需要仅指定部分方法串行,自定义NUnit特性实现:

// 自定义串行执行命令
public class SerialTestCommand : DelegatingTestCommand
{
    private static readonly SemaphoreSlim _serialLock = new SemaphoreSlim(1);

    public SerialTestCommand(TestCommand innerCommand) : base(innerCommand) { }

    public override TestResult Execute(TestExecutionContext context)
    {
        _serialLock.Wait();
        try
        {
            return innerCommand.Execute(context);
        }
        finally
        {
            _serialLock.Release();
        }
    }
}

// 自定义特性标记需要串行的方法
public class SerialTestAttribute : Attribute, ITestAction
{
    public void BeforeTest(TestDetails details) { }
    public void AfterTest(TestDetails details) { }
    public ActionTargets Targets => ActionTargets.Test;

    public TestCommand ApplyToTest(TestCommand command)
    {
        return new SerialTestCommand(command);
    }
}

// 使用方式
[Test]
[SerialTest]
public void Demo()
{
    int f = 2; 
    driver.Navigate.GoToUrl("www.google.com");
}

给需要排队的测试方法加[SerialTest]特性即可,其他方法不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:50:33