Автоматизированные тесты выдают ошибку из кода, указанного в настройке, несмотря на то, что он уже был выполнен правильно в других тестах - PullRequest
0 голосов
/ 11 февраля 2019

Я получаю сообщение об ошибке из группы тестов, в которой он, похоже, ищет элемент, указанный в «Методе установки», несмотря на то, что метод уже выполняется, выдается следующее сообщение:

Сообщение: OpenQA.Selenium.NoSuchElementException: такого элемента нет: невозможно найти элемент: {"method": "xpath", "selector": "// input [@ id = 'txtCompany']"}
(информация о сеансе:chrome = 71.0.3578.98)
(информация о драйвере: chromedriver = 2.45.615291
(ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387), платформа = Windows NT 10.0.17763 x86_64) "

я пробовал и комментировалИсходя из кода, я также добавил дополнительный шаг возврата к экрану Splash перед тем, как щелкнуть раскрывающийся список «Отчеты», хотя это не устранило проблему. Аналогичный код работает правильно вне этого класса, где проводится другой тест.

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using NUnit.Framework;


[SetUp]
public void initalise()
    {   
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.Manage().Window.Maximize();

        //Navigates to the Test DB
        driver.Url = "https://TESTWEBSITE.co.uk";
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        //Find Company Text Box and send company name

driver.FindElement(By.XPath("//input[@id='txtCompany']")).SendKeys("COMPANY");

        //Find username Text Box and send username

driver.FindElement(By.XPath("//input[@id='txtUsername']")).SendKeys("6969_1");

        //Find password and send

driver.FindElement(By.XPath("//input[@id='txtPassword']")).SendKeys("PASSWORD");

        //Find Login button and click
        driver.FindElement(By.XPath("//input[@id='cmdLogin']")).Click();
    }

  [Test, Order(1)]
    public void reportsStandard()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Standard Reports')]")).Click();

        IWebElement ReportType = driver.FindElement(By.XPath("//div[@id='ctl00_ContentPlaceHolder_lstReports']//ul[@class='rlbList']"));
        Assert.AreEqual(true, ReportType.Displayed);

    }
   [Test, Order(2)]
  public void reportsPandLCustomer()
    {

        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Customer')]")).Click();

        IWebElement AdvancedFiltering = driver.FindElement(By.XPath("//a[@id='ContentPlaceHolder_cmdAdvancedFiltering']"));
        Assert.AreEqual(true, AdvancedFiltering.Displayed);
    }

Я ожидаю, что тесты будут выполнены как:

Настройка (запускает браузер> Перейти на веб-сайт> Вход в систему)
Порядок тестирования 1 (Click Раскрывающийся список отчетов> Щелкните Стандартный отчет)
Порядок тестирования 2 (Нажмите кнопку «Домой»> Нажмите «Раскрыть отчеты»> Кнопка ProfitAndLoss)

Фактический результат:

Setup - Passes,
Test Order 1 - Passes,
Test Order 2 - Fails - Ошибка не может найти элемент, который используется только во время метода установки.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Метод, помеченный [SetUp], запускается перед каждым тестом, см. документы .

Я думаю, что проблема заключается в следующем:

  1. Установочные прогоны,вход в систему
  2. Запуск Test1, передача
  3. После завершения Test1 программа установки запускается снова, но на этот раз вы уже вошли в систему, так как вы повторно используете сеансы браузера (или, по крайней мере, кажется, чтокод, который вы опубликовали), поэтому, когда метод установки ищет поле Company, его там нет.

Рекомендуется использовать один сеанс браузера на тест.Это гарантирует, что у вас будет самый чистый пробег, возможный каждый раз.Вам нужно добавить запуск браузера в свой метод [SetUp], а также добавить метод [TearDown], который завершает работу браузера.Вот как должны выполняться ваши тесты:

  1. Программа установки запускается, запускает браузер и регистрирует вас в
  2. Тест1 запускается, проходит
  3. TearDown запускается и закрывает браузер
  4. Программа установки запускается, запускает браузер и регистрирует вас в
  5. Test2 запускается, проходит
  6. TearDown запускается и закрывает браузер

Ваш метод TearDown долженбыть чем-то вроде (см. документы, связанные выше)

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

Примечание 1:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

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

Примечание 2: Авторы Selenium заявили, что не следует использовать ImplicitWait.Вместо этого вы должны использовать WebDriverWait.

. Примечание 3: Ваши тесты не должны выполняться в определенном порядке.Каждый тест должен быть независимым друг от друга и должен выполняться в любом порядке.

0 голосов
/ 11 февраля 2019

Итак, после игры и некоторого поиска в Google. Если я изменю метод [Setup] на [OneTimeSetup] для класса, то это будет работать правильно.Новый код будет выглядеть так:

[OneTimeSetUp]
    public void initalise()
    {  //Maximise Window
        driver.Manage().Window.Maximize();

        //Navigates to the NG Test DB
        driver.Url = "https://TESTWEBSITE.co.uk";
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        //Find Company Text Box and send company name
        driver.FindElement(By.XPath("//input[@id='txtCompany']")).SendKeys("CompanyName");

        //Find username Text Box and send username
        driver.FindElement(By.XPath("//input[@id='txtUsername']")).SendKeys("6969_1");

        //Find password and send
        driver.FindElement(By.XPath("//input[@id='txtPassword']")).SendKeys("Password!");

        //Find Login button and click
        driver.FindElement(By.XPath("//input[@id='cmdLogin']")).Click();
    }
 [Test, Order(1)]
    public void reportsStandard()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Standard Reports')]")).Click();
        IWebElement ReportType = driver.FindElement(By.XPath("//div[@id='ctl00_ContentPlaceHolder_lstReports']//ul[@class='rlbList']"));
//Assert.AreEqual(true, ReportType.Displayed);
    }
    [Test, Order(2)]
    public void reportsPandLCustomer()
    {

        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Customer')]")).Click();

        IWebElement AdvancedFiltering = driver.FindElement(By.XPath("//a[@id='ContentPlaceHolder_cmdAdvancedFiltering']"));
        Assert.AreEqual(true, AdvancedFiltering.Displayed);
    }
    [Test, Order(3)]
    public void reportsPandLPhone()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Phone Number')]")).Click();
        IWebElement ResetBTN = driver.FindElement(By.XPath("//span[@id='ctl00_FunctionBarPlaceHolder_cmdReset']"));
        Assert.AreEqual(true, ResetBTN.Displayed);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...