Неявное ожидание в E2E-тестах для приложения Angular

У меня есть тесты E2E (с использованием Selenium WebDriver) для приложения Angular 4 / ASP.NET Core Web API.

У меня иногда возникают проблемы с тайм-аутом / ожиданием во время некоторых тестов.

В структуре E2E есть метод WaitForAngular (), который использует некоторый Javascript (взятый из Protractor), который ожидает, пока Angular укажет, что он загрузил все «возможности тестирования», прежде чем продолжить (см. https://stackoverflow.com/a/39349865/95423)

Однако это не кажется полностью надежным, и иногда при запуске мы получаем неопределенное время ожидания.

Другой подход, который мы используем, - это неявное ожидание отрисовки рассматриваемого элемента:

var url = "targetURL"
Driver.Instance.Navigate().GoToUrl(url);

var waitSeconds = 15;
var navWait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(waitSeconds))
{
    Message = $"The targetURL failed to load in {waitSeconds} seconds"
};

navWait.Until(x => x.FindElementById(targetUrlId) != null || x.FindElementById(forbiddenId) != null);

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

Какой подход здесь лучше или есть альтернатива?


person TonE    schedule 21.05.2018    source источник


Ответы (1)


Какую версию Angular вы используете?

Если вам просто нужно дождаться рендеринга элемента, вы можете попробовать:

import { browser } from 'protractor';
const waitLimit = 15000;
browser.wait(() => {
  return myHtmlElement.isDisplayed();
}, waitLimit);
person verymadmango    schedule 21.05.2018
comment
Спасибо, однако вопрос в том, что было бы лучше: дождаться отрисовки определенного элемента или дождаться, пока angular сигнализирует о завершении. - person TonE; 21.05.2018
comment
Protractor должен автоматически применять waitForAngular между каждым действием webdriver, вам не нужно запускать его вручную, однако есть некоторые события, которые нужно отслеживать, а в моем случае некоторые пользовательские анимации или события прокрутки не были приняты во внимание, и я Думаю, именно здесь нужно ждать, пока конкретный элемент отобразится или будет присутствовать там, где вы ожидаете, что это допустимый подход. Надеюсь, это поможет! - person verymadmango; 21.05.2018
comment
Мы используем Selenium, а не Protractor для проведения наших тестов. Мы только что «позаимствовали» код из Protractor для реализации метода WaitForAngular. - person TonE; 21.05.2018