【问题标题】:Multiple browser instance launch when i execute my test执行测试时启动多个浏览器实例
【发布时间】:2018-10-15 11:16:12
【问题描述】:

我是 specflow 中的一个新成员,我正在实施框架。当我创建一个具有多个场景的功能文件并执行我的测试时,它打开一个浏览器实例并运行成功,当我添加一个具有多个场景的功能文件并执行我的测试而不是启动多个浏览器实例时,每个场景的一个实例任何人都可以提供帮助找出我的代码有什么问题

Start.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TechTalk.SpecFlow;

namespace Orange_HRM
{
    class Start : SeleniumDriver
    {

      [BeforeScenarioBlock]
        public void Setup()
        {
            Intitialize();
            WebDriver.Navigate().GoToUrl(BaseAddress);
        } 

        [AfterScenarioBlock]
        public void TearDown()
        {
            Close();
        }
    }
}

SeleniumDriver.cs

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Orange_HRM
{
    class SeleniumDriver
    {

        public static IWebDriver WebDriver;


        public static string BaseAddress
        {
            get { return Constants.Url; }
        }

        public static void Intitialize()
        {
            WebDriver = new ChromeDriver();
            WebDriver.Manage().Window.Maximize();
            TurnOnWait();
        }

        public static void Navigate()
        {
            WebDriver.Navigate().GoToUrl(BaseAddress);
        }

        public static void Close()
        {
            WebDriver.Close();
        }

        public static void Quit()
        {
            WebDriver.Quit();
        }

        private static void TurnOnWait()
        {
            WebDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            WebDriver.Manage().Timeouts().PageLoad = TimeSpan.FromMinutes(2);
        }

    }
}

【问题讨论】:

  • 请问您的 main() 方法或类 Orange_HRM 的对象创建在哪里以及使用 System.Threading.Tasks 命名空间的目的是什么
  • 参考帖子 stackoverflow.com/questions/5028926/…> 和帖子 sqa.stackexchange.com/questions/5755/…> 和帖子 stackoverflow.com/questions/25467957/…>

标签: selenium selenium-webdriver c#-4.0 specflow


【解决方案1】:

您正在使用 techtalk 的 SpecFlow。 概念名称是 Hooks。
在特定时间执行自动逻辑操作。因此,挂钩是事件绑定。 使用 SpecFlow+ Runner 在多个线程中运行测试。

所以,你可以下订单了,

class Start : SeleniumDriver
{
[BeforeScenario(Order = 0)]
public void Setup()
        {
            Intitialize();
            WebDriver.Navigate().GoToUrl(BaseAddress);
        } 

[BeforeScenario(Order = 1)]
public void TearDown()
        {
            Close();
        }
}

我建议你不要使用它们,没有 Hooks 的绑定类。 即 [BeforeTestRun] [AfterTestRun] 使用它们。

[AfterScenario]
public void CleanUp()
{
    if (seleniumDriver != null)
    {
        SeleniumDriver.Dispose();
        seleniumDriver = null;
    }
}

【讨论】:

  • 嗨 Ashish,我遵循您提供的方法,但在执行测试时仍然会启动相同的多个浏览器实例。
  • 我认为@Navarasu 的答案应该可以工作,您是否尝试过。
  • 嗨 Ashish 我尝试了 Navarasu 解决方案,但它给了我一个错误,我在评论中提到了这个错误。请提出任何其他解决方案。谢谢
  • 有没有[Parallelizable]公共类
  • 我们在 nunit 中有注释 Parallelizable 但我没有在这个测试中创建 Parallelizable 类
【解决方案2】:

您可以在测试运行级别而不是场景级别初始化和关闭驱动程序。并在场景级别单独维护 url 导航。这样驱动程序将在测试开始之前启动并在测试完成后退出。此外,页面将在每个场景运行之前刷新。

namespace Orange_HRM
{
    class Start : SeleniumDriver
    {

      [BeforeTestRun]
        public static void Setup()
        {
            Intitialize();
        } 

        [AfterTestRun]
        public static void TearDown()
        {
            Quit();
        }

        [AfterScenarioBlock]
        public void navigateToUrl()
        {
            WebDriver.Navigate().GoToUrl(BaseAddress);
        } 
    }
}

您还使用了 WebDriver.Close() 而不是 WebDriver.Quit()。如果我们对主窗口使用 WebDriver.Close(),那么会话将被终止。那么如果我们再次尝试访问同一个 webdriver 对象,就会抛出 No such session 错误。

WebDriver.Close() 用于在我们使用多个窗口时关闭子窗口。所以要关闭主窗口,我们必须直接使用 WebDriver.Quit()。

【讨论】:

  • 嗨 Navarasu,我遵循您提供的相同方法,现在它给了我一个错误,测试没有开始只是显示一个错误。 TearDown : System.NullReferenceException : 对象引用未设置为对象的实例
  • 糟糕错字。我放错了 AfterScenarioBlock 和 AfterTestRun 钩子。我编辑了上面的代码。您现在可以检查更改的代码吗?
  • 嗨 Navarasu,我尝试使用更新的代码,但现在在执行测试时它给了我一个错误
  • 我收到以下错误 NUnit3TestExecutor 转换了 6 个 NUnit 测试用例中的 6 个 测试夹具 CompleteAutomation.Feature.TestOrangeHRMLoginFunctionalityFeature TechTalk.SpecFlow.BindingException 失败:前/后功能和前/后测试的绑定方法运行事件必须是静态的! CompleteAutomation:Orange_HRM.Hooks.Setup() TearDown : System.NullReferenceException : 对象引用未设置为对象的实例。
  • 我还将之前和之后的方法更改为静态,现在我收到以下错误 System.ArgumentExceptiion: The SearchContext of the locator object cannot be null Parameter name: locator 请提出任何其他解决方案。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多