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?
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 -
- est une extension de
ElementFinderet donc attend que Angular se règle sur la page avant d'exécuter une action. - , Il fonctionne lorsque
elmest unelement(locator)ouElementFinderet pasElementArrayFinder. Si plusieurs éléments sont retournés en utilisant lelocatorspécifié, le premier élément est vérifié s'il estisEnabled()dans le DOM. Ne prend aucun paramètre comme entrée. - Fonctionne mieux avec les pages angulaires et les éléments angulaires.
- 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)
- est une extension de
ElementFinderet attend donc Qu'Angular se règle sur la page avant d'exécuter une action. - Utilisé pour vérifier la présence des éléments qui sont des sous-éléments d'un parent. Il faut un
sub locatorau parentelmcomme un paramètre. (seule différence entre ceci et leelm.isPresent()) - Fonctionne mieux avec les pages angulaires et les éléments angulaires.
- 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) -
- est une implémentation de
webdriveret n'attend donc pas que angular se règle. - prend un
locatorou unelementcomme paramètre et utilise le premier résultat si plusieurs éléments sont situés en utilisant le même localisateur. - mieux utilisé avec les pages Non angulaires.
- 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...
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.
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();
};
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.