2013-04-15 9 views
29

Come faccio a sapere se un elemento è visibile o nascosto in testacular (gelsomino)?Verifica se alcuni elementi sono visibili o meno

mio DOM assomiglia:

<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> 

O il Select è mostrato o la casella di input, ma non entrambi. Vorrei verificare quale elemento è visibile (in base ad altri criteri), ma non riesco a capire come far funzionare il codice. Ho scritto il seguente codice:

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

ma ottengo un errore:

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

Come posso verificare se l'ingresso è visibile e di selezione è nascosto allo stesso tempo (e viceversa) ?

EDIT: Vorrei aggiungere che si tratta di un capo all'altro di prova

+0

Vedi anche questa domanda: http://stackoverflow.com/questions/16703276/angular-watch- for-ngshow-nghide-changes-in-ancestors-that-affect-child-dom-ele per una soluzione che considera anche la visibilità degli antenati – lanoxx

risposta

48

Questo comportamento è cambiato in angolare 1.2 a causa di ng-animate.

Il codice per ngShow è:

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

Il che significa che sarà aggiungere/rimuovere classe ng-hide per nascondere/mostrare l'elemento.

Così, ad esempio, il modo giusto per verificare se l'elemento è nascosto potrebbe essere:

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

Questa dovrebbe essere la nuova risposta, poiché le cose sono cambiate nel modo in cui gli elementi sono nascosti.Tuttavia, l'uso del metodo .hasClass() potrebbe essere un po 'più facile per gli occhi. – chris

+0

C'è un 'hasClass()' in Jasmine? – georgiosd

+0

@georgiosd: angular.element ha un metodo _hasClass_ – null

6

Visibilità prova

Per impostazione predefinita, il display è impostato su inline per l'ingresso, e inline-block per selezionare. Pertanto, è possibile determinare se uno dei due è attualmente visualizzato testando l'esistenza della proprietà CSS predefinita.

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

Per verificare se uno dei due sono nascosti, sostituire inline e inline-block con un assegno di none, che è come ngShow nasconde un elemento.

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

Questo test è strettamente legato all'implementazione di ng-show che aggiunge fragilità. L'utilizzo del selettore suggerito da 'Shadowedged' per identificare elementi visibili rimanda la logica del test di visibilità e mantiene i test più distanti dall'implementazione. – daddywoodland

+0

Questo ha perfettamente senso, tuttavia, continuo a ricevere l'elemento non è una funzione in un errore di tipo – Winnemucca

14

Eri vicino. Tuttavia, ecco come si dovrebbe verificare la visibilità:

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

** Heads up! ** Funzionerà solo se si dispone di jQuery, altrimenti non funzionerà generando un errore simile a: ' La ricerca di elementi tramite selettori non è supportata da jqLite! 'Controlla qui per ulteriori dettagli: http://embed.plnkr.co/g5ZdYpLrKWR1u8R0GOB9/ (non dimenticare di aprire la console). –

Problemi correlati