Quero garantir que um elemento esteja presente antes que o webdriver comece a fazer coisas.
Estou tentando fazer algo assim funcionar:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Eu estou lutando principalmente para configurar a função anônima ..
TimeSpan.FromSeconds(5)
. Isso torna mais claro o IMO #Respostas:
Como alternativa, você pode usar a espera implícita:
fonte
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
O uso da solução fornecida por Mike Kwan pode afetar o desempenho geral dos testes, pois a espera implícita será usada em todas as chamadas FindElement. Muitas vezes, você deseja que o FindElement falhe imediatamente quando um elemento não está presente (você está testando uma página malformada, elementos ausentes etc.). Com a espera implícita, essas operações esperariam o tempo limite expirar antes de lançar a exceção. A espera implícita padrão é definida como 0 segundos.
Eu escrevi um pequeno método de extensão no IWebDriver que adiciona um parâmetro de tempo limite (em segundos) ao
FindElement()
método. É bastante auto-explicativo:Não armazenei em cache o objeto WebDriverWait, pois sua criação é muito barata, essa extensão pode ser usada simultaneamente para diferentes objetos do WebDriver e só otimizo quando necessário.
O uso é direto:
fonte
WebDriverWait
são doOpenQA.Selenium.Support.UI
namespace e vem em um pacote separado chamadoSelenium WebDriver Support Classes
em NuGetSelenium WebDriver Support Classes
agora aparece no NuGet como "Selenium.Support" , a versão atual é 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
e ela funciona muito bem agora. Atenção, caso alguém obtenha elementos aleatórios ainda não encontrados.Você também pode usar
ExpectedConditions.ElementExists
Então, você procurará por uma disponibilidade de elemento assim
Fonte
fonte
DotNetSeleniumExtras.WaitHelpers
(referido por @Dejan acima) "não é mantido, os problemas não serão corrigidos, os PRs não serão aceitos". (fonte: github.com/SeleniumHQ/selenium/issues/… ). Seu editor está procurando um mantenedor para substituí-lo.Aqui está uma variação da solução da @ Loudenvier que também funciona para obter vários elementos:
fonte
Inspirado na solução de Loudenvier, aqui está um método de extensão que funciona para todos os objetos ISearchContext, não apenas para o IWebDriver, que é uma especialização do primeiro. Este método também suporta aguardar até que o elemento seja exibido.
Exemplo de uso:
fonte
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
essa, ainda superará o valor do tempo limite definido aqui.Stopwatch
ao redor da chamada ao método de extensão e umConsole.WriteLine()
dentro do lambda enviado paraUntil()
. O cronômetro mediu quase exatamente 60 segundos e apenas uma mensagem foi gravadaConsole
. Estou faltando alguma coisa aqui?Confundi função anômala com predicado. Heres um pequeno método auxiliar:
fonte
Você pode descobrir algo assim em C #.
Isto é o que eu usei no JUnit - Selenium
Importar pacotes relacionados
fonte
fonte
fonte
O comando clickAndWait não é convertido quando você escolhe o formato Webdriver no Selenium IDE. Aqui está a solução alternativa. Adicione a linha de espera abaixo. Realisticamente, o problema foi o clique ou evento que ocorreu antes desta linha 1 no meu código C #. Mas, na verdade, verifique se você tem um WaitForElement antes de qualquer ação em que você está fazendo referência a um objeto "Por".
Código HTML:
Código da unidade:
fonte
Pitão:
da CE, você também pode escolher outras condições: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
fonte
Tente este código:
fonte
Espera explícita
Exemplo:
fonte
Utilizou Rn222 e Aknuds1 para usar um ISearchContext que retorna um único elemento ou uma lista. E um número mínimo de elementos pode ser especificado:
Exemplo de uso:
fonte
Você não deseja esperar muito antes que o elemento seja alterado. Nesse código, o webdriver aguarda até 2 segundos antes de continuar.
fonte
Como estou separando as definições dos elementos da página e os cenários de teste da página usando o IWebElement já encontrado para obter visibilidade, isso pode ser feito da seguinte maneira:
fonte
Essa é a função reutilizável para aguardar um elemento presente no DOM usando a Explicit Wait.
fonte
Podemos conseguir isso assim:
fonte
WebDriverWait
não terá efeito.Isso geraria uma exceção imediatamente quando a página fosse "interativa". Não sei por que, mas o tempo limite age como se não existisse.
Talvez
SeleniumExtras.WaitHelpers
funcione, mas não tentei. É oficial, mas foi dividido em outro pacote de pepitas. Você pode consultar o C # Selenium 'ExpectedConditions is obsolete' .Eu mesmo estou usando
FindElements
e verifique seCount == 0
, se for verdade, useawait Task.Delay
. Realmente não é tão eficiente.fonte
Você pode usar o seguinte
fonte
Vejo várias soluções já postadas que funcionam muito bem! No entanto, caso alguém precise de algo mais, pensei em publicar duas soluções que eu pessoalmente usei no selênio C # para testar se um elemento está presente! Espero que ajude, felicidades!
Aqui é o segundo
fonte
fonte
A primeira resposta é boa, meu problema era que as exceções não tratadas não fechavam o driver da web corretamente e mantinha o mesmo primeiro valor que eu usei, que foi de 1 segundo.
Se você tiver o mesmo problema
restart you visual studio
e garantir issoall the exceptions are handled
corretamente.fonte
Estava pesquisando como esperar no Selenium pela condição, desembarcou nesse segmento e aqui está o que eu uso agora:
ReadCell(row, col) != ""
pode ser qualquer condição. Assim, porque:fonte