Подтвердить что ты не робот

В транспортнике, browser.isElementPresent vs element.isPresent vs element.isElementPresent

В транспортимере есть, в основном, три способа проверить, присутствует ли элемент:

var elm = element(by.id("myid"));

browser.isElementPresent(elm);
elm.isPresent();
elm.isElementPresent();

Являются ли эти варианты эквивалентными и взаимозаменяемыми, и какой из них должен быть вообще предпочтительным?

4b9b3361

Ответ 1

Все функции аналогичны с небольшими различиями. Вот несколько отличий, которые я нашел -

elm.isPresent() -

  • Является расширением ElementFinder, и поэтому ждет Angular для установки на странице перед выполнением каких-либо действий.
  • Это работает, когда elm является element(locator) или ElementFinder, а не ElementArrayFinder. Если несколько элементов возвращаются с использованием указанного locator, то первый элемент проверяется, если он isEnabled() в DOM. Не принимает никаких параметров в качестве входных данных.
  • Лучше всего работает с страницами Angular и Angular.
  • Первое предпочтение использования, когда есть необходимость найти, присутствует ли элемент.

elm.isElementPresent(subLoc) - (Когда есть суб-локатор elm)

  • Является расширением ElementFinder и поэтому ждет, пока Angular установится на странице перед выполнением каких-либо действий.
  • Используется для проверки наличия элементов, которые являются вспомогательными элементами родителя. Для параметра elm требуется взять sub locator в качестве параметра. (только разница между этим и elm.isPresent())
  • Лучше всего работает с страницами Angular и Angular.
  • Первое предпочтение использования, когда есть необходимость проверить, присутствует ли дополнительный элемент родителя.

browser.isElementPresent(element || Locator) -

  • Является реализацией webdriver и поэтому не ждет завершения Angular.
  • В качестве параметра принимает locator или element и использует первый результат, если несколько элементов расположены с использованием одного и того же локатора.
  • Лучше всего использовать страницы без Angular.
  • Первое предпочтение следует использовать при тестировании на страницах без Angular.

Все вышеперечисленные проверки на наличие элемента в DOM и возврат результата boolean. Хотя функции Angular и не Angular не влияют на использование этих методов, но есть дополнительное преимущество, когда метод ожидает, что Angular установится по умолчанию и поможет избежать ошибок в случае Angular подобного элемента не найдены или исключены ссылки на элементы элемента элемента и т.д.

Ответ 2

Я не могу говорить, какой из них предпочтительнее, но я смог найти исходный код и изучить его.

В соответствии с документами elm.isPresent() и elm.isElementPresent() эквивалентны. Надеюсь, что это поможет.

Документы API-интерфейса транспортира

Существует ссылка на View code справа от названия.

browser.isElementPresent(ильм);

https://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.isElementPresent

/**
 * Schedules a command to test if there is at least one descendant of this
 * element that matches the given search criteria.
 *
 * @param {!(webdriver.Locator|webdriver.By.Hash|Function)} locator The
 *     locator strategy to use when searching for the element.
 * @return {!webdriver.promise.Promise.<boolean>} A promise that will be
 *     resolved with whether an element could be located on the page.
 */
webdriver.WebElement.prototype.isElementPresent = function(locator) {
  return this.findElements(locator).then(function(result) {
    return !!result.length;
  });
};

elm.isPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isPresent

/**
 * Determine whether the element is present on the page.
 *
 * @view
 * <span>{{person.name}}</span>
 *
 * @example
 * // Element exists.
 * expect(element(by.binding('person.name')).isPresent()).toBe(true);
 *
 * // Element not present.
 * expect(element(by.binding('notPresent')).isPresent()).toBe(false);
 *
 * @return {ElementFinder} which resolves to whether
 *     the element is present on the page.
 */
ElementFinder.prototype.isPresent = function() {
  return this.parentElementArrayFinder.getWebElements().then(function(arr) {
    if (arr.length === 0) {
      return false;
    }
    return arr[0].isEnabled().then(function() {
      return true; // is present, whether it is enabled or not
    }, function(err) {
      if (err.code == webdriver.error.ErrorCode.STALE_ELEMENT_REFERENCE) {
        return false;
      } else {
        throw err;
      }
    });
  }, function(err) {
    if (err.code == webdriver.error.ErrorCode.NO_SUCH_ELEMENT) {
      return false;
    } else {
      throw err;
    }
  });
};

elm.isElementPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isElementPresent

/**
 * Same as ElementFinder.isPresent(), except this checks whether the element
 * identified by the subLocator is present, rather than the current element 
 * finder. i.e. `element(by.css('#abc')).element(by.css('#def')).isPresent()` is
 * identical to `element(by.css('#abc')).isElementPresent(by.css('#def'))`.
 *
 * @see ElementFinder.isPresent
 *
 * @param {webdriver.Locator} subLocator Locator for element to look for.
 * @return {ElementFinder} which resolves to whether
 *     the subelement is present on the page.
 */
ElementFinder.prototype.isElementPresent = function(subLocator) {
  if (!subLocator) {
    throw new Error('SubLocator is not supplied as a parameter to ' + 
      '`isElementPresent(subLocator)`. You are probably looking for the ' + 
      'function `isPresent()`.');
  }
  return this.element(subLocator).isPresent();
};

Ответ 3

Вы можете проверить, присутствует ли элемент или нет, используя функцию isPresent.

Итак, ваш код будет примерно таким:

var myElement = element(by.css('.elementClass'));
expect(myElement.isPresent()).toBeFalsy();

Здесь - документы транспортира для функции isPresent.