Проблемы с [After *] светильниками в Steps - PullRequest
0 голосов
/ 08 марта 2019

Проблема:

У меня есть две функции (я только начинаю с SpecFlow) На каждом из этапов функции я создаю глобальный WebDriver, чтобы я мог использовать его для всех этапов.Если я запускаю только шаги, все работает правильно в обеих функциях.Они, однако, оставляют окно браузера открытым, потому что я никогда не закрываю WebDriver.Поэтому я подумал о том, чтобы добавить в каждый из файлов Step фиксатор AfterFeature.

[AfterFeature]
public static void ShutDown()
{
     Driver.Close();
}

Когда я запускаю каждую функцию, все в порядке, и драйвер закрывается в конце цикла.Однако, если я запускаю более одной функции, как эта, драйвер закроется после первой функции, а новая не откроется при запуске следующей функции.Я нахожу это странным, поскольку каждый файл шагов функции имеет свой собственный экземплярный драйвер.

Я узнал, что если я использую [AfterTestRun], тесты будут работать правильно, и оба браузера будут оставаться открытыми, пока все функции не будут завершены.В этот момент они оба закроются.Сейчас это нормально, когда у меня есть только две функции, но когда я получаю кучу, я бы предпочел, чтобы у меня не возникало несколько случайных окон браузера, пока все тесты не будут завершены.

Я думаю, что это может бытькак-то связано с моей неспособностью использовать [AfterScenario] без нарушения моих тестов.Я пытался использовать [AfterScenario] для выхода из системы после каждого сценария / теста, но при этом я вижу случайное пустое окно драйвера / браузера, всплывающее в конце моего первого теста (независимо от того, какой тест я запускаю первым).

У меня такое ощущение, что мне просто не хватает какой-то парадигмы с этой целой методологией BDD, и что на самом деле все работает так, как задумано.Но я в растерянности относительно того, какие изменения я должен сделать.Вот пример моих тестов входа в систему .. Есть ли что-то фундаментальное, что я здесь упускаю?

Код:

Login.feature
Feature: Login
    In order to be able to use Laserfiche
    As a legitimate user
    I want to be able to log into the repository

@SmokeTest
Scenario: Login with correct credentials
    Given I am on the Login page 
    And I have a good username/password combination
    And I select a repository
    When I fill out the form and submit
    Then I am taken to the repo page

---------------
LoginSteps.cs
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Selenium_C_Sharp_POC.Page_Object_Files.Pages;
using Selenium_C_Sharp_POC.Page_Object_Files.Test_Tools;
using TechTalk.SpecFlow;

namespace Selenium_C_Sharp_POC.StepDefinitions
{
    [Binding]
    public class LoginSteps
    {
        private static readonly IWebDriver Driver = new ChromeDriver();

        private static LoginPage _loginPage;
        private static string _username;
        private static string _password;
        private static string _repo;

        [AfterTestRun]
        public static void ShutDown()
        {
            Driver?.Close();
        }

        [Given(@"I am on the Login page")]
        public void GivenIAmOnTheLoginPage()
        {
            _loginPage = new LoginPage(Driver);
        }

        [Given(@"I have a good username/password combination")]
        public void GivenIHaveAGoodUsernamePasswordCombination()
        {
            _username = Nomenclature.WebClientPersonalUsername;
            _password = Nomenclature.WebClientPersonalPassword;
        }
        [Given(@"I select a repository")]
        public void GivenISelectARepository()
        {
            _repo = Nomenclature.RepoUnderTest;
        }

        [When(@"I fill out the form and submit")]
        public void WhenIFillOutTheFormAndSubmit()
        {
            _loginPage.Login(
                username: _username, 
                password: _password, 
                repo: _repo);
        }

        [Then(@"I am taken to the repo page")]
        public void ThenIAmTakenToTheRepoPage()
        {
            Assert.AreEqual(
                expected: _repo,
                actual: Driver.Title);

            HelperMethods.Logout(Driver);
        }
    }
}

Редактировать: Добавлен код страницы входа в систему

using System;
using OpenQA.Selenium;
using System.Threading;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using Selenium_C_Sharp_POC.Page_Object_Files.Test_Tools;

namespace Selenium_C_Sharp_POC.Page_Object_Files.Pages
{
    class LoginPage
    {
        private readonly IWebElement _repoDropDown;
        private readonly IWebElement _usernameTextBox;
        private readonly IWebElement _passwordTextBox;
        private readonly IWebElement _submitButton;
        private readonly IWebDriver _driver;
        private readonly IWebElement _warningBox;

        public LoginPage(IWebDriver driver)
        {
            _driver = driver;

            HelperMethods.OpenWebPage(
                domain: Nomenclature.Domain, 
                driver: _driver,
                subPage: Nomenclature.LoginPageFilename
                );

            _repoDropDown = _driver.FindElement(By.Id("SelectedRepo"));
            _passwordTextBox = _driver.FindElement(By.Name("password"));
            _usernameTextBox = _driver.FindElement(By.Name("username"));
            _submitButton = _driver.FindElement(By.Id("LoginButton"));
            _warningBox = _driver.FindElement(By.ClassName("alert-danger"));
        }

        public void Login(string username, string password, string repo)
        {
           SelectRepo(repo);
           _usernameTextBox.SendKeys(username);
           _passwordTextBox.SendKeys(password);
           _submitButton.Click();
           WaitForLoginToComplete();
        }

        public void SelectRepo(string repo)
        {
            _repoDropDown.Click();
            var options =  _repoDropDown.FindElements(By.XPath(".//option"));
            foreach (var option in options)
            {
                if(option.Text.Equals(repo))
                    option.Click();
            }
        }

        public bool WarningDisplayed_UsernamePassword()
        {  
           Thread.Sleep(500);
           return _warningBox.Displayed &&
                  _warningBox.Text.Equals(Nomenclature.BadUsernameOrPasswordText, StringComparison.OrdinalIgnoreCase);
        }

        internal bool OpenedRepoPage(string expectedRepo)
        {
            return _driver.Title.Equals(expectedRepo);
        }

        internal void WaitForLoginToComplete()
        {
            try
            {
                var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5));
                wait.Until(ExpectedConditions.ElementIsVisible(By.ClassName("alert-danger")));
            }
            catch (Exception)
            {
                var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(45));
                wait.Until(ExpectedConditions.ElementExists(By.XPath("//*[@ng-model='searchQuery']")));
                wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.ClassName("entryListLoadingSpinner")));
            }
        }
    }
}

LatestInfo:

Мне кажется, я знаю почему это происходит.Я просто не знаю, как это исправить.В качестве эксперимента я изменил WebDriver для своих поисковых тестов на Firefox и оставил WebDriver для моих тестов входа в систему как Chrome.Независимо от того, какие тесты я выполнял, я всегда видел 2 открытых браузера;один Chrome и один Firefox.

Когда я переместил все шаги из моего файла SearchTestSteps.cs в файл LoginTestSteps.cs, проблема исчезла.

Итак, да, это решает немедленныепроблема, но неоптимально иметь все мои шаги в одном файле.Это может быстро стать громоздким.

Поскольку каждый набор шагов должен иметь свой собственный WebDriver, я в растерянности.

Может быть, это как-то связано со структурой папок и где что-то хранится?Вот как выглядит моя шахта.

Root
 |-Page Object Files
      |- Page Components
      |- Pages
      |- Test Tools  
 |- Step Definitions
      |- <*Steps.cs>  
 |- TESTS
      |- BDD Tests
          |-<*.feature>
      |- *standard selenium test files*

1 Ответ

0 голосов
/ 09 марта 2019

Проведя еще несколько исследований, я понял, что проблема в НЕ , как я думал, и поэтому название и содержание были неточными.Я закрываю этот вопрос и создаю новый вопрос с более точным названием и информацией.

Наличие файлов с несколькими шагами открывает несколько браузеров

...