Мой тест терпит неудачу при запуске вместе, но проходит индивидуально

Быстрый вопрос для вас... Когда я пишу тест в Visual Studio, я проверяю, что он работает, сохраняя, создавая и затем запуская его тест в Nunit (щелкните правой кнопкой мыши по тесту, затем запустите).

Тест работает yay... поэтому я перемещаюсь...

Теперь я написал еще один тест, и он работает, поскольку я сохранил и протестировал его, как описано выше. Но они не работают, когда они работают вместе.

Вот мои два теста, которые работают при запуске как отдельные, но сбой при запуске:

using System;
using NUnit.Framework;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;

namespace Fixtures.Users.Page1
{
    [TestFixture]
    public class AdminNavigateToPage1 : SeleniumTestBase
    {
        [Test]
        public void AdminNavigateToPage1()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            NavigateTo<Page1>();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }

        [Test]
        public void AdminNavigateToPage1ViaMenu()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            Driver.FindElement(By.Id("menuitem1")).Click();
            Driver.FindElement(By.Id("submenuitem4")).Click();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }
    }
}

Когда второй тест завершился неудачно, потому что они были запущены вместе

Nunit представляет следующее:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu: OpenQA.Selenium.NoSuchElementException: элемент не найден.

И эта строка выделена:

var headerelement = Driver.FindElement(By.ClassName("header"));

Кто-нибудь знает, почему мой код не работает при запуске вместе, но проходит при запуске в одиночку?

Любой ответ будет очень благодарен!

Ответы

Ответ 1

Две вещи, которые вы можете попробовать

  • установите точку разрыва между двумя строками. И посмотрите, на какой странице вы попадаете, когда нажимается вторая строка.
  • Ввести небольшую задержку между этими двумя строками через Thread.Sleep

    .

    Driver.FindElement(By.Id( "submenuitem4" )) Нажмите(); var headerelement = Driver.FindElement(By.ClassName( "header" ));

Ответ 2

Не зная, как работает Selenium, моя ставка находится на Driver, который, кажется, является статическим классом, поэтому 2 теста разделяют состояние. Одним из примеров общего состояния является Driver.Url. Поскольку тесты выполняются параллельно, есть условие гонки, чтобы установить состояние этого объекта.

Тем не менее, у меня нет для вас решения:)

Ответ 3

просмотрите TestFixtureSetup, Setup, TestFixtureTearDown и TearDown.
Эти атрибуты позволяют настраивать тестовую среду один раз, а не один раз для каждого теста.

Ответ 4

Если ни один из вышеперечисленных ответов не работал для вас, я решил эту проблему, добавив Thread.Sleep(1) перед утверждением в провальном тесте...

Похоже, что синхронизация синхронизации пропускается где-то... Обратите внимание, что мои тесты не зависели от заказа, что у меня нет какого-либо статического члена или внешней зависимости.

Ответ 5

Такая ситуация обычно возникает, когда модульные тесты каким-то образом используют общие ресурсы/данные.

  • Это также может произойти, если ваша тестируемая система имеет статические поля/свойства, которые используются для вычисления вывода, на котором вы утверждаете.
  • Это может произойти, если тестируемая система является общей (статической) зависимостью.

Ответ 6

Вы уверены, что после запуска одного из тестов метод

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

возвращает вас туда, где вы должны быть? Похоже, что сбой вызван неправильным обработчиком навигации (предположим, что элемент заголовка присутствует и найден в обоих тестах).

Ответ 7

Я думаю, вам нужно убедиться, что вы можете войти в систему для второго теста, это может быть неудачно, потому что вы уже вошли в систему?

- > установка входа в метод настройки или (поскольку, похоже, вы используете одного и того же пользователя для обоих тестов) даже до настройки прибора - > выход (если необходимо) может быть помещен в метод срыва

     [SetUp]
     public void LaunchTest()
     {
        NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
     }

     [TearDown]
     public void StopTest()
     {
        // logoff
     }
     [Test]
     public void Test1()
     {...}
     [Test]
     public void Test2()
     {...}

Если есть задержки в DOM вместо thread.sleep, я рекомендую использовать webdriver.wait в сочетании с условиями. Сон может работать на 80%, а в других - нет. Подождите, пока не будет достигнут тайм-аут, который более надежный и читаемый. Вот пример того, как я обычно подхожу к этому:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))