Sunday 19 November 2017

Webdriver Waitforexist


O objetivo do meu teste é afirmar que um pop-up não aparece após determinadas ações. Anteriormente para testar se o popup existe, usei o tratamento de exceções. Isso funciona bem para o teste. Para afirmar se o popup existe. Mas assim que eu mudar o objetivo para. Afirme se o popup não existe, a solução de tratamento de exceção torna-se muito cara (o tratamento de exceção demora muito no python) e uma prova que seria executada em 3 segundos agora leva até um minuto. Existe uma maneira de contornar isso. Uma maneira mais rápida de verificar se um elemento não existe usando a ligação de webdriver python. Você pode potencialmente acelerá-lo usando várias maneiras: Espera implícita Isso é mencionado por tstempko. No entanto, a espera implícita tem uma desvantagem. Isso faz com que o driver não aguarde todos os elementos de interface do usuário quando ele for definido como 0. No seu caso, ele não é ideal. Pode haver um momento em que você realmente tenha que esperar que o elemento UI apareça, então seu teste será interrompido sem motivo válido. Espera explícita Você pode configurar uma espera explícita apenas para esta chamada. Isso permite uma maneira mais robusta de aguardar a exibição do elemento UI. O executor de Javascript para mim, existem alguns elementos da web que são pouco confiáveis ​​para detectar o tempo todo. O que vou usar é o executor do javascript como este: A coisa boa sobre o JavaScriptExcutor é que, enquanto o javascript estiver carregado, você pode executá-lo. O navegador não precisa aguardar a renderização do elemento. A desvantagem disso é que não é um comportamento de usuários mímicos. Eu uso isso apenas para passar para a próxima área de teste que eu estou interessado. Em uma nota lateral, ao invés do método try-except que você tem, você pode querer tentar codificá-lo dessa maneira: Infelizmente, meu código está em Java. Eu acho que existe um método similar em equivalente de Python. Respondeu 15 de janeiro 14 às 11:19 Em python, para afirmar que algo é visível use: isdisplayed () aguardará até que o elemento seja visível ou ele expirará Se você quiser afirmar que um elemento não é visível use: se o elemento for Não exibido será retornado Verdadeiramente respondido imediatamente 14 de dezembro 16 às 5:03 Sua resposta 2017 Empilhar Trocar, IncObbitar o Testar Cabra Qua 03 de setembro de 2014 Por Harry Oft-ouvido é o grito do destino. De vez em quando você é mordido por um comportamento estranho em um de seus testes Selenium. Diga-lhe para clicar em um link e, em seguida, pergunte-lhe algo sobre a nova página, e retorna algo da página antiga: Você coça a cabeça e eventualmente conclui que o Selenium deve buscar o elemento da página antiga. Por que isso faria isso, você exclama em uma raiva de programador. Na vida real, quando você clica em um link, você vê o navegador começar a carregar uma nova página, e você espera que ele seja carregado, é certo, o que você quer Selenium para fazer também, e deve ser totalmente trivial para implementar Selenium deve esperar até a página ter completado o carregamento depois de clicar com um tempo de espera sã talvez. Existe até uma API document. readyState para verificar se uma página carregou o Grrr. O fato é que, do ponto de vista do Selenium, não é tão simples (e estou grato por David da Mozilla (AutomatedTester) por explicar isso com paciência, mais de uma vez.) Você vê, o Selenium não tem como saber se você está Pediu para clicar em um hiperlink real que vá para um novo URL, ou se o link vai para a mesma página, ou se o clique será interceptado por algum tipo de JavaScript para fazer algumas coisas de UI ricas na mesma página. Mais do que isso, uma vez que a webdriver do Selenium se tornou mais avançada, os cliques são muito mais como cliques reais, o que tem o benefício de tornar nossos testes mais realistas, mas também significa que é difícil para o Selenium poder acompanhar o impacto que um clique tem Nos navegadores internos - pode tentar pesquisar o navegador por seu status carregado na página imediatamente depois de clicar, mas isso está aberto a uma condição de corrida onde o navegador foi multitarefa, ainda não conseguiu lidar com o clique, e ele dá Você é o. ready State da página antiga. Então, em vez disso, o Selenium faz o melhor. O argumento de aplicação implícita, pelo menos, colocará um pequeno loop de tentativa se você tentar e buscar um elemento que não existe na página antiga: Mas o problema vem quando a coisa na nova página também existe na página antiga. Então o que fazer A solução recomendada é uma espera explícita: vários problemas com isso, porém: HIDEOUSLY UGLY Não é genérico - mesmo que eu escreva um bom invólucro, é tedioso ter que chamá-lo sempre que eu clicar em uma coisa, especificando Uma outra coisa diferente para esperar por cada vez e não funcionará para o caso quando eu quiser verificar se algum texto permanece o mesmo entre cargas de página. Realmente, eu só quero uma maneira confiável de esperar até que a página termine de carregar depois de clicar em uma coisa. Eu entendo totalmente que David e os amigos não vão fornecer isso para mim por padrão, porque eles não podem dizer o que é um clique de Javascript e o que é um clique que vai para uma nova página, mas eu sei. Mas, como fazer isso, algumas coisas que não funcionarão. A tentativa ingênua seria algo assim: a função waitfor helper é boa, mas, infelizmente, a página do mouse é acessível à condição de corrida, onde nós conseguimos executar o script na página anterior, antes do navegador Começou a processar o clique, e o pagehasloaded apenas retorna o verdadeiro imediatamente. Nossa solução de trabalho atual Crédito total para a ThomasMarks por ter chegado com isso: se você mantiver algumas referências a elementos da página antiga, por sua vez, eles ficarão obsoletos uma vez que o DOM se atualize e os elementos obsoletos fazem com que o selênio eleve uma StaleElementReferenceException se você tentar E interagir com eles. Então, basta pesquisar um até obter um erro. À prova de balas ou, heres uma versão genérica, desinfetada da mesma coisa, com base na comparação de IDs internos do Seleniums para um objeto e transformada em um bom gerenciador de contexto Pythonic: atualização 2014-09-06 - veja os comentários, é possível comparando ids Não é tão eficaz quanto a espera de exceções de referência obsoletas. Investigar, mas advertiu que YMMV por enquanto. E agora podemos fazer: E acho que isso pode ser à prova de balas e para pontos de bônus. (Crédito para Tommy Beadle para esta solução) Verifica-se que o selênio possui uma condição incorporada chamada stalenessof. Bem como a sua própria implementação de espera. Use-os, ao lado do decorador do contextomanager e da palavra-chave de desempenho mágico, mas-pouco-assustador, e você obtém: Note que esta solução funciona apenas para cliques não-javascript, ou seja, cliques que farão com que o navegador carregue uma nova página e Carregue assim um novo elemento de corpo HTML. Diz-me o que pensas

No comments:

Post a Comment