J'essaie de tester si un élément est visible à l'aide d'un rapporteur. Voici à quoi ressemble l'élément:
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
Dans la console Chrome, je peux utiliser ce sélecteur jQuery pour tester si l'élément est visible:
$('[ng-show=saving].icon-spin')
[
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
]
> $('[ng-show=saving].icon-spin:visible')
[]
Cependant, lorsque j'essaie de faire la même chose dans rapporteur, j'obtiens cette erreur au moment de l'exécution:
InvalidElementStateError:
invalid element state: Failed to execute 'querySelectorAll' on 'Document':
'[ng-show=saving].icon-spin:visible' is not a valid selector.
Pourquoi n'est-ce pas valable? Comment puis-je vérifier la visibilité à l'aide du rapporteur?
angularjs
visible
protractor
limp_chimp
la source
la source
Réponses:
Cela devrait le faire:
Rappelez-vous que le rapporteur
$
n'est pas jQuery et:visible
ne fait pas encore partie des sélecteurs CSS + pseudo-sélecteurs disponiblesPlus d'informations sur https://stackoverflow.com/a/13388700/511069
la source
isDisplayed()
mais se développe simplement pour résoudre la promesse d'exhaustivité, bien que cette étape soit facultative et destinée uniquement à inclure des conditions dans vos tests, ce qui est une mauvaise pratique. @asenovm pouvez-vous développer davantage votre commentaire "C'est tout simplement faux"?.toBeTruthy();
utiliser à la.toBe(true)
place..toBeTruthy();
correspondra à des choses comme [], 'false', 42. Fondamentalement, tout ce qui attend 0, "", null, undefined, NaN ou false est vrai.La méthode correcte pour vérifier la visibilité d'un élément avec Protractor est d'appeler la
isDisplayed
méthode. Vous devez cependant faire attention carisDisplayed
ne renvoie pas un booléen, mais plutôt unpromise
fournissant la visibilité évaluée. J'ai vu de nombreux exemples de code qui utilisent cette méthode à tort et n'évaluent donc pas sa visibilité réelle.Exemple pour obtenir la visibilité d'un élément:
Cependant, vous n'en avez pas besoin si vous ne faites que vérifier la visibilité de l'élément (par opposition à l'obtenir) car le rapporteur corrige Jasmine expect () afin qu'il attend toujours que les promesses soient résolues. Voir github.com/angular/jasminewd
Vous pouvez donc simplement faire:
Puisque vous utilisez
AngularJS
pour contrôler la visibilité de cet élément, vous pouvez également vérifier son attribut de classeng-hide
comme ceci:la source
J'ai eu un problème similaire, en ce sens que je ne voulais que des éléments de retour visibles dans un objet de page. J'ai trouvé que je suis capable d'utiliser le css
:not
. Dans le cas de ce problème, cela devrait vous faire ...Dans le contexte d'un objet de page, vous pouvez également obtenir UNIQUEMENT les éléments visibles de cette manière. Par exemple. étant donné une page avec plusieurs éléments, dont seuls certains sont visibles, vous pouvez utiliser:
Cela vous rendra tous visibles
i.icon
sla source
S'il y a plusieurs éléments dans DOM avec le même nom de classe. Mais un seul élément est visible.
Dans cet exemple, le filtre prend une collection d'éléments et renvoie un seul élément visible à l'aide de isDisplayed () .
la source
filteredElement.length === 0
?Cette réponse sera suffisamment robuste pour fonctionner pour les éléments qui ne sont pas sur la page, échouant donc correctement (ne lançant pas d'exception) si le sélecteur ne parvient pas à trouver l'élément.
la source
Attendre la visibilité
Astuce Xpath pour ne trouver que les éléments visibles
la source
la source
Voici les quelques extraits de code qui peuvent être utilisés pour les frameworks qui utilisent Typescript, rapporteur, jasmine
// Affirmer un texte
// Affirmation d'un élément
// Affirmation d'un formulaire
la source