2013-04-15 6 views
29

Comment puis-je savoir si un élément est visible ou caché dans testacular (jasmin)?Tester si certains éléments sont visibles ou non

Mon DOM ressemble:

<div class="span5 value-entry"> 
    <input type="text" ng-model="query.value" placeholder="Enter value" class="input-large" ng-show="genericInput(criteria.attribute)"> 
    <select ng-model="query.value" ng-options="entry for entry in filteredValue(criteria.attribute)" class="input-medium" ng-show="!genericInput(criteria.attribute)"> 
     <option value="">-- Select Value --</option>. 
    </select> 
</div> 

Soit la sélection est affichée ou la zone d'entrée, mais pas les deux. Je souhaite vérifier quel élément est visible (en fonction d'autres critères), mais je n'arrive pas à comprendre comment faire fonctionner le code. J'ai écrit le code suivant:

expect(element('.value-entry input').is(':visible')).toBe(true); 

Mais je reçois une erreur:

TypeError: Object #<Object> has no method 'is' 

Comment puis-je vérifier si l'entrée est visible et la sélection est caché en même temps (et vice versa) ?

EDIT: Je voudrais ajouter ici que c'est une fin pour mettre fin à essai

+0

Voir aussi cette question: http://stackoverflow.com/questions/16703276/angular-watch- for-ngshow-nghide-changes-in-ancêtres-that-affect-child-dom-ele pour une solution qui considère également la visibilité des ancêtres – lanoxx

Répondre

48

Ce comportement a changé angulaire 1.2 en raison de ng-animate.

Le code pour ngShow est:

var ngShowDirective = ['$animate', function($animate) { 
    return function(scope, element, attr) { 
    scope.$watch(attr.ngShow, function ngShowWatchAction(value){ 
     $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide'); 
    }); 
    }; 
}]; 

Ce qui signifie qu'il va ajouter/supprimer la classe ng-hide pour masquer/afficher l'élément.

Ainsi, à titre d'exemple, la bonne façon de tester si l'élément est caché serait:

expect(element.find('.value-entry input').hasClass('ng-hide')).toBe(true); 
+4

Cela devrait être la nouvelle réponse, car les choses ont changé dans la façon dont les éléments sont cachés.Cependant, l'utilisation de la méthode .hasClass() peut être un peu plus facile pour les yeux. – chris

+0

Il y a un 'hasClass()' dans Jasmine? – georgiosd

+0

@georgiosd: angular.element a une méthode _hasClass_ – null

6

visibilité test

Par défaut, l'affichage est réglé sur inline pour l'entrée et inline-block pour sélection. Par conséquent, vous pouvez déterminer si l'un ou l'autre est actuellement affiché en testant l'existence de la propriété CSS par défaut.

expect(element('.value-entry input').css('display')).toBe('inline'); 
expect(element('.value-entry select').css('display')).toBe('inline-block'); 

Pour vérifier si l'sont cachés, et remplacer inlineinline-block un chèque de none, qui est la façon dont ngShow cache un élément.

expect(element('.value-entry input').css('display')).toBe('none'); 
expect(element('.value-entry select').css('display')).toBe('none'); 
+2

Ce test est étroitement lié à l'implémentation de ng-show qui ajoute de la fragilité. L'utilisation du sélecteur suggéré par 'Shadowedged' pour identifier les éléments visibles diffère la logique de test de visibilité et maintient vos tests plus loin de la mise en œuvre. – daddywoodland

+0

Cela fait parfaitement sens, cependant, je continue à obtenir l'élément n'est pas une fonction dans une erreur de type – Winnemucca

14

Vous étiez proche. Cependant, voici comment vous devez tester la visibilité:

expect(element('#some-id:visible').count()).toBe(1); 
+1

** Heads up! ** Cela ne fonctionnera que si vous avez jQuery inclus, sinon cela ne fonctionnera pas en jetant une erreur similaire à: ' Rechercher des éléments via des sélecteurs n'est pas supporté par jqLite! 'Vérifiez ici pour plus de détails: http://embed.plnkr.co/g5ZdYpLrKWR1u8R0GOB9/ (n'oubliez pas d'ouvrir la console). –

Questions connexes