如何在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
相关产品推荐
相关产品推荐

