Я написал тест, чтобы проверить, отображается ли элемент на экране, в моем случае это складная панель 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);
... но нет .not
в транспортире или webDriver AFAIK.