2012-08-28 39 views
20

Tengo un problema con mis pruebas en Selenium WebDriver. El evento Click no siempre funciona cuando un programa intenta hacer clic en el botón. En una prueba todo está bien, en otros no.El método Click() no siempre funcionará

Cada prueba comienza en una página. Primero, el usuario debe elegir una opción de un componente select y luego el usuario hace clic en un botón.

Quiero saber por qué una vez todo está bien, y cuando corro las pruebas una segunda vez no es así?

Aquí está el código fuente de la búsqueda y hacer clic en el botón:

public void clickContinueBtn() {  
    webElement = driver.findElement(By.xpath("//div[@class='btn magenta_s']/a/span")); 
    webElement.click(); 
} 
+0

@saumil dijo: muchas gracias esto es trabajando para mí –

+0

publicación relacionada - http://stackoverflow.com/questions/43011751/how-do-find-out-why-an-element-is-disabled-briefly – testerjoe2

Respuesta

-1

Una posible razón de esto podría ser click() método no es capaz de enviar click evento en cada elemento.

Por lo tanto, podría disparar explícitamente click evento en el elemento que está tratando de hacer clic.

+0

Pero cuando invoco el evento click() en los componentes (botones también) en otras páginas funciona. – user1494328

+0

Eso es qué.Ocurre a veces 'click()' es capaz de disparar el evento en algunos elementos donde no puede también en otros en la misma página. Por lo tanto, intente activar clic evento explícitamente. –

+0

Lo sentimos, ¿qué significa 'explícitamente'? – user1494328

15

También puede intentar usar el método alternativo basado en Javascript para hacer clic. El código para esto puede ser el siguiente:

WebElement element = driver.findElement(By.id("something")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 
+1

No funciona. Cuando se selecciona una opción de seleccionar un componente, la ventana del navegador se está cerrando. – user1494328

18

Me encontré con un problema similar. El método de clic funcionó en otras páginas y luego no funcionó en absoluto en una página en particular.

Una condición de carrera causado el problema:

  1. contenido HTML es interpretado con el botón deshabilitado.
  2. La secuencia de comandos del controlador web selenium se ejecutó antes de que el evento javascript onload se activara (O terminado de ejecutar). Por lo tanto, el button.click se produciría en un elemento deshabilitado. Y nada pasaría
  3. Luego, el evento onload de javascript activaría (o finalizaría la ejecución) y el javascript habilitaría el botón.
  4. Miré la página y no pude entender por qué mi código no funcionaba porque el botón parecía estar habilitado durante la inspección, y si hice clic manualmente en el botón, funcionó.

Una vez que me di cuenta de que era un problema de tiempo, he encontrado la solución aquí: How can I get Selenium Web Driver to wait for an element to be accessible, not just present?

Parafraseando la solución en Ruby:

//This will not return the button until it is enabled. 
button = driver.find_element(:xpath, "//button[@id='myButtonId' and not(@disabled)]") 
button.click 
+1

Esto realmente me ayudó, la secuencia de comandos funcionó perfectamente en otros navegadores pero no en Safari 6 y Android Browsers, no fueron lo suficientemente rápidos. Gracias por compartir esta respuesta! :) –

+0

¿Cómo puedo cambiar do iframe y esperar a onload = "javascript: pageload(); functionalPageLoad();" para volver a cargar la página en Ruby? Me encuentro abriendo el iframe dentro de una página, tengo acceso a él, luego la página se vuelve a cargar y ya no puedo acceder al marco. He leído muchas respuestas con respecto a esperar, dormir, hora, cambiar al fotograma y luego a mis padres, sin embargo, no puedo alcanzar mi objetivo. –

+0

¿Cómo se da cuenta de que su elemento está deshabilitado si permanece inhabilitado solo durante unos pocos milisegundos? En mi caso, el clic funciona 1-2 segundos después del primer intento de selenio. – testerjoe2

0

que experimentaron un problema similar a un par de Hace días y encontré la solución en mi caso particular. === Usando Selenium Webdriver, quería hacer clic en el enlace de "Primer enlace" y eso cargaría contenido en la página.

Por debajo de una porción de código con la estructura por igual mi caso:

<li class="first-link"> 
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a> 
</li> 

=== El resultado es que el WebElement se supone que debe ser encontrado y hecho clic, pero el cambio a la interfaz de usuario, no pasó nada, no hay error fue arrojado bien (elemento no encontrado, elemento no listo para hacer clic, elemento desactivado, etc.).

Después de intentar un par de formas diferentes para encontrar el enlace (xpath y css, no lo intenté por id porque en mi caso no hay una identificación única), pude acceder y hacer clic en el elemento con Selenium webdriver por css con el siguiente valor: li.first-link a. Sin embargo, cuando traté de acceder por xpath con el siguiente valor, esto fue 'encontrado' en Firefox pero no funcionó: .//li[a/text()='First Link'].

El problema era un problema leve de sintaxis xpath, que Firebug de Firefox no informaba en absoluto, de hecho, encontró el enlace.

He cambiado el orden de llaves de esta manera: .//li/a[text()='First Link'] Ahora funciona como se esperaba, First Link se encuentra y se hace clic y se activa el código de javascript que carga la página.

Mis resultados son: * No es un problema de temporización, por lo que esto no ocurre porque intenta hacer clic en un elemento que no está listo. De lo contrario, hemos resuelto esto con una espera de Selenio explícita ...

  • El problema no es que ese elemento se encuentre y el javascript no se active. Puede intentar ejecutar directamente el código de JavaScript y disparar manualmente los eventos y ver que esto no funciona.
  • Este problema ocurre en Firefox 22, probablemente funcione para versiones anteriores desde este navegador. No puedo proporcionar información si esto funciona en IE o Chrome. El problema en sí es que incluso si hay un conflicto de sintaxis en xpath, Firefox no arroja una excepción, eso te hace pensar que no hay nada de malo en tu código, pero sí lo hay.
  • Este es un comportamiento inesperado no controlado para Firefox. He encontrado un bug reportado para esto: http://code.google.com/p/selenium/issues/detail?id=4757

solución sugerida: verificar su estructura html, su XPath, tratar de encontrar problemas en la sintaxis, encontrar diferentes maneras de acceder al elemento.

0

Al mirar a su xpath no ha identificado el botón, en su lugar está señalando la etiqueta span dentro de qué botón está presente. El selenio hace clic en el lapso en lugar del botón. Es por eso que Click() no está funcionando. Utilice un id o nombre si está disponible o cambie el xpath para incluir también la etiqueta del botón. Si puede publicar el html, será fácil crear el xpath. click() ha funcionado perfectamente para mí y he estado utilizando este método durante más de un año en un proyecto y cada vez funciona bien ...

1

¿Se ha asegurado de que no haya problemas de temporización? Haga un punto de quiebre antes de encontrar el elemento y observe si su código funciona bien. Si hay un problema de tiempo, use una espera explícita antes de hacer clic en su botón. Tenga en cuenta también que se debe poder hacer clic en el botón (el elemento debe estar visible Y habilitado) antes de hacer clic en él.

con una solución explícita de espera podría tener este aspecto:

By by = By.xpath("//div[@class='btn magenta_s']/a/span"); 
WebDriverWait w = new WebDriverWait(driver, timeout); 
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by); 
element.click(); 
0

probar continuación Código veces has mover deliberadamente su enfoque hacia sus elementos

WebElement element = driver.findElement("yourElement"); 
     Actions builder = new Actions(driver); 
     builder.moveToElement(element).click(element); 
     builder.perform(); 
Cuestiones relacionadas