Alguém pode me deixar como posso fazer selênio esperar até o tempo em que a página carrega completamente? Quero algo genérico, sei que posso configurar o WebDriverWait e chamar algo como 'find' para fazê-lo esperar, mas não vou tão longe. Eu só preciso testar se a página carrega com sucesso e passar para a próxima página para testar.
Encontrei algo no .net, mas não consegui fazê-lo funcionar em java ...
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Alguma idéia de alguém?
Respostas:
Tente este código:
O código acima irá esperar até 10 segundos para carregar a página. Se o carregamento da página exceder o tempo, ele lançará o
TimeoutException
. Você captura a exceção e faz suas necessidades. Não tenho certeza se ele sai do carregamento da página após a exceção lançada. ainda não tentei esse código. Quer apenas tentar.Esta é uma espera implícita. Se você definir isso uma vez, ele terá o escopo até a instância do Driver da Web ser destruída.
Consulte a documentação para
WebDriver.Timeouts
obter mais informações.fonte
Sua solução sugerida aguarda apenas que o DOM
readyState
sinalizecomplete
. No entanto, o Selenium, por padrão, tenta aguardar o carregamento das páginas (e um pouco mais) na página através dos métodosdriver.get()
eelement.click()
. Eles já estão bloqueando, aguardam o carregamento completo da página e eles devem estar funcionando bem.Os problemas, obviamente, são os redirecionamentos por meio de solicitações AJAX e scripts em execução - aqueles não podem ser capturados pelo Selenium, não espera que eles terminem. Além disso, você não pode pegá-los de maneira confiável
readyState
- ele espera um pouco, o que pode ser útil, mas sinalizarácomplete
muito antes de todo o conteúdo AJAX ser baixado.Não existe uma solução geral que funcione em todos os lugares e para todos, é por isso que é difícil e todo mundo usa algo um pouco diferente.
A regra geral é confiar no WebDriver para fazer sua parte, usar esperas implícitas e depois esperas explícitas para os elementos que você deseja afirmar na página, mas há muito mais técnicas que podem ser feitas. Você deve escolher aquele (ou uma combinação de vários deles) que funciona melhor no seu caso, na sua página testada.
Veja minhas duas respostas sobre isso para obter mais informações:
fonte
element.click()
chamadas.Esta é uma versão Java funcional do exemplo que você deu:
Exemplo para c #:
fonte
import com.google.common.base.Predicate
Aqui está minha tentativa de uma solução completamente genérica, em Python:
Primeiro, uma função genérica de "espera" (use um WebDriverWait, se quiser, acho-os feios):
Em seguida, a solução conta com o fato de que o selênio registra um número de identificação (interno) para todos os elementos em uma página, incluindo o
<html>
elemento de nível superior . Quando uma página é atualizada ou carregada, ela obtém um novo elemento html com um novo ID.Então, supondo que você queira clicar em um link com o texto "meu link", por exemplo:
Para um auxiliar genérico Python, reutilizável e reutilizável, você pode criar um gerenciador de contexto:
E então você pode usá-lo em praticamente qualquer interação de selênio:
Eu acho que é à prova de balas! O que você acha?
Mais informações em um post do blog aqui
fonte
Eu tive um problema parecido. Eu precisava esperar até que meu documento estivesse pronto, mas também até que todas as chamadas do Ajax terminassem. A segunda condição mostrou-se difícil de detectar. No final, verifiquei as chamadas ativas do Ajax e funcionou.
Javascript:
Método C # completo:
fonte
document.readyState == 'complete' && jQuery.active == 0
com React?fonte
Para C # NUnit, você precisa converter o WebDriver em JSExecuter e, em seguida, executar o script para verificar se o estado document.ready está completo ou não. Verifique o código abaixo para referência:
Isso aguardará até que a condição seja atendida ou o tempo limite.
fonte
Para o carregamento inicial da página, notei que "Maximizar" a janela do navegador praticamente espera até que o carregamento da página seja concluído (incluindo fontes)
Substituir:
Com:
do que usar:
Isso carregará a página, espere até a conclusão, maximize e foque nela. Não sei por que é assim, mas funciona.
Se você quiser aguardar o carregamento da página após clicar no próximo ou em qualquer outro gatilho de navegação da página que não seja "Navigate ()", a resposta de Ben Dyer (neste tópico) fará o trabalho.
fonte
Dê uma olhada na estrutura da Web para tapeçaria . Você pode baixar o código fonte lá.
A idéia é sinalizar que a página está pronta pelo atributo html do corpo. Você pode usar essa idéia para ignorar casos de processos complicados.
E então crie a extensão do Selenium webdriver (de acordo com a estrutura da tapeçaria)
Use a extensão ElementIsDisplayed, escrita por Alister Scott .
E, finalmente, crie o teste:
fonte
A resposta de Ben Dryer não foi compilada na minha máquina (
"The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait"
).Versão de trabalho do Java 8:
Versão Java 7:
fonte
Eu tentei esse código e funciona para mim. Eu chamo essa função toda vez que mudo para outra página
fonte
No Nodejs você pode obtê-lo através de promessas ...
Se você escrever esse código, pode ter certeza de que a página está totalmente carregada quando chegar ao ...
Se você escrever esse código, navegará e o selênio aguardará 3 segundos ...
Da documentação do Selenium:
this.get (url) → Regenerável
Agenda um comando para navegar para o URL fornecido.
Retorna uma promessa que será resolvida quando o documento terminar de carregar .
Documentação do Selenium (Nodejs)
fonte
A espera pelo evento document.ready não é a correção completa para esse problema, porque esse código ainda está em uma condição de corrida: Às vezes, esse código é acionado antes que o evento click seja processado e, portanto, retorna diretamente, pois o navegador não foi iniciado carregando a nova página ainda.
Depois de algumas pesquisas, encontrei um post sobre Obay the bode test , que tem uma solução para esse problema. O código c # para essa solução é algo como isto:
`Eu aciono esse método diretamente após o driver.navigate.gotourl, para que ele obtenha uma referência da página o mais rápido possível. Divirta-se com isso!
fonte
normalmente, quando o selênio abre uma nova página com um clique, envia ou obtém métodos, ele espera até que a página seja carregada, mas o problema é que, quando a página recebe uma chamada xhr (ajax), ele nunca espera que a xhr seja carregada, portanto criar um novo método para monitorar um xhr e esperar por eles será bom.
if $.active == 0
portanto, não há chamada xhrs ativa (que funciona apenas com jQuery). para a chamada de javascript ajax, você deve criar uma variável em seu projeto e simulá-la.fonte
Você pode escrever alguma lógica para lidar com isso. Eu escrevi um método que retornará o
WebElement
e esse método será chamado três vezes ou você poderá aumentar o tempo e adicionar uma verificação nula.WebElement
Aqui está um exemplofonte
Eu executei um código javascript para verificar se o documento está pronto. Economizei muito tempo depurando testes de selênio para sites com renderização do lado do cliente.
}
fonte
fonte
Como Rubanov escreveu para C #, eu escrevo para Java, e é:
fonte
Em Java, ele será exibido abaixo: -
fonte
return document.readyState == 'loaded' || return document.readyState == 'complete'
O código a seguir provavelmente deve funcionar:
fonte
Se você tiver uma conexão de rede ou página lenta, é provável que nenhuma das opções acima funcione. Eu tentei todos eles e a única coisa que funcionou para mim é esperar o último elemento visível nessa página. Tomemos, por exemplo, a página da web do Bing. Eles colocaram um ícone CÂMERA (botão de pesquisa por imagem) ao lado do botão de pesquisa principal que fica visível somente após o carregamento da página completa. Se todos fizeram isso, tudo o que precisamos fazer é usar uma espera explícita, como nos exemplos acima.
fonte
fonte
Aqui está algo semelhante, em Ruby:
fonte
Você pode manter o encadeamento até que a página seja recarregada. Esta não é a melhor solução, porque você precisa ter uma estimativa de quanto tempo a página leva para carregar.
fonte
Verifiquei o carregamento da página completo, trabalho no Selenium 3.14.0
fonte
Para as pessoas que precisam esperar que um elemento específico apareça. (c # usado)
Então, se você quiser esperar, por exemplo, se uma classe = "mensagem de erro" existir no DOM, você simplesmente faz:
Para id, será
WaitForElement(driver, By.Id("yourid"));
fonte
Você está usando Angular? Se estiver, é possível que o webdriver não reconheça que as chamadas assíncronas foram concluídas.
Eu recomendo olhar para Paul Hammants ngWebDriver . O método waitForAngularRequestsToFinish () pode ser útil.
fonte