2010-01-18 16 views
11

¿Cómo puedo hacer que un clic con selenio() funcione igual que con un clic del mouse?Prueba de selenio de GWT 2.0

Recientemente actualicé GWT de 1.7.1 a 2.0. Algunas pruebas de selenio (SeleniumRC v1.0.1, IE7) ahora están fallando. Parece que el método Selenium.click() no está seleccionando un GWT TreeItem. Un clic manual hará que TreeItem se vuelva azul (es decir, se vea seleccionado y tenga el atributo de clase "gwt-TreeItem-selected" en el DOM), pero la prueba de selenio no.

Estoy convencido de que el selenio está realmente encontrando el elemento correcto, simplemente no haciendo clic en él. Si cambia el parámetro de cadena en el método de clic, puede verificar que el selenio arroje una excepción cuando no se encuentra el elemento.

El código de ejemplo siguiente utiliza el sitio web de GWT Showcase. Intenta hacer clic en la palabra "Beethoven". Si hace clic en esa palabra con el mouse, verá que TreeItem se vuelve azul. Sin embargo, cuando ejecuta la prueba de selenio, no lo hará.

package test; 

import org.junit.Before; 
import org.junit.Test; 

import com.thoughtworks.selenium.DefaultSelenium; 
import com.thoughtworks.selenium.Selenium; 

public class TestTreeClick { 
    static Selenium selenium = null; 

    @Before 
    public void setUp() throws Exception { 
     if (selenium == null) { 
      selenium = new DefaultSelenium("localhost", 4444, "*iexplore", 
        "http://gwt.google.com/samples/Showcase/Showcase.html#CwTree"); 
      selenium.start(); 
     } 
    } 

    @Test 
    public void testingClicking() { 
     selenium.open("http://gwt.google.com/samples/Showcase/Showcase.html#CwTree"); 
     selenium.click("gwt-debug-cwTree-staticTree-root-child0-content"); 
    } 
} 

que han intentado otros métodos (Selenium.clickAt(), Selenium.fireEvent(), Selenium.mouseOver()/Abajo()/Arriba()) - pero ninguno reproducir el comportamiento manual.

+0

La función de selenio que realmente dispara los eventos de clic es triggerMouseEvent en src/main/resources/core/scripts/selenio-browserbot.js selenio-core /. La mayor parte del código crea un objeto de evento y luego llama a element.dispatchEvent (event). – John

Respuesta

6

Desafortunadamente, echando un vistazo a este caso no he podido replicar haciendo clic con Selenium. He visto a varias personas quejándose de que no pueden usar Selenium con GWT y uno de los equipos más famosos tiene ese problema. El equipo de desarrollo de Google Wave ha comenzado a utilizar WebDriver para probar su código.

Ahora lo bueno es que actualmente hay un proyecto para fusionar Selenium y WebDriver, ya que tienen sus fortalezas y debilidades, y varias de ellas están en diferentes áreas, por lo que el producto final será increíble.

Creo que pueden tener una versión funcional de WebDriverBackedSelenium en Google Code por lo que todo lo que tendría que hacer es actualizar la instanciación de Selenium y debería comenzar a usar el código WebDriver para ejecutar su prueba.

+0

Gracias por esa sugerencia. Intenté usar WebDriverBackedSelenium pero obtuve el mismo resultado: Selenium no "seleccionaba" adecuadamente los TreeItems de GWT con los que intenté hacer clic con el método click(). – Glennn

+0

hmm que parece extraño porque se supone que debe hacer comandos de webdriver pero solo escribe código de selenio o eso es como lo he interpretado – AutomatedTester

+1

Después de tu comentario, volví a verificar y resultó que no estaba usando WebDriverBackedSelenium. Estaba usando el selenio-2.0a.1 jar, pero no me había dado cuenta de que tenía que usar el nuevo constructor WebDriverBackedSelenium() en lugar del nuevo DefaultSelenium(). Con nuevos parámetros de constructor y sin llamar a .start() (que arroja un error) funcionó. Montones de gracias. – Glennn

2

Parece que WebDriver puede hacerlo así.

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.ie.InternetExplorerDriver; 

public class Example { 
public static void main(String[] args) throws InterruptedException { 
    WebDriver driver = new InternetExplorerDriver(); 
    driver.get("http://gwt.google.com/samples/Showcase/Showcase.html#CwTree"); 
    WebElement element = driver.findElement(By.id("gwt-debug-cwTree-staticTree-root-child0-content")); 
    element.click(); 
} 
} 

Todavía me gustaría poder hacerlo con Selenium. Puede ser que una futura versión de Selenium incorpore WebDriver más plenamente, y todo volverá a ser maravilloso. Pero supongo que esto funciona por ahora.

1

Quería publicar el código que finalmente funcionó para mí después de comentarios útiles de AutomatedTester.

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebDriverBackedSelenium; 
import org.openqa.selenium.ie.InternetExplorerDriver; 

import com.thoughtworks.selenium.Selenium; 

public class TestTreeClick { 

    public static void main(String[] args) { 
     WebDriver driver = new InternetExplorerDriver(); 
     Selenium selenium = new WebDriverBackedSelenium(driver, "http://gwt.google.com/samples/Showcase/Showcase.html#CwTree"); 
     selenium.open("http://gwt.google.com/samples/Showcase/Showcase.html#CwTree"); 
     selenium.click("gwt-debug-cwTree-staticTree-root-child0-content"); 
    } 
} 
Cuestiones relacionadas