Como você faz o Selenium 2.0 aguardar o carregamento da página?
java
selenium
webdriver
selenium-webdriver
karthick kumar
fonte
fonte
Respostas:
Você também pode verificar o carregamento de página usando o seguinte código
fonte
Use a classe WebDriverWait
Veja também aqui
Você pode esperar mostrar algum elemento. algo como em C #:
fonte
Se você definir a espera implícita do driver e chamar o
findElement
método em um elemento que você espera estar na página carregada, o WebDriver pesquisará esse elemento até encontrar o elemento ou atingir o valor do tempo limite.fonte: espera implícita
fonte
Em geral, com o Selenium 2.0, o driver da web deve retornar o controle apenas ao código de chamada depois de determinar que a página foi carregada. Caso contrário, você pode ligar
waitforelemement
, que executa o ciclo de chamadasfindelement
até que seja encontrado ou expire (o tempo limite pode ser definido).fonte
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
, aguardando document.readyState estar "completo". Por causa da ida e volta do selênio ao navegador, acho que as condições da corrida são atenuadas, e isso "sempre" funciona para mim. Após "click ()", quando espero que uma página seja carregada, espero explicitamente (usando o WebDriverWait) pelo readystate. ]Implementação Ruby:
fonte
Você pode remover a
System.out
linha. É adicionado para fins de depuração.fonte
Todas essas soluções são válidas para casos específicos, mas elas sofrem de pelo menos um dos dois possíveis problemas:
Eles não são genéricos o suficiente - eles querem que você saiba, antecipadamente, que alguma condição específica será verdadeira para a página que você está acessando (por exemplo, algum elemento será exibido)
Eles estão abertos a uma condição de corrida em que você usa um elemento que está realmente presente na página antiga e na nova página.
Aqui está minha tentativa de uma solução genérica que evita esse problema (em Python):
Primeiro, uma função genérica de "espera" (use um WebDriverWait, se quiser, acho-os feios):
Em seguida, a solução se baseia no fato de que o selênio registra um número de identificação (interno) para todos os elementos em uma página, incluindo o nível superior
<html>
elemento de . 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 sobre isso aqui
fonte
Você também pode usar a classe:
ExpectedConditions
para aguardar explicitamente a exibição de um elemento na página da web antes de executar qualquer ação.Você pode usar a
ExpectedConditions
classe para determinar se um elemento está visível:Veja
ExpectedConditions class Javadoc
a lista de todas as condições que você pode verificar.fonte
A resposta de Imran foi reformulada para o Java 7:
fonte
Essa parece ser uma limitação séria do WebDriver. Obviamente, esperar por um elemento não implica que a página esteja sendo carregada, em particular, o DOM pode ser totalmente construído (estado onready) no qual o JS ainda está em execução e o CSS e as imagens ainda estão sendo carregados.
Acredito que a solução mais simples é definir uma variável JS no evento onload depois que tudo for inicializado e verificar e aguardar essa variável JS no Selenium.
fonte
Se você desejar aguardar o carregamento de um elemento específico, poderá usar o
isDisplayed()
método emRenderedWebElement
:(Exemplo do Guia de introdução de 5 minutos )
fonte
RenderedWebElement
na API. No entanto, oisDisplayed()
método agora está disponível diretamente noWebElement
.Aguarde explicitamente ou espera condicional nessa espera até receber essa condição.
Isso aguardará cada elemento da web por 60 segundos.
Use aguardar implicitamente a espera de todos os elementos da página até o momento especificado.
Isso aguardará cada elemento da web por 60 segundos.
fonte
Use aguardar implicitamente a espera de todos os elementos da página até o tempo determinado.
aguarde cada elemento da página por 30 segundos.
Outra espera é a espera explicitamente ou a espera condicional nessa espera até a condição especificada.
Em id, forneça o ID do elemento estático que é exibido de forma diferente na página, assim que a página for carregada.
fonte
Estou surpreso que os predicados não tenham sido a primeira escolha, pois você normalmente sabe com quais elementos você irá interagir na página que espera carregar. Minha abordagem sempre foi criar predicados / funções como
waitForElementByID(String id)
ewaitForElemetVisibleByClass(String className)
etc., e depois usá-los e reutilizá-los onde eu precisar, seja para carregar uma página ou alterar o conteúdo da página que estou esperando.Por exemplo,
Na minha aula de teste:
No meu pai da classe de teste:
Embora isso pareça muito, ele cuida da verificação repetidamente para você e o intervalo de quantas vezes a verificação pode ser definido juntamente com o tempo de espera máximo antes do tempo limite. Além disso, você reutilizará esses métodos.
Neste exemplo, a classe pai definiu e iniciou oe
WebDriver driver
theWebDriverWait driverWait
.Eu espero que isso ajude.
fonte
A melhor maneira de aguardar o carregamento da página ao usar as ligações Java para o WebDriver é usar o padrão de design do Objeto de Página com o PageFactory. Isso permite que você utilize o
AjaxElementLocatorFactory
que colocar, simplesmente age como uma espera global para todos os seus elementos. Possui limitações em elementos como caixas de seleção ou transições complexas de javascript, mas reduz drasticamente a quantidade de código necessária e acelera os tempos de teste. Um bom exemplo pode ser encontrado neste post do blog. O entendimento básico do Core Java é assumido.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
fonte
Solução NodeJS:
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
Aqui está uma versão do Java 8 da resposta mais votada atualmente :
Onde
myDriver
está umWebDriver
objeto (declarado anteriormente).Nota : Esteja ciente de que este método (
document.readyState
) verifica apenas o DOM.fonte
Ligue abaixo Função no seu script, isso irá esperar até que a página não seja carregada usando javascript
fonte
Você pode mudar do documento para um elemento, no caso em que apenas parte de um documento está sendo alterada.
Esta técnica foi inspirada na resposta de sincebasic.
fonte
SeleniumWaiter :
E para você usá-lo :
fonte
Você pode usar o método existente abaixo para definir o tempo para o pageeLoadTimeout no exemplo abaixo, se a página estiver demorando mais de 20 segundos para carregar, em seguida, haverá uma exceção do recarregamento da página
fonte
Você pode esperar explicitamente que um elemento seja exibido na página da web antes de executar qualquer ação (como element.click ())
Isto é o que eu usei para um cenário semelhante e funciona bem.
fonte
Meu jeito simples:
fonte
A melhor maneira que eu vi é utilizar o
stalenessOf
ExpectedCondition, para aguardar a página antiga ficar obsoleta.Exemplo:
Esperará dez segundos até que a tag HTML antiga fique obsoleta e, em seguida, lançará uma exceção se isso não acontecer.
fonte
Eu uso o node + selenium-webdriver (que é a versão 3.5.0 agora). o que eu faço para isso é:
fonte
Você pode esperar. existem basicamente 2 tipos de espera em selênio
- espera implícita
Isso é muito simples, veja a sintaxe abaixo:
- Espera explícita
Aguarde explicitamente ou espera condicional nessa espera até que uma determinada condição ocorra.
Você pode usar outras propriedades como
visblityOf()
,visblityOfElement()
fonte
Se alguém usa selenida:
Mais condições podem ser encontradas aqui: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
fonte
No meu caso, usei o seguinte para conhecer o status de carregamento da página. Em nosso aplicativo, os gifs de carregamento estão presentes e os ouço da seguinte maneira para eliminar o tempo de espera indesejado no script.
Onde o xpath localiza o gif no HTML DOM. Depois disso, você também pode implementar seus métodos de ação Clique em.
fonte
Cara, todas essas respostas requerem muito código. Isso deve ser uma coisa simples, pois é bastante comum.
Por que não injetar um javascript simples com o driver da web e verificar. Este é o método que eu uso na minha classe de webscraper. O javascript é bastante básico, mesmo se você não conhece js.
fonte
Como fazer com que o Selenium aguarde o carregamento da página após um clique fornece a seguinte abordagem interessante:
WebElement
partir da página antiga.WebElement
até queStaleElementReferenceException
seja lançada.Código de amostra:
fonte
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.