Estou tentando testar se um elemento é visível usando o transferidor. Esta é a aparência do elemento:
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
Quando no console do Chrome, posso usar este seletor jQuery para testar se o elemento está visível:
$('[ng-show=saving].icon-spin')
[
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
]
> $('[ng-show=saving].icon-spin:visible')
[]
No entanto, quando tento fazer o mesmo no transferidor, recebo este erro no tempo de execução:
InvalidElementStateError:
invalid element state: Failed to execute 'querySelectorAll' on 'Document':
'[ng-show=saving].icon-spin:visible' is not a valid selector.
Por que isso não é válido? Como posso verificar a visibilidade usando o transferidor?
angularjs
visible
protractor
limp_chimp
fonte
fonte
Respostas:
Isso deve servir:
Lembre-se de que o transferidor
$
não é jQuery e ainda:visible
não faz parte dos seletores + pseudo-seletores CSS disponíveisMais informações em https://stackoverflow.com/a/13388700/511069
fonte
isDisplayed()
mas apenas se expande para resolver a promessa de integridade, embora essa etapa seja opcional e destinada apenas a incluir condicionais em seus testes, o que é uma prática ruim. @asenovm, você pode elaborar mais o seu comentário "Isso é totalmente errado"?.toBeTruthy();
use.toBe(true)
..toBeTruthy();
irá corresponder a coisas como [], 'falso', 42. Basicamente, qualquer coisa que espere 0, "", nulo, indefinido, NaN ou falso é verdadeiro.A maneira correta de verificar a visibilidade de um elemento com o Protractor é chamar o
isDisplayed
método. Você deve ter cuidado, poisisDisplayed
não retorna um booleano, mas simpromise
fornece a visibilidade avaliada. Já vi muitos exemplos de código que usam esse método incorretamente e, portanto, não avaliam sua visibilidade real.Exemplo para obter a visibilidade de um elemento:
No entanto, você não precisa disso se estiver apenas verificando a visibilidade do elemento (em vez de obtê-lo) porque os patches do transferidor Jasmine esperam (), portanto, ele sempre espera que as promessas sejam resolvidas. Consulte github.com/angular/jasminewd
Então você pode apenas fazer:
Já que você está usando
AngularJS
para controlar a visibilidade desse elemento, você também pode verificar seu atributo de classeng-hide
assim:fonte
Eu tive um problema semelhante, pois queria retornar apenas os elementos que estavam visíveis em um objeto de página. Descobri que consigo usar o css
:not
. No caso deste problema, isso deve fazer você ...No contexto de um objeto de página, você pode obter SOMENTE os elementos que são visíveis dessa maneira também. Por exemplo. dada uma página com vários itens, onde apenas alguns são visíveis, você pode usar:
Isso irá retornar todos os
i.icon
s visíveisfonte
Se houver vários elementos no DOM com o mesmo nome de classe. Mas apenas um dos elementos é visível.
Neste exemplo, o filtro pega uma coleção de elementos e retorna um único elemento visível usando isDisplayed () .
fonte
filteredElement.length === 0
?Essa resposta será robusta o suficiente para funcionar com elementos que não estão na página, portanto, falhará normalmente (não lançará uma exceção) se o seletor não conseguir encontrar o elemento.
fonte
Para esperar pela visibilidade
Truque Xpath para encontrar apenas elementos visíveis
fonte
fonte
Aqui estão alguns trechos de código que podem ser usados para frameworks que usam Typescript, protractor, jasmine
// Asserting a text
// Asserting an element
// Asserting a form
fonte