2010-01-18 6 views
11

Wie kann ich ein selen klicken() funktioniert genauso wie ein manueller Mausklick?Selen-Test von GWT 2.0

Ich habe kürzlich GWT von 1.7.1 auf 2.0 aktualisiert. Einige Selentests (SeleniumRC v1.0.1, IE7) scheitern jetzt. Es scheint, dass die Selenium.click() Methode kein GWT TreeItem auswählt. Ein manueller Klick wird dazu führen, dass das TreeItem blau wird (dh ausgewählt aussieht und das Klassenattribut "gwt-TreeItem-selected" im DOM hat), der Selentest jedoch nicht.

Ich bin überzeugt, dass Selen tatsächlich das richtige Element findet, nur nicht darauf klicken. Wenn Sie den String-Parameter in der Click-Methode ändern, können Sie überprüfen, ob Selen eine Ausnahme auslöst, wenn das Element nicht gefunden wird.

Der folgende Beispielcode verwendet die GWT Showcase-Website. Es versucht, auf das Wort "Beethoven" zu klicken. Wenn Sie mit der Maus auf dieses Wort klicken, wird das TreeItem blau angezeigt. Wenn Sie jedoch den Selentest durchführen, wird dies nicht der Fall sein.

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"); 
    } 
} 

Ich habe einige andere Methoden ausprobiert (Selenium.clickAt(), Selenium.fireEvent(), Selenium.mouseOver()/Down()/Up()) - aber nicht das manuelle Verhalten reproduzieren.

+0

Die Selen-Funktion, die die Click-Ereignisse tatsächlich feuert ist triggerMouseEvent in Selen-Kern/src/main/resources/core/scripts/Selen-browserbot.js. Der Großteil des Codes erstellt ein Ereignisobjekt und ruft dann element.dispatchEvent (event) auf. – John

Antwort

6

Leider habe ich mir diesen Fall nicht angesehen, ich konnte Click mit Selenium nicht replizieren. Ich habe eine Reihe von Leuten gesehen, die sich darüber beschweren, dass sie Selenium nicht mit GWT verwenden können und eines der bekannteren Teams hat dieses Problem. Das Google Wave-Entwicklungsteam hat mit WebDriver begonnen, seinen Code zu testen.

Jetzt ist das gute Ding, dass es zurzeit ein Projekt gibt, Selenium und WebDriver zu verschmelzen, wie sie ihre Stärken und Schwächen haben, und eine Anzahl von ihnen sind in verschiedenen Bereichen, so dass das Endprodukt erstaunlich sein wird.

Ich glaube, dass sie möglicherweise eine funktionierende Version des WebDriverBackedSelenium bei Google Code haben, so alles, was Sie tun müssten, ist die Instanziierung von Selenium zu aktualisieren und es sollte den WebDriver-Code verwenden, um Ihren Test auszuführen.

+0

Danke für diesen Vorschlag. Ich habe versucht, das WebDriverBackedSelenium zu verwenden, aber das selbe Ergebnis - Selenium hat GWT TreeItems, die ich versuchte zu klicken, mit seiner click() - Methode nicht richtig ausgewählt. – Glennn

+0

hmm, das scheint seltsam zu sein, weil es tun sollte, webdriver commands aber du schreibst einfach Selencode oder das ist, wie ich es interpretiert habe – AutomatedTester

+1

Nach deinem Kommentar habe ich überprüft und es stellt sich heraus, dass ich WebDriverBackedSelenium nicht verwendet habe. Ich benutzte Selen-2.0a.1 Jar, aber ich hatte nicht erkannt, dass ich den neuen WebDriverBackedSelenium() -Konstruktor anstelle des neuen DefaultSelenium() verwenden musste. Mit neuen Konstruktorparametern und dem Aufruf von .start() (der einen Fehler auslöst) funktionierte es. Tausend Dank. – Glennn

2

Es scheint, dass WebDriver es so machen kann.

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(); 
} 
} 

Ich würde immer noch gerne mit Selen machen können. Es kann sein, dass eine zukünftige Selenium-Veröffentlichung WebDriver vollständiger integriert, und alles wird wieder wunderbar sein. Aber ich denke, das funktioniert jetzt.

1

Ich wollte den Code, der schließlich für mich funktionierte, folgen nützliche Kommentare von 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"); 
    } 
}