Stefani Gerber Senior Software Engineer

Selenium WebDriver

Dec 23, 2015 12:54:28 PM

Einführung

Selenium WebDriver ist der Nachfolger von Selenium RC (siehe auch Blogbeitrag zu Selenium RC) und entstand aus dem Zusammenschluss vom Selenium-Projekt mit WebDriver. Es wurde im Juli 2011 released. Wie sein Vorgänger wird Selenium WebDriver verwendet, um automatisierte Tests zu programmieren.

Wie funktioniert Selenium WebDriver?

Im Gegensatz zu Selenium RC verwendet es kein JavaScript mehr um den Browser zu steuern sondern tut dies direkt über das Automation API des jeweiligen Browsers. Somit ist das Verhalten näher an dem eines echten Benutzers. Der Selenium Server wird durch die Verwendung des Automation API überflüssig. Der Browser wird über einen jeweiligen Driver angesprochen, z.B. ChromeDriver oder PhantomJSDriver.

Beispiel eines Testskripts

Um beim selben Beispiel zu bleiben wie bei den beiden vorderen Blogeinträgen nachfolgend der Code, der beim Exportieren aus Selenium IDE entsteht (nicht verwendete Methoden wurden bereits entfernt).

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SampleTestCase {
  private WebDriver driver;
  private String baseUrl;
  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "https://www.google.ch/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

  @Test
  public void testSampleTestCase() throws Exception {
    driver.get(baseUrl + "/?gws_rd=ssl");
    driver.findElement(By.id("lst-ib")).clear();
    driver.findElement(By.id("lst-ib")).sendKeys("Bluesky");
    driver.findElement(By.name("btnG")).click();
    driver.findElement(By.linkText("Bluesky IT-Solutions AG")).click();
    try {
      assertEquals("DIGITAL PRESENCE", driver.findElement(By.xpath("//div[@id='menu']/ul/li[2]/a/div/div")).getText());
    } catch (Error e) {
      verificationErrors.append(e.toString());
    }
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }
}

Die Abfolge der Befehle unterscheidet sich nicht gross von Selenium RC. Sie werden auf einer WebDriver-Instanz (Interface zu Browser) ausgeführt anstatt auf einer Selenium-Instanz (Interface zu Selenium-Server). Was jedoch entfällt sind die expliziten waits; Methoden wie z.B. findElement überprüfen stattdessen die Seite wiederholend auf ein Element bis sie dieses entweder finden, oder ein Timeout erreicht wird. Das erleichtert z.B. das Testen von Webseiten mit Ajax-Calls, wo nur Seitenteile nachgeladen werden. Das implizite Timeout kann auf der WebDriver-Instanz gesetzt werden und wenn nötig auch für gewisse Testabschnitte hoch- oder runtergesetzt werden.

Gleich wie bei Selenium RC ist es auch hier wichtig, robuste Selektoren zu wählen.

Ausblick

Geplant ist, mit Selenium 3 vermehrt mobile Browser und Web-Applikationen abzudecken. Die Roadmap hierzu wurde allerdings seit August 2013 nicht mehr aktualisiert, es bleibt also spannend :)