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
ElementFinder
et donc attend que Angular se règle sur la page avant d'exécuter une action. - , Il fonctionne lorsque
elm
est unelement(locator)
ouElementFinder
et pasElementArrayFinder
. Si plusieurs éléments sont retournés en utilisant lelocator
spé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
ElementFinder
et 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 locator
au parentelm
comme 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
webdriver
et n'attend donc pas que angular se règle. - prend un
locator
ou unelement
comme 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.