Estoy tratando de probar si un elemento es visible usando un transportador. Así es como se ve el elemento:
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
Cuando estoy en la consola de Chrome, puedo usar este selector de jQuery para probar si el elemento 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')
[]
Sin embargo, cuando intento hacer lo mismo en el transportador, aparece este error en tiempo de ejecución:
InvalidElementStateError:
invalid element state: Failed to execute 'querySelectorAll' on 'Document':
'[ng-show=saving].icon-spin:visible' is not a valid selector.
¿Por qué esto no es válido? ¿Cómo puedo comprobar la visibilidad con un transportador?
angularjs
visible
protractor
limp_chimp
fuente
fuente
Respuestas:
Esto debería hacerlo:
Recuerde que el transportador
$
no es jQuery y aún:visible
no es parte de los selectores CSS disponibles + pseudo-selectoresMás información en https://stackoverflow.com/a/13388700/511069
fuente
isDisplayed()
pero solo se expande para resolver la promesa de integridad, aunque ese paso es opcional y solo está destinado a incluir condicionales en sus pruebas, lo cual es una mala práctica. @asenovm, ¿puede desarrollar más su comentario de "Esto es simplemente incorrecto"?.toBeTruthy();
use.toBe(true)
en su lugar..toBeTruthy();
coincidirá con cosas como [], 'falso', 42. Básicamente, cualquier cosa que espere 0, "", nulo, indefinido, NaN o falso es verdadero.La forma correcta de verificar la visibilidad de un elemento con Protractor es llamar al
isDisplayed
método. Sin embargo, debe tener cuidado yaisDisplayed
que no devuelve un valor booleano, sino quepromise
proporciona la visibilidad evaluada. He visto muchos ejemplos de código que usan este método incorrectamente y, por lo tanto, no evalúan su visibilidad real.Ejemplo para obtener la visibilidad de un elemento:
Sin embargo, no necesita esto si solo está verificando la visibilidad del elemento (en lugar de obtenerlo) porque el transportador parchea Jasmine espera () por lo que siempre espera a que se resuelvan las promesas. Ver github.com/angular/jasminewd
Entonces puedes hacer:
Dado que está utilizando
AngularJS
para controlar la visibilidad de ese elemento, también puede verificar su atributo de clase deng-hide
esta manera:fuente
Tuve un problema similar, ya que solo quería devolver elementos que fueran visibles en un objeto de página. Descubrí que puedo usar css
:not
. En el caso de este problema, esto debería servirle ...En el contexto de un objeto de página, también puede obtener SOLAMENTE aquellos elementos que son visibles de esta manera. P.ej. dada una página con varios elementos, donde solo algunos son visibles, puede usar:
Esto te devolverá todos los
i.icon
s visiblesfuente
Si hay varios elementos en DOM con el mismo nombre de clase. Pero solo uno de los elementos es visible.
En este ejemplo, el filtro toma una colección de elementos y devuelve un único elemento visible usando isDisplayed () .
fuente
filteredElement.length === 0
?Esta respuesta será lo suficientemente robusta como para funcionar con elementos que no están en la página, por lo que fallará con gracia (sin generar una excepción) si el selector no pudo encontrar el elemento.
fuente
Para esperar visibilidad
Truco de Xpath para encontrar solo elementos visibles
fuente
fuente
Aquí están los pocos fragmentos de código que se pueden usar para el marco que usa TypeScript, transportador, jazmín
// Afirmar un texto
// Afirmar un elemento
// Afirmar un formulario
fuente