End-to-End-Tests für Chrome-Erweiterungen

Bei End-to-End-Tests wird ein Erweiterungspaket erstellt und in einen Browser geladen. Ein Testtool kommuniziert mit dem Browser, um Interaktionen zu automatisieren und dieselben Abläufe zu testen, die ein Nutzer durchlaufen würde. Eine Bibliothek, die End-to-End-Tests unterstützt, bietet im Allgemeinen Möglichkeiten zur Steuerung des Browsers, zur Simulation von Nutzereingaben und zur Beobachtung des aktuellen Status aller geöffneten Seiten.

Eine Anleitung finden Sie unter Chrome-Erweiterungen mit Puppeteer testen. Unter Einheitstests finden Sie weitere Informationen zum Erstellen von Einheitstests für Chrome-Erweiterungen.

Browsertestbibliotheken verwenden

Erweiterungen werden von einer Reihe von Testbibliotheken unterstützt.

Bibliothek Anleitung
Puppeteer / Playwright Siehe Chrome-Erweiterungen (Puppeteer / Playwright).
Selenium Verwenden Sie das Objekt ChromeOptions, um Erweiterungen zu laden. Weitere Informationen
WebDriverIO Weitere Informationen finden Sie unter Web-Erweiterungen testen.

Tests in monitorlosem Chrome ausführen

Wenn Sie Tests im Rahmen eines automatisierten Workflows ausführen, ist es oft erforderlich, Ihre Erweiterung auf einem Computer ohne Bildschirm zu laden. Mit dem neuen headless-Modus von Chrome kann Chrome in einer solchen unbeaufsichtigten Umgebung ausgeführt werden. Starten Sie Chrome mit dem Flag --headless=new. „headless“ ist derzeit standardmäßig auf „old“ gesetzt, was das Laden von Erweiterungen nicht unterstützt. Je nach ausgewähltem Automatisierungstool kann es eine Einstellung geben, durch die das Flag automatisch hinzugefügt wird.

Erweiterungs-ID festlegen

In Tests ist es oft wünschenswert, eine feste Erweiterungs-ID zu haben. Dies erleichtert viele gängige Aufgaben, z. B. das Hinzufügen des Ursprungs der Erweiterung zu einer Zulassungsliste auf einem Server, mit dem sie kommunizieren muss, oder das Öffnen von Erweiterungsseiten in Tests. Führen Sie dazu die Schritte unter Eine einheitliche Erweiterungs-ID beibehalten aus.

Erweiterungsseiten testen

Auf Erweiterungsseiten kann über die entsprechende URL zugegriffen werden, z. B. chrome-extension://<id>/index.html. Verwenden Sie die normalen Navigationsmethoden in Ihrem bevorzugten Automatisierungstool, um diese URLs aufzurufen.

Pop-up einer Erweiterung testen

Das Öffnen eines Pop-ups einer Erweiterung im Kontext einer anderen Seite ist derzeit nicht möglich. Öffnen Sie stattdessen die URL des Pop-ups in einem neuen Tab. Wenn in Ihrem Pop-up der aktive Tab verwendet wird, sollten Sie ein Override implementieren, bei dem eine Tab-ID explizit an Ihr Pop-up übergeben werden kann. Beispiel:

const URL_PARAMS  = new URLSearchParams(window.location.search);

async function getActiveTab() {
  // Open popup.html?tab=5 to use tab ID 5, etc.
  if (URL_PARAMS.has("tab")) {
    return parseInt(URL_PARAMS.get("tab"));
  }

  const tabs = await chrome.tabs.query({
    active: true,
    currentWindow: true
  });

  return tabs[0];
}

Erweiterungsstatus prüfen

Um Testfehler zu vermeiden, wenn Sie das interne Verhalten Ihrer Erweiterung ändern, sollten Sie in einem Integrationstest in der Regel nicht auf den internen Status zugreifen. Stattdessen sollten Sie Ihre Tests auf das stützen, was für die Nutzer sichtbar ist. Manchmal ist es jedoch sinnvoll, direkt über die Erweiterung auf Daten zuzugreifen. In diesen Fällen sollten Sie Code im Kontext einer Erweiterungsseite ausführen.

In Puppeteer:

const workerTarget = await browser.waitForTarget(
  target => target.type() === 'service_worker'
);
const worker = await workerTarget.worker();

const value = await worker.evaluate(() => {
  chrome.storage.local.get('foo');
});

In Selenium:

// Selenium doesn't allow us to access the service worker, so we need to open an extension page where we can execute the code
await driver.get('chrome-extension://<id>/popup.html');
await driver.executeAsyncScript(
  'const callback = arguments[arguments.length - 1];' +
  'chrome.storage.local.get(\'foo\').then(callback);'
);

Beendigung von Dienst-Workern testen

Informationen zum Testen der Beendigung von Dienstarbeitern finden Sie unter Beendigung von Dienstarbeitern mit Puppeteer testen. Außerdem haben wir ein Beispiel für Puppeteer und Selenium.

Hinweis: Bei einigen Test-Frameworks werden Dienstprogramme möglicherweise nicht automatisch beendet, wie es bei der normalen Nutzung der Fall wäre. Das ist bei Selenium der Fall. Er nutzt den ChromeDriver, der allen Service Workers einen Debugger zuweist, um zu verhindern, dass sie beendet werden.