2009-08-11 5 views
12

Ich möchte eine automatisierte Web-Tests-Suite basierend auf Selenium RC, um Screenshots von Seiten zu machen, wenn einige Fehler auftreten. Die Testsuite ist Teil des kontinuierlichen Integrationsprozesses und wird technisch von CruiseControl ausgeführt, das als Windows-Dienst ausgeführt wird.Selen Run als Windows-Dienst, um Screenshots bei Fehlern zu machen

Die Methode selenium.captureScreenshot() wird aufgerufen, um den eigentlichen Screenshot auszulösen. Ich habe ein JUnit RunListener registriert, um es bei jedem Testfehler aufzurufen.

Das Problem ist, die Screenshots sind nur leere Dateien - PNG-Dateien völlig schwarz. Die Abmessungen sind 1440x900.

Wenn Sie manuell die gleichen Tests von Eclipse ausführen, sind die Screenshots OK (obwohl sie Screenshots des gesamten Desktops und nicht des Browserfensters sind, aber das ist eine andere Geschichte und ein kleines Problem). Die Ursache des Problems liegt vermutlich darin, dass das Selenium als Windows-Dienst ausgeführt wird.

Wie kann ich die Screenshots von Seiten erstellen, wenn Ausnahmen in Selenium-Tests vorkommen?

Die verwendete Software:

  • Windows 2003 Server
  • Selen 1.0.1

Antwort

5

Sieht aus wie es eine ganz andere Antwort gibt. Der Windows-Dienst (verwaltet von TanukiSoftware Java Service Wrapper) wurde gestartet, wobei wrapper.ntservice.interactive auf false festgelegt wurde. Die Einstellung auf true hat geholfen. Schließlich enthalten die Screenshots echten Bildschirminhalt.

Weitere Informationen erhalten Sie unter wrapper.ntservice.interactive.Die Analyse des Wrapper-Codes führt zu [SERVICE_INTERACTIVE_PROCESS] (http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx) Flag wird beim Starten des Windows-Dienstes gesetzt.

0

Hier ist ein Code für Bilder unter Verwendung von Selen und die Java-Robot-Klasse:

public void takeAScreenShotOfTheApp() { 
    Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); 
    Rectangle screenBounds = new Rectangle(0, 0, screenDim.width, screenDim.height); 

    Robot robot = new Robot(); 
    BufferedImage image = robot.createScreenCapture(screenBounds); 

    File screenshotFile = new File("target" + File.separator 
           + "image" + System.currentTimeMillis() + ".png"); 
    ImageIO.write(image, "png", screenshotFile); 
} 

Es stammt aus dieser site

+0

Danke. Ich werde es versuchen. Aber ich bezweifle, dass es helfen könnte. Ich habe diese Seite schon einmal gesehen. Und tatsächlich scheint die Selenium-Implementierung des Befehls 'captureScreenshot' genau die gleiche Technik zu verwenden: http://tinyurl.com/Selenium1260106 –

+0

@GrzegorzOledzki - Ich vermutete, dass Selen den gleichen Ansatz verfolgt. Bitte lassen Sie uns wissen, ob es funktioniert und viel Glück. – Steven

+0

Bestätigt. Das Verhalten ist genau das gleiche. Der Roboter erzeugte ein vollständig leeres (schwarzes) Bild mit genau der gleichen Größe. Also, kein Fortschritt ... –

2

Wenn Sie ein wenig mehr darüber lesen, könnte das etwas mit Ihrem Windows-Dienst zu tun haben, der zusätzliche Sicherheitsberechtigungen benötigt. Zurück zu Windows NT 3.5/4-Dienste hatte restricted access auf den Anwendungsdesktop (für Screenshots erforderlich) und ich würde vermuten, dass ihre Sicherheitsbeschränkungen bis heute fortfahren.

Dieser Thread über services on the java.net forums kann die Hinweise liefern, die Sie benötigen, um es zum Laufen zu bringen.

+0

Der java.net-Link scheint die Verwendung einer VNC-Verbindung zu localhost zu empfehlen. Ich sehe es als letzten Ausweg. Wenn ein Remote-Aufruf erforderlich ist, sollte uns nichts daran hindern, den Selenus-Server auf einem Linux-Rechner mit einer geeigneten Xserver-Unterstützung aufzurufen. Aber das macht die Build-Infrastruktur sehr kompliziert und ich hoffe, dass dies vermieden werden könnte. –

3

In welchem ​​Browser werden diese Tests ausgeführt? Wenn es sich um Firefox handelt, würde ich CaptureEntirePageScreenshot empfehlen, um die gesamte Zeichenfläche zu erfassen - nicht nur, was angezeigt wird (und nicht den Bildschirm) und captureEntirePageScreenshotToString, wenn Sie remote arbeiten und die Dateien lokal speichern möchten.

Nicht sicher, ob es mit Ihrem Problem helfen wird, aber da es ein Add-on zu Firefox verwendet, könnte es einen Versuch wert sein.

+0

Firefox wird verwendet. Nicht wirklich sicher, welche Version, ich würde es überprüfen müssen. Wie auch immer, danke für den Tipp - ich werde es überprüfen. –

+0

Hm ... Ich wollte gerade schreiben, dass der Vorschlag funktioniert. Weil es ein- oder zweimal richtige Screenshots gegeben hat. Aber etwas ist wieder kaputt gegangen und jetzt bekomme ich wieder leere Dateien. Jetzt unterscheiden sich die Dimensionen - manchmal ist es 978x36 und manchmal ist es 978x232 (abhängig von dem tatsächlich aufgerufenen Test), aber immer noch 100% schwarz PNG. Aaah. Ich dachte, es ist gelöst. –

+0

Ich habe ein oder zwei PNGs gesehen, aber die meiste Zeit funktioniert es gut für mich. Ich laufe aber nicht als Dienst ... Hoffe, du findest etwas, das funktioniert. –

1

Ich bin über das Problem mit CaptureScreenshot gekommen, das schwarze Bilder erzeugt, wenn es unter einem Windows-Service läuft.

Die Verwendung von CaptureEntirePageScreenshot, wie von Dave Hunt empfohlen, arbeitet konsequent für mich.

+0

Leider. Ich habe nicht-schwarze Screenshots von captureEntirePageScreenshot() nur einmal gesehen. Gleich nach dem Umschalten (anstelle von captureScreenshot()). Aber seitdem funktioniert es nicht. –

0

Ich weiß nicht, wie Tempomat GUI-Tests ausführen wird, aber ich vor kurzem einen Screenshot-Mechanismus implementiert und was ich gelernt, dass die Komponenten, die Sie zeichnen in einem Fenster sein müssen oder ein anderes Root-Element. "Unrooted" -Elemente werden einfach nicht richtig malen und führen in den meisten Fällen schwarze Bilder.

Also, wenn Tempomat oder Ihre Komponententests verwenden etwas Magie, um die GUI-Elemente nicht richtig anzuzeigen, Sie möchten sie möglicherweise vor dem Malen zu einem Dummy-JFrame hinzufügen

-1

Eine alternative Lösung zu Ihrem RunListener-Ansatz:

Schließen Sie Ihren Test in einem try-catch-Block ein und machen Sie den Screenshot im catch-Block, das mache ich immer.

Beispiel Java-Code:

public void testEnterFormFields() 
    try { 
    enterFormFields(); 
    } catch(SeleniumException e) { 
    //do screenshot, logging, dumping, stacktracing or whatever here 
    } 
} 

Sie könnten auch fangen Throwable oder Ausnahme, wenn Ihr Codierungsregeln es erlauben, aber es macht Sinn die spezifische Ausnahme einer nach dem anderen zu fangen. Dieser Ansatz erzeugt ein wenig mehr Unordnung in Ihrem Code, aber es wird Ihnen im Falle einer Fehleranalyse viel helfen. Sie können Ihre Ausnahmebehandlung an den Fehlertyp anpassen. Vielleicht möchten Sie im Falle eines AssertionErrors andere Informationen erfassen als im Falle einer SeleniumException.

+0

Wie beantwortet es das Problem von leeren Screenshots? –

+0

Auf diese Weise machen Sie Screenshots, bevor Sie die Testmethode beenden -> bevor Fehler gemeldet werden und Teardown-Methoden aufgerufen werden, die die Browser-Instanz zerstören. –