Quiero asegurarme de que haya un elemento presente antes de que el controlador web comience a hacer cosas.
Estoy tratando de hacer que algo como esto funcione:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Principalmente estoy luchando por cómo configurar la función anynomous ...
TimeSpan.FromSeconds(5)
. Lo deja más claro IMORespuestas:
Alternativamente, puede usar la espera implícita:
fuente
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
El uso de la solución proporcionada por Mike Kwan puede tener un impacto en el rendimiento general de las pruebas, ya que la espera implícita se utilizará en todas las llamadas FindElement. Muchas veces querrá que FindElement falle inmediatamente cuando un elemento no esté presente (está probando una página con formato incorrecto, elementos faltantes, etc.). Con la espera implícita, estas operaciones esperarían a que expire todo el tiempo de espera antes de lanzar la excepción. La espera implícita predeterminada se establece en 0 segundos.
He escrito un pequeño método de extensión en IWebDriver que agrega un parámetro de tiempo de espera (en segundos) al
FindElement()
método. Es bastante claro:No almacené en caché el objeto WebDriverWait ya que su creación es muy barata, esta extensión se puede usar simultáneamente para diferentes objetos WebDriver, y solo hago optimizaciones cuando finalmente se necesita.
El uso es sencillo:
fuente
WebDriverWait
es delOpenQA.Selenium.Support.UI
espacio de nombres y viene en un paquete separado llamadoSelenium WebDriver Support Classes
NuGetSelenium WebDriver Support Classes
ahora aparece en NuGet como "Selenium.Support" , la versión actual es 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
y ahora funciona muy bien. Aviso en caso de que alguien más obtenga elementos aleatorios que aún no se encuentran.También puedes usar
ExpectedConditions.ElementExists
Entonces buscará una disponibilidad de elementos como esa
Fuente
fuente
DotNetSeleniumExtras.WaitHelpers
(mencionado por @Dejan arriba) "no se mantiene, los problemas no se solucionarán, los RP no serán aceptados". (fuente: github.com/SeleniumHQ/selenium/issues/… ). Su editor está buscando un mantenedor para que se lo quite.Aquí hay una variación de la solución de @ Loudenvier que también funciona para obtener múltiples elementos:
fuente
Inspirado en la solución de Loudenvier, aquí hay un método de extensión que funciona para todos los objetos ISearchContext, no solo IWebDriver, que es una especialización de los primeros. Este método también admite esperar hasta que se muestre el elemento.
Ejemplo de uso:
fuente
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
esa, aún prevalecerá el valor de tiempo de espera que establezca aquí.Stopwatch
alrededor de la llamada al método de extensión y unConsole.WriteLine()
dentro de la lambda enviada aUntil()
. El cronómetro midió casi exactamente 60 segundos y solo se escribió un mensajeConsole
. ¿Me estoy perdiendo de algo?Confundí la función anyomous con predicado. Aquí hay un pequeño método de ayuda:
fuente
Puedes encontrar algo como esto en C #.
Esto es lo que usé en JUnit - Selenium
Importar paquetes relacionados
fuente
fuente
fuente
El comando clickAndWait no se convierte cuando elige el formato Webdriver en Selenium IDE. Aquí está la solución. Agregue la línea de espera a continuación. Siendo realistas, el problema fue el clic o evento que ocurrió antes de esta línea 1 en mi código C #. Pero realmente, solo asegúrese de tener un WaitForElement antes de cualquier acción en la que haga referencia a un objeto "Por".
Código HTML:
C # / N Código de unidad:
fuente
Pitón:
desde EC puede elegir otras condiciones, así que pruebe esto: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
fuente
Prueba este código:
fuente
Espera explícita
Ejemplo:
fuente
Usé Rn222 y Aknuds1 para usar un ISearchContext que devuelve un solo elemento o una lista. Y se puede especificar un número mínimo de elementos:
Ejemplo de uso:
fuente
No desea esperar demasiado antes de que cambie el elemento. En este código, el controlador web espera hasta 2 segundos antes de continuar.
fuente
Como estoy separando las definiciones de elementos de página y los escenarios de prueba de página usando IWebElement ya encontrado para la visibilidad, podría hacerse así:
fuente
Esta es la función reutilizable para esperar un elemento presente en DOM usando Espera explícita.
fuente
Podemos lograr eso así:
fuente
WebDriverWait
No tendrá efecto.Esto arrojaría inmediatamente una excepción una vez que la página sea "interactiva". No sé por qué, pero el tiempo de espera actúa como si no existiera.
Quizás
SeleniumExtras.WaitHelpers
funciona pero no lo intenté. Es oficial pero se dividió en otro paquete nuget. Puede consultar C # Selenium 'ExpectedConditions is obsoleto' .Yo mismo estoy usando
FindElements
y verifico siCount == 0
, si es cierto, lo usoawait Task.Delay
. Realmente no es del todo eficiente.fuente
Puedes usar lo siguiente
fuente
¡Veo varias soluciones ya publicadas que funcionan muy bien! Sin embargo, en caso de que alguien necesite algo más, ¡pensé que publicaría dos soluciones que utilicé personalmente en selenio C # para probar si un elemento está presente! Espero que ayude, saludos!
Aqui esta el segundo
fuente
fuente
La primera respuesta es buena, mi problema fue que las excepciones no controladas no cerraron correctamente el controlador web y mantuvieron el mismo primer valor que había usado, que era 1 segundo.
Si tienes el mismo problema
restart you visual studio
y asegúrate de esoall the exceptions are handled
correctamente.fuente
Estaba buscando cómo esperar en Selenium por la condición, aterricé en este hilo y esto es lo que uso ahora:
ReadCell(row, col) != ""
Puede ser cualquier condición. Me gusta de esta manera porque:fuente