So verwenden Sie Selenium WebDriver für API-Tests

Dieses Tutorial zeigt API-Tests mit Selenium WebDriver. Praktische Beispiele & Best Practices inklusive.

Leo Schulz

Leo Schulz

9 September 2025

So verwenden Sie Selenium WebDriver für API-Tests

Apidog für Unternehmen

On-Premises Bereitstellung

SSO & RBAC

SOC 2 konform

Apidog Enterprise entdecken
💡
Bevor Sie in das Selenium-Tutorial eintauchen, werfen Sie einen Blick auf Apidog – ein kostenloses Tool zur Vereinfachung von API-Tests und -Integration. Mit der intuitiven Benutzeroberfläche von Apidog können Sie Ihre API-Workflows einfach debuggen und optimieren, den Entwicklungsprozess rationalisieren und wertvolle Zeit sparen. Egal, ob Sie APIs erstellen oder Probleme beheben, Apidog bietet alles, was Sie zur Verbesserung Ihres Workflows benötigen.
button

Wenn wir an Selenium WebDriver denken, assoziieren wir es typischerweise mit Browserautomatisierung und UI-Tests. Selenium kann jedoch auch ein leistungsstarkes Werkzeug für API-Tests sein, wenn es richtig eingesetzt wird. Dieses Tutorial führt Sie durch den Prozess der Nutzung der Fähigkeiten von Selenium WebDriver zur Durchführung von API-Tests und bietet Ihnen praktische Beispiele und Best Practices.

API-Tests (Application Programming Interface) umfassen das direkte Testen der APIs der Anwendung und die Überprüfung ihrer Funktionalität, Zuverlässigkeit, Leistung und Sicherheit. Während es spezielle Tools für API-Tests wie Postman, REST Assured oder SoapUI gibt, kann Selenium WebDriver eine wertvolle Ergänzung zu Ihrem API-Test-Toolkit sein, insbesondere wenn Sie UI- und API-Tests im selben Framework kombinieren möchten.

Voraussetzungen

Bevor Sie mit API-Tests mit Selenium WebDriver beginnen, stellen Sie sicher, dass Sie Folgendes haben:

  1. Grundkenntnisse in Selenium WebDriver
  2. Eine Programmiersprache Ihrer Wahl (Java, Python, C#, JavaScript)
  3. Selenium WebDriver in Ihrer Entwicklungsumgebung eingerichtet
  4. Verständnis von REST/SOAP APIs
  5. Grundkenntnisse der HTTP-Methoden (GET, POST, PUT, DELETE)

Verständnis der Architektur

Die Architektur von Selenium WebDriver macht es für API-Tests geeignet, da es Folgendes kann:

  1. Senden von HTTP-Anfragen direkt über integrierte oder externe Bibliotheken
  2. Behandeln von Antworten und Überprüfen von Daten
  3. Integration in bestehende Test-Frameworks
  4. Verwalten von Testdaten und -umgebungen

Einrichten Ihrer Umgebung

Lassen Sie uns eine grundlegende Umgebung für API-Tests mit Selenium WebDriver einrichten:

Java-Beispiel

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class SeleniumApiTesting {
    private WebDriver driver;

    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless"); // Headless mode for API testing
        driver = new ChromeDriver(options);
    }

    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

Python-Beispiel

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import json

def setup_driver():
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # Headless mode for API testing
    driver = webdriver.Chrome(options=chrome_options)
    return driver

def teardown_driver(driver):
    if driver is not None:
        driver.quit()

API-Testansätze mit Selenium WebDriver

1. Verwendung nativer HTTP-Bibliotheken

Der einfachste Ansatz ist die Verwendung der nativen HTTP-Bibliotheken Ihrer Programmiersprache zusammen mit Selenium WebDriver.

Java-Beispiel - GET-Anfrage

public String performGetRequest(String endpoint) throws IOException {
    URL url = new URL(endpoint);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");

    int responseCode = connection.getResponseCode();
    System.out.println("GET Response Code: " + responseCode);

    if (responseCode == HttpURLConnection.HTTP_OK) {
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        return response.toString();
    } else {
        return "GET request failed with response code: " + responseCode;
    }
}

Python-Beispiel - POST-Anfrage

def perform_post_request(endpoint, payload):
    headers = {'Content-Type': 'application/json'}
    response = requests.post(endpoint, data=json.dumps(payload), headers=headers)

    print(f"POST Response Code: {response.status_code}")

    if response.status_code == 200:
        return response.json()
    else:
        return f"POST request failed with response code: {response.status_code}"

2. Verwendung von JavaScriptExecutor für AJAX-Aufrufe

Ein weiterer Ansatz ist die Verwendung von Seleniums JavaScriptExecutor, um AJAX-Aufrufe direkt vom Browser aus zu tätigen.

Java-Beispiel

import org.openqa.selenium.JavascriptExecutor;

public String performApiCallWithJsExecutor(String endpoint, String method, String payload) {
    String script = String.format(
        "var xhr = new XMLHttpRequest();" +
        "xhr.open('%s', '%s', false);" +
        "xhr.setRequestHeader('Content-Type', 'application/json');" +
        "xhr.send('%s');" +
        "return xhr.responseText;",
        method, endpoint, payload
    );

    return (String) ((JavascriptExecutor) driver).executeScript(script);
}

Python-Beispiel

def perform_api_call_with_js_executor(driver, endpoint, method, payload):
    script = f"""
        var xhr = new XMLHttpRequest();
        xhr.open('{method}', '{endpoint}', false);
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.send('{payload}');
        return xhr.responseText;
    """

    return driver.execute_script(script)

3. Abfangen und Ändern von API-Aufrufen

Selenium WebDriver kann verwendet werden, um API-Aufrufe, die von der Anwendung getätigt werden, abzufangen und zu ändern, insbesondere in Kombination mit Proxy-Tools wie BrowserMob Proxy.

Java-Beispiel mit BrowserMob Proxy

import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import org.openqa.selenium.Proxy;

public void setupProxyForApiInterception() {
    // Start the proxy
    BrowserMobProxy proxy = new BrowserMobProxyServer();
    proxy.start(0);

    // Get the Selenium proxy object
    Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

    // Configure Chrome to use the proxy
    ChromeOptions options = new ChromeOptions();
    options.setCapability("proxy", seleniumProxy);

    // Create the WebDriver instance
    driver = new ChromeDriver(options);

    // Add a request filter to intercept API calls
    proxy.addRequestFilter((request, contents, messageInfo) -> {
        if (request.getUri().contains("/api/")) {
            System.out.println("Intercepted API call: " + request.getUri());
            // Modify headers, parameters, or the request body if needed
        }
        return null;
    });

    // Add a response filter to inspect and modify API responses
    proxy.addResponseFilter((response, contents, messageInfo) -> {
        if (messageInfo.getOriginalRequest().getUri().contains("/api/")) {
            String responseBody = contents.getTextContents();
            System.out.println("API Response: " + responseBody);
            // Modify the response if needed
        }
    });
}

Erstellen eines vollständigen API-Test-Frameworks

Lassen Sie uns ein strukturierteres API-Test-Framework mit Selenium WebDriver erstellen:

Java-Beispiel

import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.io.IOException;

public class ApiTestFramework {
    private WebDriver driver;
    private final String BASE_URL = "<https://api.example.com>";

    @BeforeClass
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");
        driver = new ChromeDriver(options);
    }

    @Test
    public void testGetUserEndpoint() throws IOException {
        String endpoint = BASE_URL + "/api/users/1";
        String response = performGetRequest(endpoint);

        JSONObject jsonResponse = new JSONObject(response);

        Assert.assertEquals(jsonResponse.getString("name"), "John Doe");
        Assert.assertEquals(jsonResponse.getInt("id"), 1);
        Assert.assertTrue(jsonResponse.has("email"));
    }

    @Test
    public void testCreateUserEndpoint() throws IOException {
        String endpoint = BASE_URL + "/api/users";
        JSONObject payload = new JSONObject();
        payload.put("name", "Jane Smith");
        payload.put("email", "jane.smith@example.com");

        String response = performPostRequest(endpoint, payload.toString());
        JSONObject jsonResponse = new JSONObject(response);

        Assert.assertTrue(jsonResponse.has("id"));
        Assert.assertEquals(jsonResponse.getString("name"), "Jane Smith");
    }

    private String performGetRequest(String endpoint) throws IOException {
        // Implementation from previous example
    }

    private String performPostRequest(String endpoint, String payload) throws IOException {
        URL url = new URL(endpoint);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setDoOutput(true);

        // Write payload to connection
        try (java.io.OutputStream os = connection.getOutputStream()) {
            byte[] input = payload.getBytes("utf-8");
            os.write(input, 0, input.length);
        }

        int responseCode = connection.getResponseCode();
        System.out.println("POST Response Code: " + responseCode);

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), "utf-8"))) {
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine.trim());
            }
            return response.toString();
        }
    }

    @AfterClass
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

Python-Beispiel

import unittest
import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests

class ApiTestFramework(unittest.TestCase):
    BASE_URL = "<https://api.example.com>"

    def setUp(self):
        chrome_options = Options()
        chrome_options.add_argument("--headless")
        self.driver = webdriver.Chrome(options=chrome_options)

    def test_get_user_endpoint(self):
        endpoint = self.BASE_URL + "/api/users/1"
        response = self.perform_get_request(endpoint)

        self.assertEqual(response['name'], "John Doe")
        self.assertEqual(response['id'], 1)
        self.assertIn('email', response)

    def test_create_user_endpoint(self):
        endpoint = self.BASE_URL + "/api/users"
        payload = {
            "name": "Jane Smith",
            "email": "jane.smith@example.com"
        }

        response = self.perform_post_request(endpoint, payload)

        self.assertIn('id', response)
        self.assertEqual(response['name'], "Jane Smith")

    def perform_get_request(self, endpoint):
        response = requests.get(endpoint)
        return response.json() if response.status_code == 200 else None

    def perform_post_request(self, endpoint, payload):
        headers = {'Content-Type': 'application/json'}
        response = requests.post(endpoint, data=json.dumps(payload), headers=headers)
        return response.json() if response.status_code in [200, 201] else None

    def tearDown(self):
        if self.driver:
            self.driver.quit()

if __name__ == '__main__':
    unittest.main()

Kombinieren von UI- und API-Tests

Einer der größten Vorteile der Verwendung von Selenium WebDriver für API-Tests ist die Möglichkeit, UI- und API-Tests im selben Framework zu kombinieren:

@Test
public void testLoginAndVerifyUserDataAPI() throws IOException {
    // UI part: Login through the UI
    driver.get("<https://example.com/login>");
    driver.findElement(By.id("username")).sendKeys("testuser");
    driver.findElement(By.id("password")).sendKeys("password");
    driver.findElement(By.id("loginButton")).click();

    // Wait for login to complete
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    wait.until(ExpectedConditions.urlContains("/dashboard"));

    // Extract authentication token from cookies or local storage
    String authToken = (String) ((JavascriptExecutor) driver)
        .executeScript("return localStorage.getItem('authToken');");

    // API part: Use the token to make an authenticated API call
    String endpoint = BASE_URL + "/api/user/profile";
    URL url = new URL(endpoint);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.setRequestProperty("Authorization", "Bearer " + authToken);

    // Process and verify the API response
    int responseCode = connection.getResponseCode();
    Assert.assertEquals(responseCode, 200);

    // Read and parse the response
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String response = in.lines().collect(Collectors.joining());
    in.close();

    JSONObject jsonResponse = new JSONObject(response);

    // Verify that the API data matches what's displayed in the UI
    String uiUsername = driver.findElement(By.id("profileUsername")).getText();
    Assert.assertEquals(jsonResponse.getString("username"), uiUsername);
}

Best Practices für API-Tests mit Selenium WebDriver

  1. Verwenden Sie den Headless-Modus: Wenn Sie reine API-Tests durchführen, führen Sie Selenium im Headless-Modus aus, um Ressourcen zu sparen.
  2. Trennen Sie API- und UI-Tests: Obwohl Sie sie kombinieren können, halten Sie API- und UI-Tests logisch getrennt.
  3. Nutzen Sie Assertions-Bibliotheken: Verwenden Sie umfassende Assertions-Bibliotheken, um API-Antworten zu validieren.
  4. Implementieren Sie Fehlerbehandlung: Fügen Sie eine ordnungsgemäße Fehlerbehandlung für API-Fehler hinzu.
  5. Protokollieren Sie API-Anfragen und -Antworten: Protokollieren Sie zu Debugging-Zwecken alle API-Interaktionen.
  6. Parametrisieren Sie Tests: Verwenden Sie Datenanbieter oder parametrisierte Tests, um verschiedene Szenarien zu testen.
  7. Implementieren Sie die Authentifizierungsbehandlung: Erstellen Sie wiederverwendbare Methoden zur Behandlung der Authentifizierung.
  8. Berücksichtigen Sie die Leistung: Beachten Sie, dass Selenium im Vergleich zu dedizierten API-Test-Tools einen Mehraufwand verursachen kann.

Einschränkungen der Verwendung von Selenium WebDriver für API-Tests

  1. Leistungs-Overhead: Selenium ist in erster Linie für die Browserautomatisierung konzipiert, daher verursacht es einen Mehraufwand für reine API-Tests.
  2. Begrenzte API-spezifische Funktionen: Dedizierte API-Test-Tools bieten spezifischere Funktionen für API-Tests.
  3. Browserabhängigkeit: Selbst im Headless-Modus benötigt Selenium einen Browser, was für API-Tests möglicherweise unnötig ist.
  4. Komplexität: Das Einrichten von Selenium für API-Tests kann komplexer sein als die Verwendung dedizierter API-Test-Tools.

Wann Selenium WebDriver für API-Tests verwendet werden soll

Selenium WebDriver eignet sich am besten für API-Tests in den folgenden Szenarien:

  1. Wenn Sie bereits ein Selenium-basiertes UI-Test-Framework haben und es erweitern möchten.
  2. Wenn Sie Szenarien testen müssen, die sowohl UI- als auch API-Interaktionen umfassen.
  3. Wenn Sie APIs im Kontext eines Browsers testen müssen (z. B. das Testen von JavaScript-API-Aufrufen).
  4. Wenn Sie API-Aufrufe, die von der Anwendung getätigt werden, abfangen und ändern möchten.

Fazit

Selenium WebDriver kann ein vielseitiges Werkzeug für API-Tests sein, insbesondere wenn es in bestehende UI-Test-Frameworks integriert wird. Obwohl es dedizierte API-Test-Tools für komplexe API-Testanforderungen möglicherweise nicht ersetzt, bietet es eine flexible Möglichkeit, UI- und API-Tests in einem einzigen Framework zu kombinieren.

Durch die Nutzung der in diesem Tutorial bereitgestellten Ansätze und Beispiele können Sie Selenium WebDriver effektiv für Ihre API-Testanforderungen einsetzen. Denken Sie daran, die Kompromisse zu berücksichtigen und das richtige Werkzeug für Ihre spezifischen Testanforderungen auszuwählen.

Egal, ob Sie REST-APIs, SOAP-Dienste oder GraphQL-Endpunkte testen, Selenium WebDriver kann Ihnen dabei helfen, umfassende Tests zu erstellen, die sowohl die UI Ihrer Anwendung als auch ihre zugrunde liegende API-Funktionalität validieren.

Für erweiterte API-Testanforderungen sollten Sie möglicherweise in Erwägung ziehen, Selenium WebDriver mit dedizierten API-Testbibliotheken oder -Frameworks wie REST Assured (für Java) oder Requests (für Python) zu kombinieren, um das Beste aus beiden Welten zu erhalten.

Viel Spaß beim Testen!

Explore more

Fathom-R1-14B: Fortschrittliches KI-Argumentationsmodell aus Indien

Fathom-R1-14B: Fortschrittliches KI-Argumentationsmodell aus Indien

Künstliche Intelligenz wächst rasant. FractalAIResearch/Fathom-R1-14B (14,8 Mrd. Parameter) glänzt in Mathe & Logik.

5 June 2025

Cursor 1.0 mit BugBot: KI-gestütztes Automatisierungstest-Tool ist da:

Cursor 1.0 mit BugBot: KI-gestütztes Automatisierungstest-Tool ist da:

Die Softwareentwicklung erlebt Innovationen durch KI. Cursor, ein KI-Editor, erreicht mit Version 1.0 einen Meilenstein.

5 June 2025

30+ öffentliche Web 3.0 APIs, die Sie jetzt nutzen können

30+ öffentliche Web 3.0 APIs, die Sie jetzt nutzen können

Der Aufstieg von Web 3.0: Dezentral, nutzerorientiert, transparent. APIs ermöglichen innovative dApps und Blockchain-Integration.

4 June 2025

Praktizieren Sie API Design-First in Apidog

Entdecken Sie eine einfachere Möglichkeit, APIs zu erstellen und zu nutzen