2009-03-11 13 views
26

Aquí es lo que hago:El evento Selenium click() parece no estar siempre activado => resultados en timeout?

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

El enlace "mivinculo" existe, la primera invocación de clic() siempre funciona. Pero el segundo clic() a veces parece funcionar, a veces no.

Parece que el evento click() no se activa en absoluto, porque la página ni siquiera comienza a cargarse. Lamentablemente, este comportamiento no es esencial.

Esto es lo que yo ya probé:

  1. Conjunto de tiempo más largo tiempo de espera
    => no ayudó

  2. Espere a que un elemento presente después de cargar una página
    => no funciona ya sea porque la página ni siquiera comienza a cargar

Por ahora terminó invocando clic() dos veces, así:

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 

selenium.click("link=mylink"); 
selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

que funcionará, pero no es una solución muy agradable. También he visto en otro foro en el que alguien le sugirió escribir algo así como un 'clickAndWaitWithRetry':

try { 
     super.click("link=mylink"); 
     super.waitForPageToLoad(60000); 
    } 
    catch (SeleniumException e) { 
     super.click("link=mylink"); 
     super.waitForPageToLoad(60000); 
    } 

Pero creo que tampoco es una solución adecuada .... Cualquier idea/explicaciones de por qué el clic () evento a veces no se desencadena?

+0

Normalmente uso 'velocidad de respuesta' en lugar de tiempo de espera cuando quiero ralentizar el script por alguna razón. –

Respuesta

1

La página no se ha cargado correctamente al hacer clic en ella. Verifique que haya diferentes elementos en la página para asegurarse de que la página se haya cargado.

Además, espere a que el enlace aparezca y esté visible antes de hacer clic en él.

1

Asegúrese de que está aumentando el tiempo de espera en el lugar correcto. Las líneas que ha publicado son:

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

Esta espera es para que la página se cargue y regrese Después de hacer clic. Pero el problema que describes es que está fallando cuando intentas hacer clic. Por lo tanto, asegúrese de aumentar la espera antes de este.

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 
// after the last click in these steps: 
selenium.waitForPageToLoad(60000); 
// anything else that happened after that 

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 
4

que he hecho selenio por un tiempo, y realmente me he desarrollado una aversión para waitForPageToLoad(). Puede considerar siempre esperar que el elemento en cuestión exista.

Me parece que este método parece resolver la mayoría de los problemas extraños que encuentro de esta manera. La otra posibilidad es que pueda tener algún javascript que impida que el enlace haga algo cuando se haga clic la primera vez. Parece poco probable, pero vale la pena una doble verificación.

+0

Oye, incluso estoy enfrentando un problema con los hipervínculos de JavaScript. Tengo un botón con href = "javascript :;". Cuando hago clic en él usando selenium-rc, la barra de estado del navegador muestra "javascript :;", pero no se realiza ninguna acción. ¿Alguna solución para esto? - Vamyip – vamyip

+0

Lo primero que trato de hacer es usar mouseDown y mouseUp en lugar de hacer clic. Eso suele ser el truco, incluso si es un poco tonto. –

10

A veces, aparentemente al azar, a Selenium simplemente no le gusta hacer clic en ciertas etiquetas de anclaje. No estoy seguro de qué lo causa, pero sucede.Voy a encontrar en esos casos w/un vínculo problemático en lugar de hacer

selenium.click(...) 

hacer

selenium.fireEvent(locator, 'click'); 

Como otros han dicho sobre mí, he tenido específicamente problemas con las etiquetas de anclaje que aparecen de la siguiente manera:

<a href="javascript:...." > 
+0

Hola, no pude hacerlo funcionar, todavía dice que funcionó, pero no hace nada. El comando de clic funciona pero sigue esperando que la página se cargue (cuando no debería). ¿Cualquier sugerencia? –

+0

Tengo el mismo problema que Diego ... ¿Alguna sugerencia? – Ekaterina

+2

Los controles de ASP.NET LinkButton se convertirán automáticamente en un delimitador con "javascript: __ doPostback (*" (cuando se procesa en HTML) ... es bastante fácil convertir un Botón de enlace en un Botón. Sin embargo, si tiene una etiqueta de anclaje HTML codificada llamando a JavaScript, puede que no tenga suerte con esta herramienta. Creo que el clic nunca ocurre porque Selenium usa JavaScript detrás de escena, y puede estar anulando el trabajo del ancla: llame al JavaScript. – MacGyver

3

Acabo de probar WebDriver (Selenium 2.0) y encontré que WebElement # sendKeys (Keys.ENTER) funciona.

0

Prueba esto:

selenium.fireEvent(ID, "keypress"); 
0
selenium.click("link=Continue to this website (not recommended)."); 
Thread.sleep(5000); 
2

Aquí esta uno va a trabajar:

selenium.waitForPageToLoad("60000"); 

selenium.click("link= my link"); 
0

He tenido el mismo problema y ha encontrado que tengo para obtener el texto del enlace primero. Sé que no es la forma ideal de hacerlo, pero tengo la suerte de que mis enlaces tengan un nombre único.

código C#:

var text = Selenium.GetText(myLocator); 
Selenium.Click("link=" + text); 
0

estoy teniendo el mismo problema :(con el IDE 1.0.10 selenio, PHPUnit 3.5, servidor de selenio RC 1.0.3

EDITED: 
The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14 
    all my errors are gone . My tests are working like charm :). 

Selenium IDE 1.0.10 
PHPUnit: 3.5.6 
Selenium Server:selenium-2.0b1 (selenium-2.0b2 is buggy) 
2

estoy corriendo en este problema ahora también. De mi uso de esto, parece que el siguiente es el más consistente:

@browser.click(selector, {:wait_for => :page}) 

No estoy seguro por qué eso sería. Pero parece que si lo hace:

@browser.click(selector) 
    [maybe some stuff here too] 
@browser.wait_for(:wait_for => :page) 

entonces usted podría terminar esperando para una página que ya ha sido cargado (es decir, se termina la espera para siempre).

cavé en el código fuente de selenio y encontramos este pepita:

def click(locator, options={}) 
    remote_control_command "click", [locator,] 
    wait_for options 
    end 

...

# Waits for a new page to load. 
    # 
    # Selenium constantly keeps track of new pages loading, and sets a 
    # "newPageLoaded" flag when it first notices a page load. Running 
    # any other Selenium command after turns the flag to false. Hence, 
    # if you want to wait for a page to load, you must wait immediately 
    # after a Selenium command that caused a page-load. 
    # 
    # * 'timeout_in_seconds' is a timeout in seconds, after which this 
    # command will return with an error 
    def wait_for_page(timeout_in_seconds=nil) 
    remote_control_command "waitForPageToLoad", 
     [actual_timeout_in_milliseconds(timeout_in_seconds),] 
    end 
    alias_method :wait_for_page_to_load, :wait_for_page 

Básicamente, se está haciendo lo siguiente:

@browser.click(selector) 
@browser.wait_for(:wait_for => :page) 

Sin embargo, como dice el comentario, lo primero que se necesita es usar el comando: wait_for inmediatamente después.

Y por supuesto ... cambiar el orden te pone en la misma espera para siempre.

@browser.wait_for(:wait_for => :page) 
@browser.click(selector) 

sin conocer todos los detalles de selenio, parece que el selenio tiene que registrar el: wait_for desencadenar cuando se pasa como una opción con clic. De lo contrario, podrías terminar esperando por siempre si de alguna manera le dices a Selenium que espere el instante antes: se llama a wait_for.

1

Si está utilizando FireFox, asegúrese de estar utilizando 3.6 o posterior. WaitForPageToLoad usa la variable javascript 'readyState', pero Firefox solo lo admite en 3.6. Las versiones anteriores simplemente no esperan

(ver org.openqa.selenium.internal.seleniumemulation.WaitForPageToLoad)

3

selenio clic (evento) no parece estar siempre activadas => resultados en tiempo de espera?

Pruebe selenium.pause antes del comando Selenium.click. He intentado todo lo anterior pero ninguno de ellos parece resolver nuestro problema. Así que finalmente tenemos un selenium.pause mágica que soluciona un problema para mí ..

Hope esto va a resolver su problema, así

2

que tenía el mismo problema - con selenio 1.0.12 y Firefox 5.0; Me las arreglé para hacer las pruebas automáticas funcionan de esta manera:

  • que eliminan todos los "AndWait" comandos (en algún momento se cuelgan la prueba/navegador)
  • He añadido una pausa antes de que el clic
  • he añadido un waitForVisible después del clic (generalmente espero el siguiente control html con el que quiero interactuar en la página siguiente).

Dice así:

  • waitForVisible OK
  • pausa 1000
  • haga clic en Aceptar
  • enlace waitForVisible = Ir
  • pausa 1000
  • haga clic en Ir

etc ...

Parece que el "waitForVisible" se activa demasiado pronto, es decir, antes de que el controlador de eventos se conecte al control (haciendo clic en el control no tiene ningún efecto). Si espera durante 1 segundo, basta con conectar/activar los manejadores de clics ...

Cuestiones relacionadas