Использование ChromeDriver в тестах SpecFlow - PullRequest
2 голосов
/ 16 октября 2019

Итак, как мы знаем, когда вы используете SpecFlow, если вы повторно используете шаг из другого теста, он автоматически извлекает его и использует повторно ... однако у меня есть проблема, из-за которой Test A входит в систему, а Test B входит в систему и подтверждаетДомашняя страница верна, но, поскольку тест А инициализирует ChromeDriver, когда я использую Тест Б, мой Драйвер хочет открыть другую веб-страницу, что приводит к сбою теста, так как она открывает пустую веб-страницу.

Мой вопрос - как мне использовать драйвер, не открывая другой экземпляр Chrome. Вот то, что у меня есть код для моего «универсального логина»:

        private LandingPageCode landingPage;
        private HomePageCode HomePage;

        [Given(@"I have entered my username, password selected login")]
        public void GivenIHaveEnteredMyUsernamePasswordSelectedLogin()
        {
            driver = new ChromeDriver();
            driver.Url = ("my URL");
            landingPage = new LandingPageCode(driver);
            HomePage = new HomePageCode(driver); 

Код, который я имею на тесте B, который проверяет домашнюю страницу после входа в систему:

    {
        private ChromeDriver driver;
        private HomePageCode HomePage;
        private LandingPageCode landingPage;


        [Given(@"Successfully log into Cal's website (.*)")]
        public void GivenSuccessfullyLogIntoOptix(Decimal p0)
        {
            driver = new ChromeDriver();
            HomePage = new HomePageCode(driver);
            landingPage = new LandingPageCode(driver);

            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            Assert.AreEqual("HomePage", driver.Title);

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Я вижу этот вопрос или связанные с ним вопросы очень часто ( Как правильно управлять экземплярами веб-драйвера и обращаться к ним, чтобы избежать проблем с параллельным выполнением тестов? ). Интеграция Selenium и SpecFlow может быть сложной. Необходимо использовать инфраструктуру внедрения зависимостей, которая поставляется с SpecFlow, и использовать до и после перехватчиков сценариев для инициализации веб-драйвера, а затем зарегистрировать его в контейнере внедрения зависимостей. Позже в ваших классах определения шагов вам нужно будет указать конструктор для этих классов, который принимает объект IWebDriver в качестве параметра конструктора, и назначить его полю в каждом классе определения шага.

[Binding]
public class WebDriverHooks
{
    private readonly IObjectContainer container;

    public WebDriverHooks(IObjectContainer container)
    {
        this.container = container;
    }

    [BeforeScenario]
    public void CreateWebDriver()
    {
        // or new FirefoxDriver or new WhateverDriver as long as it implements
        // the IWebDriver interface
        ChromeDriver driver = new ChromeDriver();

        // Make 'driver' available for DI
        container.RegisterInstanceAs<IWebDriver>(driver);
    }

    [AfterScenario]
    public void DestroyWebDriver()
    {
        var driver = container.Resolve<IWebDriver>();

        if (driver != null)
        {
            driver.Quit();
            driver.Dispose();
        }
    }
}

И пример файла определения шага:

[Binding]
public class LoginSteps
{
    private readonly IWebDriver driver;
    private readonly LoginPage loginPage;

    public LoginSteps(IWebDriver driver)
    {
        // Assign 'driver' to private field or use it to initialize a page object
        this.driver = driver;

        // Initialize Selenium page object
        this.loginPage = new LoginPage(driver);
    }

    [When(@"I go to the login page")]
    public void WhenIGoToTheLoginPage()
    {
        // Use 'driver' in step definition
        driver.FindElement(By.LinkText("Sign In")).Click();
    }

    [When(@"I log in")]
    public void WhenILogIn()
    {
        // Use Selenium page object in step definition
        loginPage.LogIn("testUser", "testPassword");
    }
}

Это не только позволяет вам совместно использовать экземпляры веб-драйвера между файлами определения шага, но и централизует логику создания и удаления этих объектов, и приближает вас на один шаг. разрешить выполнение параллельных тестов.

См. также: Внедрение контекста на SpecFlow.org.

0 голосов
/ 16 октября 2019

Вы можете удалить свой код драйвера из ваших тестов и настроить фреймворк для вашего кода для запуска. Используя NUnit, вы можете разработать для себя среду для параллельного запуска тестов. Есть тонны онлайн-учебников для этого. [https://nunit.org/][1]

Вы можете создать класс driver.cs, похожий на этот, который извлекает базовый URL из класса конфигурации .:

    public static class Driver
{
    public static IWebDriver driver = new ChromeDriver();

   public static void InitializedDriver()
    {
        Driver.driver.Navigate().GoToUrl(Config.BaseURL);
        Driver.driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
    }
}

Затем в вашем тестовом классе, вы можете использовать OneTimeSetUp для инициализации вашего веб-драйвера:

    [OneTimeSetUp]
   public void Initialize()
    {
        Driver.InitializedDriver();
    }

После того, как ваши тестовые коды, вы можете разорвать, используя:

        [OneTimeTearDown]
    public void CleanUp()
    {
        Driver.driver.Quit();

    }

Это позволит вашим тестам запускаться натот же экземпляр Chrome.

...