Blog

Screenshots von Selenium mit JUnit @Rule's erstellen

Albert Sikkema

Aktualisiert Oktober 23, 2025
2 Minuten

Wenn Sie Selenium-Tests von JUnit aus ausführen, ist es sehr nützlich, wenn Sie Screenshots aufnehmen können, wenn etwas fehlschlägt. Vor allem, wenn Sie den Test in einer Continuous Integration-Umgebung ausführen, die Sie nicht überwachen. Ein Screenshot in Kombination mit dem Stacktrace macht es einfacher, den Fehler zu identifizieren und zu beheben. Wenn Sie dies mit einer JUnit @Rule kombinieren, können Sie es transparent machen und für jeden Testfall verwenden Implementieren der @Rule Um Regeln zu implementieren, müssen Sie die Schnittstelle MethodRule implementieren und die Methode apply implementieren. Die Methode base.evaluate ruft den Unittest auf. Der Screenshot wird im Falle einer Ausnahme erstellt, die als RuntimeException zurückgeworfen wird, so dass Ihr Testfall fehlschlägt. Diese Klasse erweitert die SeleneseTestBase, die Sie beim Schreiben von Selenium-Unittests unterstützt. Das Erfassen von Screenshots ist eine Funktion von Selenium und sehr einfach. Vielleicht möchten Sie die Datei anders speichern, aber das sollte kein Problem sein.

[code lang="java"]
public class CapturingSelenium extends SeleneseTestBase implements MethodRule {
@Override
public Statement apply(final Statement base, FrameworkMethod method, Object target) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
setUp("xebia.com / blog : 8080/", "*firefox");
base.evaluate();
}
catch (Exception e) {
selenium.captureEntirePageScreenshot("/tmp/selenium-error-" + new UUID().toString() + ".PNG", "");
throw new RuntimeException(e);
}
}
};
}
[/code]

Das war's. Jetzt können Sie einfach die Klasse CapturingSelenium verwenden und sie mit @Rule annotieren. Wenn ein Test mit einer Ausnahme fehlschlägt, fängt die Regel diese ab und erstellt einen Screenshot des Browsers zum Zeitpunkt der Ausnahme. Hier ist ein einfaches Beispiel: Verwendung:

[code lang="java"]
public class SeleniumTest {
@Rule
private CapturingSelenium selenium = new CapturingSelenium();
@Test(expected=RuntimeException.class)
public void shouldCaptureScreenshotWhenFailing() throws Exception {
selenium.open("https://xebia.com/blog/myapp/home");
selenium.click("some-button-which-is-not-there");
//...
}
}
[/code]

Verfasst von

Albert Sikkema

Contact

Let’s discuss how we can support your journey.