Estou trabalhando em um Java Selenium-WebDriver. Eu adicionei
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
e
WebElement textbox = driver.findElement(By.id("textbox"));
porque meus aplicativos levam alguns segundos para carregar a interface do usuário. Portanto, defino 2 segundos implícito e espera. mas não consegui localizar a caixa de texto do elemento
Então eu adiciono Thread.sleep(2000);
Agora funciona bem. Qual é a melhor maneira?
java
selenium
selenium-webdriver
webdriver
Principe
fonte
fonte
Respostas:
Bem, existem dois tipos de espera: espera explícita e implícita. A ideia de espera explícita é
O conceito de espera implícita é
Você pode obter a diferença nos detalhes aqui .
Em tais situações, prefiro usar espera explícita (
fluentWait
em particular):fluentWait
função retorna seu elemento da web encontrado. Da documentação em diantefluentWait
: Uma implementação da interface Wait que pode ter seu tempo limite e intervalo de pesquisa configurados em tempo real. Cada instância FluentWait define a quantidade máxima de tempo de espera por uma condição, bem como a frequência com a qual verificar a condição. Além disso, o usuário pode configurar a espera para ignorar tipos específicos de exceções enquanto espera, como NoSuchElementExceptions ao pesquisar um elemento na página. Detalhes você pode obter aquiO uso de,
fluentWait
no seu caso, seja o seguinte:Esta abordagem IMHO é melhor, pois você não sabe exatamente quanto tempo esperar e no intervalo de pesquisa, você pode definir o valor de tempo arbitrário por meio do qual a presença do elemento será verificada. Saudações.
fonte
import com.google.common.base.Function;
, nãoimport java.util.function.Function;
Function
estava sendo usado. Não foi óbvio para mim no início. Obrigado pela resposta.driver -> driver.findElement(locator)
. Ao usar isso, você não precisará de uma instrução de importação..withTimeout(Duration.ofSeconds(30)).pollingEvery(Duration.ofSeconds(5))
em vez de:.withTimeout(30, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS)
Este tópico é um pouco mais antigo, mas pensei em postar o que faço atualmente (trabalho em andamento).
Embora eu ainda esteja encontrando situações em que o sistema está sob carga pesada e quando clico em um botão de envio (por exemplo, login.jsp), todas as três condições (veja abaixo) retornam,
true
mas a próxima página (por exemplo, home.jsp) não tem Ainda não comecei a carregar.Este é um método de espera genérico que obtém uma lista de ExpectedConditions.
Eu defini várias ExpectedConditions reutilizáveis (três estão abaixo). Neste exemplo, as três condições esperadas incluem document.readyState = 'complete', nenhum "wait_dialog" presente e nenhum 'spinners' (elementos indicando que dados assíncronos estão sendo solicitados).
Apenas o primeiro pode ser aplicado genericamente a todas as páginas da web.
Dependendo da página, posso usar um ou todos eles:
Existem também ExpectedConditions predefinidos na seguinte classe: org.openqa.selenium.support.ui.ExpectedConditions
fonte
Se estiver usando webdriverJs (node.js),
O código acima faz o navegador esperar 5 segundos após clicar no botão.
fonte
Usar
Thread.sleep(2000);
é uma espera incondicional. Se o seu teste carregar mais rápido, você ainda terá que esperar. Portanto, em princípio, usarimplicitlyWait
é a melhor solução.No entanto, não vejo por
implicitlyWait
que não funciona no seu caso. Você mediu sefindElement
realmente leva dois segundos antes de lançar uma exceção. Em caso afirmativo, você pode tentar usar a espera condicional do WebDriver conforme descrito nesta resposta?fonte
Gosto de usar condições personalizadas. Aqui estão alguns códigos em Python:
Sempre que precisar esperar, você pode fazê-lo explicitamente verificando a existência de um determinado elemento (tal elemento pode variar de página para página).
find_elements_by_id
lista de retornos - vazia ou não, basta verificar.fonte
clique parece estar bloqueando? - aqui está outra maneira de esperar se você estiver usando WebDriverJS:
O código acima aguarda depois que o botão é clicado para a próxima página carregar e então pega o código-fonte da próxima página.
fonte
Implicitamente esperar e Thread.sleep Ambos são usados para sincronização apenas ... mas a diferença é que podemos usar Implicitamente esperar por todo o programa, mas Thread.sleep funcionará apenas para aquele único código ... Aqui minha sugestão é usar Espere implicitamente uma vez no programa quando toda vez que sua página da Web for atualizada significa usar Thread.sleep naquele momento ... será muito melhor :)
Aqui está o meu código:
fonte
Às vezes, a espera implícita parece ser substituída e o tempo de espera é encurtado. [@ eugene.polschikov] tinha uma boa documentação sobre os porquês. Descobri em meus testes e codificação com Selenium 2 que as esperas implícitas são boas, mas ocasionalmente você tem que esperar explicitamente.
É melhor evitar chamar diretamente um tópico para dormir, mas às vezes não há uma boa maneira de contornar isso. No entanto, existem outras opções de espera fornecidas pelo Selenium que ajudam. waitForPageToLoad e waitForFrameToLoad provaram ser especialmente úteis.
fonte
Espera implícita: durante a espera implícita, se o driver da Web não puder localizá-lo imediatamente devido à sua disponibilidade, o WebDriver aguardará o tempo mencionado e não tentará encontrar o elemento novamente durante o período de tempo especificado. Assim que o tempo especificado terminar, ele tentará pesquisar o elemento mais uma vez pela última vez antes de lançar a exceção. A configuração padrão é zero. Depois de definir um tempo, o driver da Web aguarda o período da instância do objeto WebDriver.
Espera explícita: pode haver uma instância em que um elemento específico leva mais de um minuto para carregar. Nesse caso, você definitivamente não gosta de definir um tempo enorme para espera implícita, pois se você fizer isso, seu navegador irá esperar o mesmo tempo para cada elemento. Para evitar essa situação, você pode simplesmente colocar um horário separado apenas no elemento necessário. Seguindo isso, o tempo de espera implícito do seu navegador seria curto para cada elemento e seria grande para um elemento específico.
fonte
Às vezes, a espera implícita falha, dizendo que um elemento existe, mas realmente não existe.
A solução é evitar o uso de driver.findElement e substituí-lo por um método personalizado que usa uma Espera Explícita implicitamente. Por exemplo:
Existem razões adicionais para evitar a espera implícita, além de falhas esporádicas e ocasionais (consulte este link ).
Você pode usar este método de "elemento" da mesma maneira que driver.findElement. Por exemplo:
Se você realmente deseja apenas aguardar alguns segundos para a solução de problemas ou alguma outra ocasião rara, pode criar um método de pausa semelhante ao que o selênio IDE oferece:
fonte
Resposta : aguarde alguns segundos antes que a visibilidade do elemento usando Selenium WebDriver passe pelos métodos abaixo.
implicitlyWait () : a instância do WebDriver espera até o carregamento completo da página. Você deve usar 30 a 60 segundos para aguardar o carregamento completo da página.
ExplicitlyWait WebDriverWait () : a instância do WebDriver espera até o carregamento completo da página.
Observação : use ExplicitlyWait WebDriverWait () para lidar com qualquer WebElement específico.
fonte
Ações de uso -
Consulte o método Actions # pause .
fonte
Prefiro que o código a seguir espere 2 segundos.
fonte
é o pior: sendo uma espera estática, tornará o script de teste mais lento.
esta é uma espera dinâmica
Finalmente, o que sugiro é
com algumas condições predefinidas:
fonte
Isso me ajudou, mas a exceção InterruptedException precisa ser resolvida. Portanto, é melhor envolvê-lo com try and catch:
OU
Adicionar declaração throws:
Eu preferiria o segundo, pois pode-se usar
sleep()
quantas vezes quiser e evitar a repetiçãotry
e ocatch
bloqueio sempresleep()
que for usado.fonte