2010-02-01 16 views
5

He estado experimentando errores intermitentes con algunas pruebas java selenium-rc que creo que están relacionadas con una página que tiene una encuesta ajax y se actualiza automáticamente cuando se llega a alguna condición en el servidor. En este escenario, no tengo manera de pedirle al selenio que espere a que la página se cargue, y entonces me encuentro con un montón de errores aleatorios "No se pudo acceder a document.body".Manejo de páginas refrescantes de selenio

Entonces, ¿hay alguna forma en que pueda causar que el selenio maneje con gracia esta situación? Si no, ¿hay alguna manera de que pueda detectar si el usuario es selenio del javascript de la página y desactivar la actualización automática?

Si ayuda en absoluto, el código JavaScript de la página se ve algo como ...

var ajax = new Ajax(url, { 
    update: state, 
    method: 'get', 
    onComplete: function(message) { 
     if (some_condition) { 
      window.location.replace(unescape(window.location)); 
     } 
    } 
}); 
+0

@ Matt lo que cambia cuando vuelve a cargar la página – AutomatedTester

+0

Algunos enlaces que eran personas con discapacidad a ser re-habilitado - Nada relevante para la prueba. Lo ideal sería actualizar la página al nuevo estado con el Ajax o algo así, pero el esfuerzo necesario para hacerlo era extensa en comparación a esta página mecanismo de refrigeración. –

+0

Parece que podría ser capaz de detectar que se ejecutan bajo el selenio con algo como http://nerd.metrocat.org/2009/10/detecting-selenium o http://thoughtstoblog.blogspot.com/2009/09/selenium-alert -y-confirmar-en-páginas.html. Voy a dar un mañana que ir ... –

Respuesta

1

Mi solución fue la de desactivar la actualización en javascript envolviéndolo en algo como lo siguiente ...

var isSeleniumActive = parent.seleniumAlert; 
if (isSeleniumActive) { 
    alert("Selenium"); 
} else { 
    alert("Not selenium"); 
} 

no estoy seguro de si la función seleniumAlert aquí es probable que enferma ahí desde siempre, que así sea consciente si está tomando esto, puede estar confiando en los detalles de implementación interna de selenio de selenio.

+0

Parece una buena solución. Me gustaría tener que cambiar tu aplicación para que se adapte a tus pruebas, pero parece que no tienes otra opción. –

-1

creo que se puede hacer una pausa, o utilizar un clic y esperar. Hay a fewgood articles en el google. Buena suerte.

Editar por tu comentario:

¿Y el waitFor command?

+0

El problema es que la actualización se desencadena por la página subyacente, no el selenio, así que no hay tiempo de punto en el que el selenio puede saber que tiene que llamar pausa o clickAndWait. –

1

Una solución podría ser utilizar siempre waitForCondition usando isElementPresent antes de intentar interactuar con la aplicación bajo prueba. Podría poner el siguiente método en una superclase para mantener sus pruebas más legibles. De forma alternativa, podría crear métodos auxiliares para comandos comunes de Selenium que realicen esta espera.

/** Waits for an element to be present */ 
public static void waitForElementToBePresent(String locator) { 
    session().waitForCondition("var value = selenium.isElementPresent('" + locator.replace("'", "\\'") + "'); value == true", "60000"); 
} 

También puede querer esperar a que el elemento sea visible, como esperando a que se acaba de estar presente no siempre es suficiente (imaginar un cuadro de texto que está siempre presente pero oculto hasta una cierta condición). Esto se puede combinar con el método anterior:

/** Waits for an element to be visible */ 
public static void waitForElementToBeVisible(String locator) { 
    waitForElementToBePresent(locator); 
    session().waitForCondition("var value = selenium.isVisible('" + locator.replace("'", "\\'") + "'); value == true", TIMEOUT); 
} 

Por cierto, el (Selenio 2) WebDriver equipo están trabajando en tener esperas implícitas, específicamente para abordar cuestiones AJAX donde los elementos no están presentes de inmediato.

+0

No se pudo producirse todavía la actualización de la página después de la waitForCondition completa (con éxito), pero antes de que el siguiente paso de prueba comienza, haciendo que el siguiente paso falle? Esta solución podría ayudar si la página se encontraban en medio de una actualización cuando el waitForCondition comienza sin embargo - Gracias. –

+0

Lamentablemente, todavía es una posibilidad, sí. También puede existir la posibilidad de que la página se encuentre en un estado en el que los comandos devuelven un error ya que la página aún no ha cargado nada. En este caso, tuve que esperar a que el nombre de la ventana existiera en un proyecto anterior. –

+0

Supongo que tendré que tratar de intentar desactivar la actualización cuando se ejecute bajo Selenium de alguna manera. Gracias. –

0

Allí estaba enfrentando el mismo problema y uso una sola línea de código y me ayuda.

que estaba consiguiendo el error acerca de la página está recibiendo actualización automática además esta advertencia:

-1,490,472,087,141 marionetas WARN Usando la estructura de datos obsoleta para los tiempos de espera de ajuste

todo lo que uso es

Thread.sleep(2000) 

y funcionó para mí.

Cuestiones relacionadas