Dans rapporteur, navigateur.isElementPresent vs élément.isPresent vs élément.isElementPresent

Dans protractor, il y a, fondamentalement, 3 façons de vérifier si un élément est présent:

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

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

Ces options sont-elles équivalentes et interchangeables, et lesquelles devraient être généralement préférées?

25
demandé sur djangofan 2015-10-08 18:00:12

3 réponses

Tous fonctionnent de la même manière avec des différences subtiles. Voici quelques différences que j'ai trouvées -

elm.isPresent() -

  1. est une extension de ElementFinderet donc attend que Angular se règle sur la page avant d'exécuter une action.
  2. , Il fonctionne lorsque elm est un element(locator) ou ElementFinder et pas ElementArrayFinder. Si plusieurs éléments sont retournés en utilisant le locator spécifié, le premier élément est vérifié s'il est isEnabled() dans le DOM. Ne prend aucun paramètre comme entrée.
  3. Fonctionne mieux avec les pages angulaires et les éléments angulaires.
  4. préférence, à utiliser chaque fois qu'il est nécessaire de trouver si un élément est présent.

elm.isElementPresent(subLoc) - (Quand il y a un sous locator elm)

  1. est une extension de ElementFinder et attend donc Qu'Angular se règle sur la page avant d'exécuter une action.
  2. Utilisé pour vérifier la présence des éléments qui sont des sous-éléments d'un parent. Il faut un sub locator au parent elm comme un paramètre. (seule différence entre ceci et le elm.isPresent())
  3. Fonctionne mieux avec les pages angulaires et les éléments angulaires.
  4. première préférence à utiliser chaque fois qu'il est nécessaire de vérifier si un sous-élément d'un parent est présent.

browser.isElementPresent(element || Locator) -

  1. est une implémentation de webdriver et n'attend donc pas que angular se règle.
  2. prend un locator ou un element comme paramètre et utilise le premier résultat si plusieurs éléments sont situés en utilisant le même localisateur.
  3. mieux utilisé avec les pages Non angulaires.
  4. première préférence à utiliser lors des tests sur des pages non angulaires.

Tout ce qui précède vérifie la présence d'un élément dans DOM et renvoie un résultat boolean. Bien que les caractéristiques angulaires et non angulaires n'affectent pas l'utilisation de ces méthodes, il y a un avantage supplémentaire lorsque la méthode attend que angular se règle par défaut et aide à éviter les erreurs en cas d'élément angulaire introuvable ou de référence d'élément d'état les exceptions, etc...

32
répondu Girish Sortur 2015-10-14 19:50:03

Je ne peux pas parler à qui est préféré mais j'ai pu trouver le code source et l'examiner.

Selon les docs, elm.isPresent() et elm.isElementPresent() sont équivalents. Espérons que cela aide.

Le Rapporteur de l'API Docs

Il y a un lien vers View code juste à droite du titre.

Navigateur.isElementPresent(elm);

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;
  });
};

Orme.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;
    }
  });
};

Orme.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();
};
4
répondu JeffC 2015-10-08 17:12:06

Vous pouvez vérifier si l'élément est présent ou non en utilisant la fonction isPresent.

Donc, votre code serait quelque chose comme:

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

Voici Les Docs du rapporteur pour la fonction isPresent.

-3
répondu 2015-10-14 06:14:23