Транспортир: Ожидание элемента, который присутствует, но не отображается

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

Ответы

Ответ 1

У меня была аналогичная проблема - вы хотите проверить, когда элемент больше не отключен. Я изо всех сил пытался обойти вещи без теста .not, а затем понял, что могу просто переместить тест "нет" в селектор css:

// we're looking for when the element doesn't have a .disabled class
var availableElement = by.css('.some-class:not(.disabled)');
browser.wait(function() {
  return ptor.isElementPresent(availableElement);
}, 30000);

expect(ptor.isElementPresent(availableElement)).toBeTruthy();

Не уверен, что это помогает, но у меня был момент ясности, поэтому я подумал, что буду делиться.

Ответ 2

Использование elementexplorer (https://github.com/angular/protractor/blob/master/docs/debugging.md) Я посмотрел на объект транспортира и нашел ответ, который отлично работает для меня:

var el = element(by.id('visibleElementId'));
browser.driver.wait(protractor.until.elementIsNotVisible(el));

Ответ 3

expect(ptor.isElementPresent(by.css('.warning'))).toBe(false);

Это еще один способ проверить, отображается ли что-либо на странице или нет.

Ответ 4

По моему опыту, это распространенная "печальная" проблема. Вы знаете, что ваш код написан правильно, но тест не удался из-за ожидания. Например, в Chrome я получаю следующую ошибку в консоли:

< Неизвестная ошибка: элемент не может быть нажат в точке (952, 275). >

Итак, я создал отдельную функцию в своем классе WebDriver и, похоже, работает:

this.waitElementToBeShown = function (elmLocator) {
        browser.sleep(500);
        browser.wait(function () {
            return (elmLocator).isPresent();
        }, 3000);
        browser.wait(function () {
            return (elmLocator).isDisplayed();
        }, 3000);
    }