Мой тест терпит неудачу при запуске вместе, но проходит индивидуально
Быстрый вопрос для вас... Когда я пишу тест в 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
Две вещи, которые вы можете попробовать
Ответ 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))