Я написал тест, чтобы проверить, является ли элемент видимым на экране, в моем случае angular -ui-bootstrap сборная панель, ака, "предупреждение". Код работает, но тесты, используемые для отказа ~ 75% времени.
На дисплее "предупреждения" имеется анимация коллапса, и я не могу завершить анимацию для тестов, поскольку это анимация jquery. Предупреждение всегда "присутствует" в DOM, просто рухнуло, когда нет причин его показывать.
Сначала я тестировал этот код, что довольно просто:
expect(element('.warning').isDisplayed()).toEqual(true);
Проблема возникла, когда мне нужно было проверить, что элемент не отображается, например.: как только предупреждение отображается, некоторые действия приводят к его краху.
Этот тест:
expect(element('.warning').isDisplayed()).toEqual(false);
пройдет только в том случае, если анимация началась. Он будет терпеть неудачу, когда условие будет проверено, пока элемент все еще отображается.
Я придумал два решения.
Легкий с помощью ptor.driver.sleep(2000)
. Является медленным мои тесты и не приемлем.
Тяжелый, уродливый, но это дает мне хорошие результаты:
exports.isWarningDisplayed = function (expectedVisibility) {
return ptor.driver.wait(function () {
if (expectedVisibility) {
return element(by.css('.warning')).isDisplayed().then(function(visibility) {
return visibility === expectedVisibility;
});
} else {
return element.all(by.css('.warning .collapse.in')).then(function(items) {
return items.length === 0;
});
}
}, 2000).then(function() {
return element.all(by.css('.warning .collapse.in'));
}).then(function (items) {
return items.length > 0;
});
};
Моя проблема в том, что она просто ужасно ошибается. Вы нашли лучший способ справиться с этой ситуацией? Мое ожидание будет иметь что-то вроде:
expect(element('.warning').not.isDisplayed()).toEqual(true);
... но в транспортимере или webDriver AFAIK нет .not
.