Einrichten Ihrer eigenen Testautomatisierungsumgebung
In diesem Artikel zeigen wir Ihnen, wie Sie Ihre eigene Automatisierungsumgebung installieren und Ihre eigenen Tests mit Selenium/WebDriver und einer Testbibliothek wie selenium-webdriver für Node ausführen können. Wir werden auch darauf eingehen, wie Sie Ihre lokale Testumgebung mit kommerziellen Tools integrieren können, wie sie im vorherigen Artikel besprochen wurden.
| Voraussetzungen: | Vertrautheit mit den Kernsprachen HTML, CSS und JavaScript; eine Vorstellung von den grundlegenden Prinzipien des Cross-Browser-Tests und automatisierten Testens. |
|---|---|
| Ziel: | Wie Sie eine Selenium-Testumgebung lokal einrichten und Tests damit ausführen und wie Sie diese mit Tools wie Sauce Labs und BrowserStack integrieren können. |
Selenium
Selenium ist das beliebteste Browser-Automatisierungstool. Es gibt andere Methoden, aber der beste Weg, Selenium zu nutzen, ist über WebDriver, eine leistungsstarke API, die auf Selenium aufbaut und Browser anweist, um diese zu automatisieren, indem sie Aktionen wie „diese Webseite öffnen“, „über dieses Element auf der Seite fahren“, „diesen Link anklicken“, „prüfen, ob der Link diese URL öffnet“ usw. durchführt. Dies ist ideal, um automatisierte Tests durchzuführen.
Wie Sie WebDriver installieren und verwenden, hängt davon ab, in welcher Programmierumgebung Sie Ihre Tests schreiben und ausführen möchten. Die meisten gängigen Umgebungen bieten ein Paket oder Framework an, das WebDriver und die erforderlichen Bindungen zur Kommunikation mit WebDriver in dieser Sprache installiert, z.B. Java, C#, Ruby, Python, JavaScript (Node) usw. Siehe Einrichten eines Selenium-WebDriver-Projekts für weitere Details zu Selenium-Setups für verschiedene Sprachen.
Unterschiedliche Browser erfordern unterschiedliche Treiber, damit WebDriver mit ihnen kommunizieren und sie steuern kann. Weitere Informationen dazu, wo Sie Browser-Treiber erhalten können, finden Sie unter Plattformen, die von Selenium unterstützt werden.
Wir werden das Schreiben und Ausführen von Selenium-Tests unter Verwendung von Node.js abdecken, da es schnell und einfach zu starten ist und eine vertrautere Umgebung für Frontend-Entwickler darstellt.
Hinweis: Wenn Sie herausfinden möchten, wie Sie WebDriver mit anderen serverseitigen Umgebungen verwenden können, schauen Sie sich auch Plattformen, die von Selenium unterstützt werden an, um nützliche Links zu finden.
Einrichtung von Selenium in Node
-
Um zu beginnen, richten Sie ein neues npm-Projekt ein, wie im letzten Kapitel unter Node und npm einrichten besprochen. Nennen Sie es etwas anderes, z. B.
selenium-test. -
Als nächstes müssen wir ein Framework installieren, das es uns ermöglicht, mit Selenium innerhalb von Node zu arbeiten. Wir werden das offizielle selenium selenium-webdriver wählen, da die Dokumentation relativ aktuell zu sein scheint und es gut gewartet wird. Wenn Sie andere Optionen wünschen, sind webdriver.io und nightwatch.js ebenfalls gute Alternativen. Um selenium-webdriver zu installieren, führen Sie den folgenden Befehl aus, wobei Sie sicherstellen, dass Sie sich im Projektordner befinden:
bashnpm install selenium-webdriver
Hinweis: Es ist weiterhin eine gute Idee, diese Schritte zu befolgen, auch wenn Sie selenium-webdriver zuvor installiert und die Browser-Treiber heruntergeladen haben. Sie sollten sicherstellen, dass alles auf dem neuesten Stand ist.
Als nächstes müssen Sie die relevanten Treiber herunterladen, damit WebDriver die Browser steuern kann, die Sie testen möchten. Details dazu, wo Sie sie bekommen können, finden Sie auf der selenium-webdriver Seite (sehen Sie sich die Tabelle im ersten Abschnitt an). Offensichtlich sind einige der Browser betriebssystemspezifisch, aber wir werden bei Firefox und Chrome bleiben, da sie auf allen Hauptbetriebssystemen verfügbar sind.
- Laden Sie die neuesten GeckoDriver (für Firefox) und ChromeDriver Treiber herunter.
- Entpacken Sie sie an einem Ort, der relativ einfach zu navigieren ist, wie das Hauptverzeichnis Ihres Benutzerordners.
- Fügen Sie den Speicherort der
chromedriverundgeckodriverTreiber Ihrer System-PATH-Variable hinzu. Dies sollte ein absoluter Pfad vom Stamm Ihres Festplattenlaufwerks zu dem Verzeichnis sein, das die Treiber enthält. Beispielsweise, wenn wir einen Mac mit dem Benutzernamen bob verwenden würden und wir die Treiber im Hauptverzeichnis unseres Heimatordners ablegen würden, würde der Pfad/Users/boblauten.
Hinweis:
Um es noch einmal zu wiederholen, der Pfad, den Sie zu PATH hinzufügen, muss der Pfad zum Verzeichnis sein, das die Treiber enthält, nicht die Pfade zu den Treibern selbst! Dies ist ein häufiger Fehler.
Um Ihre PATH-Variable auf einem macOS-System und auf den meisten Linux-Systemen zu setzen:
-
Öffnen Sie Ihre
.zprofile(oder.bash_profile, wenn Ihr Systembashshell verwendet) Datei.Hinweis: Wenn Sie versteckte Dateien nicht sehen können, müssen Sie diese anzeigen, siehe Versteckte Dateien in macOS ein-/ausblenden oder Versteckte Ordner in Ubuntu anzeigen).
-
Fügen Sie das folgende an das Ende Ihrer Datei ein (aktualisieren Sie den Pfad entsprechend dem Pfad auf Ihrem Computer):
bash# Add WebDriver browser drivers to PATH export PATH=$PATH:/Users/bob -
Speichern und schließen Sie diese Datei, und starten Sie Ihr Terminal/Command Prompt neu, um Ihre Bash-Konfiguration neu zu laden.
-
Überprüfen Sie, dass Ihre neuen Pfade in der
PATH-Variable sind, indem Sie das Folgende in Ihr Terminal eingeben:bashecho $PATHSie sollten ihn im Terminal ausgedruckt sehen.
Hinweis:
Um Ihre PATH-Variable unter Windows einzustellen, folgen Sie den Anweisungen unter Wie kann ich einen neuen Ordner zu meinem Systempfad hinzufügen?
Lassen Sie uns eine schnelle Überprüfung machen, um sicherzustellen, dass alles funktioniert.
-
Erstellen Sie eine neue Datei in Ihrem Projektverzeichnis mit dem Namen
duck_test.js: -
Geben Sie ihr den folgenden Inhalt und speichern Sie sie dann:
jsconst { Builder, Browser, By, Key, until } = require("selenium-webdriver"); (async function example() { const driver = await new Builder().forBrowser(Browser.FIREFOX).build(); try { await driver.get("https://duckduckgo.com/"); await driver.findElement(By.name("q")).sendKeys("webdriver", Key.RETURN); await driver.wait(until.titleIs("webdriver at DuckDuckGo"), 1000); console.log("Test passed!"); } catch (e) { console.log(`Error: ${e}`); } finally { await driver.sleep(2000); // Delay long enough to see search page! await driver.quit(); } })();Hinweis: Diese Funktion ist eine IIFE (Immediately Invoked Function Expression).
-
Im Terminal vergewissern Sie sich, dass Sie sich in Ihrem Projektordner befinden, und geben Sie dann den folgenden Befehl ein:
bashnode duck_test
Sie sollten sehen, dass sich automatisch eine Instanz von Firefox öffnet! DuckDuckGo wird automatisch in einem Tab geladen, "webdriver" wird in das Suchfeld eingegeben und der Suchknopf wird angeklickt. WebDriver wartet dann 1 Sekunde; der Dokumenttitel wird dann abgerufen, und wenn er "webdriver at DuckDuckGo" ist, geben wir eine Nachricht zurück, dass der Test bestanden ist.
Dann warten wir 2 Sekunden, nach denen WebDriver die Firefox-Instanz herunterfährt und stoppt.
Testen in mehreren Browsern gleichzeitig
Es spricht auch nichts dagegen, den Test gleichzeitig auf mehreren Browsern auszuführen. Versuchen wir es!
-
Erstellen Sie eine weitere neue Datei in Ihrem Projektverzeichnis mit dem Namen
duck_test_multiple.js. Sie können gerne die Verweise auf einige der anderen Browser ändern, diese entfernen usw., je nachdem, welche Browser auf Ihrem Betriebssystem verfügbar sind. Sie müssen sicherstellen, dass Sie die richtigen Browser-Treiber auf Ihrem System eingerichtet haben. Um zu wissen, welchen String Sie in der.forBrowser()Methode für andere Browser verwenden sollen, sehen Sie sich die Browser enum Referenzseite an. -
Geben Sie Ihrer Datei den folgenden Inhalt und speichern Sie sie dann:
jsconst { Builder, Browser, By, Key } = require("selenium-webdriver"); const driverFx = new Builder().forBrowser(Browser.FIREFOX).build(); const driverChr = new Builder().forBrowser(Browser.CHROME).build(); async function searchTest(driver) { try { await driver.get("https://duckduckgo.com/"); await driver.findElement(By.name("q")).sendKeys("webdriver", Key.RETURN); await driver.sleep(2000); const title = await driver.getTitle(); if (title === "webdriver at DuckDuckGo") { console.log("Test passed"); } else { console.log("Test failed"); } } finally { driver.quit(); } } searchTest(driverFx); searchTest(driverChr); -
Im Terminal vergewissern Sie sich, dass Sie sich in Ihrem Projektordner befinden, und geben Sie dann den folgenden Befehl ein:
bashnode duck_test_multiple
Hinweis: Wenn Sie einen Mac verwenden und sich entscheiden Safari zu testen, kann es sein, dass Sie eine Fehlermeldung wie "Could not create a session: You must enable the 'Allow Remote Automation' option in Safari's Develop menu to control Safari via WebDriver." erhalten. Wenn dies der Fall ist, folgen Sie der Anweisung und versuchen Sie es erneut.
Sie erhalten möglicherweise eine Nachricht, dass Sie eine Treiber-App nicht öffnen können, da sie nicht von einer verifizierten Quelle heruntergeladen wurde. Wenn dies der Fall ist, können Sie diese Sicherheitseinstellung nur für diese Treiber-App überschreiben. Zum Beispiel auf einem Mac Ctrl + auf die App klicken, Öffnen wählen und im erscheinenden Dialogfeld erneut Öffnen wählen.
Hier haben wir den Test wie zuvor durchgeführt, außer dass wir ihn diesmal in eine Funktion, searchTest(), eingepackt haben. Wir haben neue Browserinstanzen für mehrere Browser erstellt und dann jede an die Funktion übergeben, sodass der Test auf allen durchgeführt wird.
Lassen Sie uns weitermachen und die Grundlagen der WebDriver-Syntax etwas detaillierter betrachten.
WebDriver Syntax Crash Kurs
Schauen wir uns einige der wichtigsten Merkmale der WebDriver-Syntax an. Für umfassendere Details sollten Sie die selenium-webdriver JavaScript API Referenz für eine detaillierte Referenz konsultieren und die Hauptdokumentation von Seleniums Selenium WebDriver lesen, die mehrere Beispiele in verschiedenen Sprachen enthält.
Einen neuen Test starten
Um einen neuen Test zu starten, müssen Sie das selenium-webdriver Modul einbeziehen und den Builder Konstruktor und das Browser Interface importieren:
const { Builder, Browser } = require("selenium-webdriver");
Sie verwenden den Builder() Konstruktor, um eine neue Instanz eines Treibers zu erstellen, und verketten die Methode forBrowser(), um anzugeben, mit welchem Browser Sie mit diesem Builder testen möchten. Die Methode build() wird am Ende angekettet, um die Treiberinstanz tatsächlich zu erstellen (siehe die Builder-Klassen-Referenz für detaillierte Informationen zu diesen Funktionen).
let driver = new Builder().forBrowser(Browser.FIREFOX).build();
Bitte beachten Sie, dass es möglich ist, spezifische Konfigurationsoptionen für die zu testenden Browser festzulegen. Beispielsweise können Sie eine bestimmte Version und ein OS angeben, um in der Methode forBrowser() zu testen:
let driver = new Builder().forBrowser(Browser.FIREFOX, "130", "MAC").build();
Sie könnten diese Optionen auch mithilfe einer Umgebungsvariablen einstellen, zum Beispiel:
SELENIUM_BROWSER=firefox:130:MAC
Lassen Sie uns einen neuen Test erstellen, um uns den Code direkt anzusehen, während wir darüber sprechen. Erstellen Sie in Ihrem Selenium-Testprojektordner eine neue Datei mit dem Namen quick_test.js und fügen Sie den folgenden Code hinzu:
const { Builder, Browser } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
})();
Sie können das Beispiel testen, indem Sie den folgenden Befehl in Ihr Terminal eingeben:
node quick_test
Holen Sie sich das Dokument, das Sie testen möchten
Um die Seite zu laden, die Sie tatsächlich testen möchten, verwenden Sie die Methode get() der zuvor erstellten Treiberinstanz, z.B.:
driver.get("http://www.google.com");
Hinweis: Informationen zu den Funktionen in diesem Abschnitt sowie zu denen darunter finden Sie in der WebDriver-Klassenreferenz.
Sie können jede URL verwenden, um auf Ihre Ressource zu verweisen, einschließlich einer file:// URL, um ein lokales Dokument zu testen:
driver.get("file:///Users/bob/git/examples/test_file.html");
oder
driver.get("http://localhost:8888/test_file.html");
Aber es ist besser, einen Remote-Server-Standort zu verwenden, damit der Code flexibler ist — wenn Sie beginnen, einen Remote-Server zum Ausführen Ihrer Tests zu verwenden (siehe später), wird Ihr Code fehlschlagen, wenn Sie lokale Pfade zu verwenden versuchen.
Aktualisieren Sie Ihre example()-Funktion wie folgt, ersetzen Sie den Platzhalterpfad durch einen realen lokalen Pfad zu einer HTML-Datei auf Ihrem Computer und versuchen Sie, ihn auszuführen:
const { Builder, Browser } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get("file:///Users/bob/git/examples/test_file.html");
})();
Interaktion mit dem Dokument
Jetzt, da wir ein zu testendes Dokument haben, müssen wir in irgendeiner Weise damit interagieren, was normalerweise bedeutet, dass zunächst ein spezifisches Element ausgewählt wird, um etwas darüber zu testen. Sie können UI-Elemente auf viele Arten auswählen in WebDriver, einschließlich nach ID, Klasse, Elementname usw. Die tatsächliche Auswahl erfolgt durch die Methode findElement(), die eine Auswahlmethode als Parameter akzeptiert. Zum Beispiel, um ein Element nach ID auszuwählen:
const element = driver.findElement(By.id("myElementId"));
Eine der nützlichsten Möglichkeiten, ein Element durch CSS zu suchen — die Methode By.css() erlaubt es Ihnen, ein Element mit einem CSS-Selektor auszuwählen.
Aktualisieren Sie jetzt Ihre example()-Funktion wie folgt und führen Sie das Beispiel aus:
const { Builder, Browser, By } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const button = driver.findElement(By.css("button:nth-of-type(1)"));
})();
Testen Ihres Elements
Es gibt viele Möglichkeiten, mit Ihren Webdokumenten und Elementen innerhalb dieser zu interagieren. Nützliche gängige Beispiele finden Sie ab Textwerte abrufen in den WebDriver-Dokumenten.
Wenn wir den Text in unserem Button abrufen wollten, könnten wir Folgendes tun:
button.getText().then((text) => {
console.log(`Button text is '${text}'`);
});
Fügen Sie dies jetzt an das Ende der example()-Funktion wie unten gezeigt hinzu:
const { Builder, Browser, By } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const button = driver.findElement(By.css("button:nth-of-type(1)"));
button.getText().then((text) => {
console.log(`Button text is '${text}'`);
});
})();
Führen Sie das Beispiel mit node auf dieselbe Weise aus, wie Sie es zuvor getan haben. Sie sollten sehen, wie das Textlabel des Buttons in der Konsole angezeigt wird.
Lassen Sie uns etwas tun, das etwas nützlicher ist. Ersetzen Sie den vorherigen Codeeintrag durch button.click(); wie unten gezeigt:
const { Builder, Browser, By } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const button = driver.findElement(By.css("button:nth-of-type(1)"));
button.click();
})();
Versuchen Sie, Ihren Test erneut auszuführen; der Button wird geklickt und ein alert()-Popup sollte erscheinen. Zumindest wissen wir, dass der Button funktioniert!
Sie können auch mit dem Popup interagieren. Aktualisieren Sie die example()-Funktion wie folgt und versuchen Sie erneut, es zu testen:
const { Builder, Browser, By, until } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const button = driver.findElement(By.css("button:nth-of-type(1)"));
button.click();
await driver.wait(until.alertIsPresent());
const alert = driver.switchTo().alert();
alert.getText().then((text) => {
console.log(`Alert text is '${text}'`);
});
alert.accept();
})();
Als nächstes versuchen wir, Text in die Formularelemente einzugeben. Aktualisieren Sie die example()-Funktion wie folgt und versuchen Sie erneut, Ihren Test auszuführen:
const { Builder, Browser, By, Key } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const input = driver.findElement(By.id("name"));
input.sendKeys("Bob Smith");
input.sendKeys(Key.TAB);
const input2 = driver.findElement(By.id("age"));
input2.sendKeys("65");
})();
Sie können Tastendrücke, die nicht durch normale Zeichen dargestellt werden können, mit Eigenschaften des Key Objekts senden. Zum Beispiel haben wir oben das folgende verwendet, um zwischen Formulareingaben zu tabben:
input.sendKeys(Key.TAB);
Auf den Abschluss eines Prozesses warten
Es gibt Situationen, in denen Sie WebDriver warten lassen müssen, bis etwas abgeschlossen ist, bevor es fortfährt. Beispielsweise, wenn Sie eine neue Seite laden, möchten Sie warten, bis das DOM der Seite geladen ist, bevor Sie mit einem der Elemente darin interagieren, da der Test sonst wahrscheinlich fehlschlägt.
In unserem duck_test_multiple.js-Test haben wir zum Beispiel diese Zeile eingefügt:
await driver.sleep(2000);
Die sleep()-Methode akzeptiert einen Wert, der die Zeit angibt, die in Millisekunden gewartet werden soll — die Methode gibt ein Promise zurück, das am Ende dieser Zeit erfüllt wird. Wir verwenden das await-Schlüsselwort, um die umschließende Funktion zu pausieren, bis das Versprechen erfüllt ist, danach wird der Code nach der Methode ausgeführt.
Wir könnten sleep() auch zu unserem quick_test.js-Test hinzufügen — versuchen Sie Ihre example()-Funktion so zu aktualisieren:
const { Builder, Browser, By, Key } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const input = driver.findElement(By.id("name"));
input.sendKeys("Bob Smith");
driver.sleep(1000).then(() => {
input.getAttribute("value").then((value) => {
if (value !== "") {
console.log("Form input filled out");
} else {
console.log("Text could not be entered");
}
});
});
})();
Versuchen Sie den aktualisierten Code auszuführen. WebDriver wird nun das erste Eingabefeld ausfüllen, eine Sekunde warten und dann testen, ob sein Wert ausgefüllt ist (d.h. nicht leer ist), indem getAttribute() verwendet wird, um den Wert seines value Attributs zu erhalten. Anschließend wird eine Nachricht in der Konsole ausgegeben, um Erfolg oder Misserfolg zu melden.
Hinweis:
Es gibt auch eine Methode namens wait(), die bestimmte Bedingungen für eine gewisse Dauer wiederholt testet und dann den Code weiter ausführt. Dies nutzt auch die util library, die allgemeine Bedingungen definiert, die zusammen mit wait() verwendet werden können.
Treiber nach Benutzung abschalten
Nachdem Sie einen Test abgeschlossen haben, sollten Sie alle Treiberinstanzen, die Sie geöffnet haben, mit der Methode driver.quit() herunterfahren, um zu verhindern, dass sie unnötigerweise Ressourcen verbrauchen. Aktualisieren Sie quick_test.js wie folgt:
const { Builder, Browser, By, Key } = require("selenium-webdriver");
(async function example() {
const driver = await new Builder().forBrowser(Browser.FIREFOX).build();
driver.get(
"https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
);
const input = driver.findElement(By.id("name"));
input.sendKeys("Bob Smith");
driver.sleep(1000).then(() => {
input
.getAttribute("value")
.then((value) => {
if (value !== "") {
console.log("Form input filled out");
} else {
console.log("Text could not be entered");
}
})
.finally(() => {
driver.quit();
});
});
})();
Wenn Sie das jetzt ausführen, sollten Sie sehen, dass der Test ausgeführt wird und die Browserinstanz nach Abschluss des Tests heruntergefahren wird.
Test beste Praktiken
Es wurde viel über beste Praktiken beim Schreiben von Tests geschrieben. Sie können einige gute Hintergrundinformationen auf Test Practices finden. Im Allgemeinen sollten Sie sicherstellen, dass Ihre Tests:
- Gute Locator-Strategien verwenden: Wenn Sie mit dem Dokument interagieren, stellen Sie sicher, dass Sie Locator und Seitenobjekte verwenden, die sich wahrscheinlich nicht ändern — wenn Sie ein testbares Element haben, das Sie testen möchten, stellen Sie sicher, dass es eine stabile ID oder Position auf der Seite hat, die mit einem CSS-Selektor ausgewählt werden kann und bei der nächsten Iteration der Website nicht einfach geändert wird. Sie möchten Ihre Tests so wenig brüchig wie möglich machen, d.h. dass sie nicht einfach brechen, wenn sich etwas ändert.
- Atomare Tests schreiben: Jeder Test sollte nur eine Sache testen, damit es einfach ist, den Überblick zu behalten, welche Datei welches Kriterium testet. Der
duck_test.js-Test, den wir uns oben angesehen haben, ist ziemlich gut, da er nur eine einzige Sache testet — ob der Titel einer Suchergebnisseite korrekt gesetzt ist. Wir könnten daran arbeiten, ihm einen besseren Namen zu geben, damit es einfacher ist, herauszufinden, was er tut, falls wir mehr Tests hinzufügen. Vielleicht wäreresults_page_title_set_correctly.jsetwas besser? - Autonome Tests schreiben: Jeder Test sollte für sich allein funktionieren und nicht von anderen Tests abhängig sein, um zu funktionieren.
Zusätzlich sollten wir auch Testresultate/Berichterstattung erwähnen — wir haben in unseren obigen Beispielen Testergebnisse mit einfachen console.log() Anweisungen berichtet, aber das ist alles in JavaScript, daher können Sie jedes Testlauf- und Berichtssystem verwenden, das Sie möchten, sei es Mocha, Chai oder ein anderes Werkzeug. Lassen Sie uns ein kurzes Beispiel durchgehen:
-
Machen Sie eine lokale Kopie unseres
mocha_test.jsBeispiels in Ihrem Projektverzeichnis. Legen Sie es in einen Unterordner namenstest. Dieses Beispiel verwendet eine lange Kette von Versprechungen, um alle erforderlichen Schritte in unserem Test auszuführen — die versprochenen Methoden, die WebDriver verwendet, müssen erfüllt sein, damit es richtig funktioniert. -
Installieren Sie das Mocha-Testwerkzeug, indem Sie den folgenden Befehl in Ihrem Projektverzeichnis ausführen:
bashnpm install --save-dev mocha -
Sie können den Test (und alle anderen, die Sie in Ihrem
test-Verzeichnis ablegen) jetzt mit dem folgenden Befehl ausführen:bashnpx mocha --no-timeouts -
Sie sollten das
--no-timeouts-Flag hinzufügen, damit Ihre Tests nicht aufgrund des willkürlichen Zeitlimits von Mocha (das 3 Sekunden beträgt) fehlschlagen.
Hinweis: saucelabs-sample-test-frameworks enthält mehrere nützliche Beispiele, die zeigen, wie man verschiedene Kombination von Test-/Assertion-Tools einrichtet.
Ausführen von Remote-Tests
Es stellt sich heraus, dass das Ausführen von Tests auf Remote-Servern nicht viel schwieriger ist als das Ausführen sie lokal. Sie müssen lediglich Ihre Treiberinstanz erstellen, jedoch mit ein paar mehr spezifizierten Merkmalen, einschließlich der Fähigkeiten des Browsers, den Sie testen möchten, der Adresse des Servers und der benötigten Benutzeranmeldeinformationen (falls vorhanden).
BrowserStack
Lassen Sie uns ein Beispiel erstellen, das zeigt, wie man einen Selenium-Test remote auf BrowserStack ausführt:
-
Erstellen Sie in Ihrem Projektverzeichnis eine neue Datei mit dem Namen
bstack_duck_test.js. -
Geben Sie ihr den folgenden Inhalt:
jsconst { Builder, By, Key } = require("selenium-webdriver"); // Input capabilities const capabilities = { "bstack:options": { os: "OS X", osVersion: "Sonoma", browserVersion: "17.0", local: "false", seleniumVersion: "3.14.0", userName: "YOUR-USER-NAME", accessKey: "YOUR-ACCESS-KEY", }, browserName: "Safari", }; const driver = new Builder() .usingServer("http://hub-cloud.browserstack.com/wd/hub") .withCapabilities(capabilities) .build(); (async function bStackGoogleTest() { try { await driver.get("https://duckduckgo.com/"); await driver.findElement(By.name("q")).sendKeys("webdriver", Key.RETURN); await driver.sleep(2000); const title = await driver.getTitle(); if (title === "webdriver at DuckDuckGo") { console.log("Test passed"); } else { console.log("Test failed"); } } finally { await driver.sleep(4000); // Delay long enough to see search page! await driver.quit(); } })(); -
Von Ihrer Account & Profile details Seite bei BrowserStack, holen Sie sich Ihren Benutzernamen und Zugriffsschlüssel (siehe Username and Access Keys).
-
Ersetzen Sie die Platzhalter
YOUR-USER-NAMEundYOUR-ACCESS-KEYim Code durch Ihren tatsächlichen Benutzernamen und Zugriffsschlüssel Werte (und stellen Sie sicher, dass Sie sie sicher aufbewahren). -
Führen Sie Ihren Test mit dem folgenden Befehl aus:
bashnode bstack_google_testDer Test wird an BrowserStack gesendet, und das Testergebnis wird an Ihre Konsole zurückgesendet. Dies zeigt die Bedeutung eines Ergebnisberichtsmechanismus!
-
Wenn Sie jetzt zum BrowserStack Automate dashboard zurückkehren, sehen Sie Ihren Test aufgelistet, mit Details einschließlich eines Videorecordings des Tests und mehreren detaillierten Protokollen mit Informationen dazu:

Hinweis: Die Menüoption Resources auf dem BrowserStack-Automations-Dashboard enthält eine Fülle nützlicher Informationen zur Verwendung für automatisierte Tests. Siehe Selenium mit NodeJS für Node-spezifische Informationen.
Ausfüllen von BrowserStack-Testdetails programmgesteuert
Sie können die BrowserStack REST API und einige andere Funktionen verwenden, um Ihren Test mit mehr Details zu versehen, wie ob er bestanden wurde, warum er bestanden wurde, zu welchem Projekt der Test gehört usw. BrowserStack kennt diese Details standardmäßig nicht.
Lassen Sie uns unser bstack_duck_test.js Demo aktualisieren, um zu zeigen, wie diese Funktionen funktionieren:
-
Installieren Sie das Modul axios durch Ausführen des folgenden Befehls innerhalb Ihres Projektverzeichnisses:
bashnpm install axios -
Importieren Sie das axios-Modul, damit wir es verwenden können, um Anfragen an die BrowserStack REST API zu senden. Fügen Sie die folgende Zeile ganz oben in Ihrem Code hinzu:
jsconst axios = require("axios"); -
Nun aktualisieren wir unser
capabilitiesObjekt, um einen Projektnamen hinzuzufügen — fügen Sie die folgende Zeile vor der schließenden geschweiften Klammer hinzu, und denken Sie daran, am Ende der vorhergehenden Zeile ein Komma einzufügen (Sie können die Build- und Projektnamen variieren, um die Tests in verschiedenen Fenstern auf dem BrowserStack-Automatisierungs-Dashboard zu organisieren):jsconst capabilities = { // … project: "DuckDuckGo test 2", }; -
Als nächstes rufen wir die
sessionIdder aktuellen Sitzung ab und verwenden diese (zusammen mit IhremuserNameundaccessKey), um die URL zusammenzustellen, um Anfragen an BrowserStack zu senden, um die Daten zu aktualisieren. Fügen Sie die folgenden Zeilen direkt unter dem Block hinzu, der dasdriver-Objekt erstellt (das mitconst driver = new Builder()beginnt) :jslet sessionId; let bstackURL; driver.session_.then((sessionData) => { sessionId = sessionData.id_; bstackURL = `https://${capabilities["bstack:options"].userName}:${capabilities["bstack:options"].accessKey}@www.browserstack.com/automate/sessions/${sessionId}.json`; }); -
Abschließend aktualisieren wir den
if...elseBlock nahe dem unteren Ende des Codes, um passende API-Anfragen an BrowserStack zu senden, je nachdem, ob der Test bestanden oder nicht bestanden wurde:jsif (title === "webdriver at DuckDuckGo") { console.log("Test passed"); axios.put(bstackURL, { status: "passed", reason: "DuckDuckGo results showed correct title", }); } else { console.log("Test failed"); axios.put(bstackURL, { status: "failed", reason: "DuckDuckGo results showed wrong title", }); }
Wenn der Test abgeschlossen ist, senden wir eine API-Anfrage an BrowserStack, um den Test mit einem bestanden oder fehlgeschlagenen Status zu aktualisieren und einem Grund für das Ergebnis.
Wenn Sie jetzt zum BrowserStack Automate dashboard zurückkehren, sollten Sie Ihre Testsitzung wie zuvor sehen, jedoch mit Ihren benutzerdefinierten Daten daran angehängt. Es zeigt einen Status von "PASSED" und den von der REST API gemeldeten Grund für den Pass:

Sauce Labs
Lassen Sie uns ein Beispiel ansehen, das zeigt, wie Sie Selenium-Tests mit Sauce Labs remote ausführen können:
-
Erstellen Sie in Ihrem Projektverzeichnis eine neue Datei mit dem Namen
sauce_google_test.js. -
Geben Sie ihr den folgenden Inhalt:
jsconst { Builder, By, Key } = require("selenium-webdriver"); const username = "YOUR-USER-NAME"; const accessKey = "YOUR-ACCESS-KEY"; const driver = new Builder() .withCapabilities({ browserName: "chrome", platform: "Windows XP", version: "43.0", username, accessKey, }) .usingServer( `https://${username}:${accessKey}@ondemand.saucelabs.com:443/wd/hub`, ) .build(); driver.get("http://www.google.com"); driver.findElement(By.name("q")).sendKeys("webdriver"); driver.sleep(1000).then(() => { driver.findElement(By.name("q")).sendKeys(Key.TAB); }); driver.findElement(By.name("btnK")).click(); driver.sleep(2000).then(() => { driver.getTitle().then((title) => { if (title === "webdriver - Google Search") { console.log("Test passed"); } else { console.log("Test failed"); } }); }); driver.quit(); -
Von Ihren Sauce Labs Benutzer-Einstellungen holen Sie sich Ihren Benutzernamen und Zugriffsschlüssel. Ersetzen Sie die Platzhalter
YOUR-USER-NAMEundYOUR-ACCESS-KEYim Code durch Ihren tatsächlichen Benutzernamen und Schlüsselwerte (und stellen Sie sicher, dass Sie sie sicher aufbewahren). -
Führen Sie Ihren Test mit dem folgenden Befehl aus:
bashnode sauce_google_testDer Test wird an Sauce Labs gesendet, und das Testergebnis wird an Ihre Konsole zurückgesendet. Dies zeigt die Bedeutung eines Ergebnisberichtsmechanismus!
-
Wenn Sie jetzt zur Sauce Labs Automatisierten Test-Dashboard Seite gehen, sehen Sie Ihren Test aufgelistet; von hier aus können Sie Videos, Screenshots und andere solche Daten einsehen.

Hinweis: Sauce Labs' Platform Konfigurator ist ein nützliches Tool zum Erzeugen von Capability-Objekten für Ihre Treiberinstanzen, basierend darauf, welchen Browser/OS Sie testen möchten.
Hinweis: Weitere nützliche Informationen zum Testen mit Sauce Labs und Selenium finden Sie in der Broschüre Getting Started with Selenium for Automated Website Testing, und Instant Selenium Node.js Tests.
Ausfüllen von Sauce Labs-Testdetails programmgesteuert
Sie können die Sauce Labs API verwenden, um Ihren Test mit mehr Details zu versehen, wie ob er bestanden wurde, den Namen des Tests usw. Sauce Labs kennt diese Details standardmäßig nicht!
Um dies zu tun, müssen Sie:
-
Installieren Sie den Node Sauce Labs Wrapper mit dem folgenden Befehl (wenn Sie es für dieses Projekt noch nicht getan haben):
bashnpm install saucelabs --save-dev -
Importieren Sie
saucelabs— setzen Sie dies oben in Ihrersauce_google_test.jsDatei, direkt unter den vorhergehenden Variablendeklarationen:jsconst SauceLabs = require("saucelabs"); -
Erstellen Sie eine neue Instanz von SauceLabs, indem Sie das Folgende direkt darunter hinzufügen:
jsconst saucelabs = new SauceLabs({ username: "YOUR-USER-NAME", password: "YOUR-ACCESS-KEY", });Ersetzen Sie auch hier die Platzhalter
YOUR-USER-NAMEundYOUR-ACCESS-KEYim Code durch Ihren tatsächlichen Benutzernamen und Schlüsselwerte (beachten Sie, dass das saucelabs npm-Paket verwirrenderweisepassword, nichtaccessKeyverwendet). Da Sie diese jetzt zweimal verwenden, möchten Sie möglicherweise ein paar Hilfsvariablen erstellen, um sie zu speichern. -
Unterhalb des Blocks, in dem Sie die
driver-Variable definieren (direkt unterhalb derbuild()-Zeile), fügen Sie den folgenden Block hinzu — dies erhält die korrekte Treiber-sessionID, die wir benötigen, um Daten in den Job zu schreiben (Sie können es in Aktion im nächsten Codeblock sehen):jsdriver.getSession().then((sessionid) => { driver.sessionID = sessionid.id_; }); -
Ersetzen Sie schließlich den
driver.sleep(2000)-Block nahe dem unteren Ende des Codes mit dem folgenden:jsdriver.sleep(2000).then(() => { driver.getTitle().then((title) => { let testPassed = false; if (title === "webdriver - Google Search") { console.log("Test passed"); testPassed = true; } else { console.error("Test failed"); } saucelabs.updateJob(driver.sessionID, { name: "Google search results page title test", passed: testPassed, }); }); });
Hier haben wir eine testPassed-Variable auf true oder false gesetzt, je nachdem, ob der Test bestanden wurde oder nicht, dann haben wir die Methode saucelabs.updateJob() verwendet, um die Details zu aktualisieren.
Wenn Sie jetzt zur Sauce Labs Automated Test dashboard Seite zurückkehren, sollten Sie sehen, dass Ihr neuer Job jetzt die aktualisierten Daten daran angehängt hat:

Ihr eigener Remote-Server
Wenn Sie keinen Dienst wie Sauce Labs oder BrowserStack nutzen möchten, können Sie immer Ihren eigenen Remote-Testserver einrichten. Sehen wir uns an, wie das geht.
-
Der Selenium-Remote-Server benötigt Java, um zu laufen. Laden Sie das neueste JDK für Ihre Plattform von der Java SE Downloads Seite herunter. Installieren Sie es, sobald es heruntergeladen ist.
-
Laden Sie als nächstes den neuesten Selenium Standalone-Server herunter — dieser fungiert als Proxy zwischen Ihrem Skript und den Browser-Treibern. Wählen Sie die aktuellste stabile Version (d.h. keine Beta), und wählen Sie aus der Liste eine Datei, die mit "selenium-server-standalone" beginnt. Wenn dies heruntergeladen ist, legen Sie es an einem sinnvollen Ort ab, wie z.B. in Ihrem Heimatverzeichnis. Wenn Sie den Standort nicht bereits zu Ihrem
PATHhinzugefügt haben, tun Sie dies jetzt (siehe Einrichtung von Selenium in Node). -
Führen Sie den Standalone-Server aus, indem Sie Folgendes in ein Terminal auf Ihrem Serverrechner eingeben
bashjava -jar selenium-server-standalone-3.0.0.jar(aktualisieren Sie den
.jarDateinamen) sodass er genau mit der Datei übereinstimmt, die Sie haben. -
Der Server wird unter
http://localhost:4444/wd/hublaufen — versuchen Sie jetzt dorthin zu gehen, um zu sehen, was Sie erhalten.
Nun, da wir den Server laufen haben, erstellen wir ein Demotest, der auf dem remote Selenium-Server laufen wird.
-
Erstellen Sie eine Kopie Ihrer
google_test.jsDatei und nennen Sie siegoogle_test_remote.js; legen Sie sie in Ihr Projektverzeichnis. -
Aktualisieren Sie die Zeile des Codes (die mit
const driver = …beginnt) sojsconst driver = new Builder() .forBrowser(Browser.FIREFOX) .usingServer("http://localhost:4444/wd/hub") .build(); -
Führen Sie Ihren Test aus und Sie sollten ihn ordnungsgemäß laufen sehen; diesmal jedoch laufen Sie ihn auf dem Standalone Server:
bashnode google_test_remote.js
Das ist ziemlich cool. Wir haben dies lokal getestet, aber Sie könnten das auf fast jedem Server zusammen mit den entsprechenden Browser-Treibern einrichten und dann Ihre Skripte damit verbinden, indem Sie die URL verwenden, die Sie sich entscheiden, zu veröffentlichen.
Integration von Selenium mit CI-Tools
Als weiterer Punkt ist es auch möglich, Selenium und verwandte Tools wie Sauce Labs mit Continuous Integration (CI)-Tools zu integrieren — das ist nützlich, da Sie Ihre Tests über ein CI-Tool ausführen und nur neue Änderungen in Ihr Code-Repository committen können, wenn die Tests bestehen.
Es ist nicht im Rahmen dieses Artikels, dieses Thema im Detail zu betrachten, aber wir empfehlen Ihnen, mit Travis CI anzufangen — das ist wahrscheinlich das einfachste CI-Tool, um loszulegen, und es hat eine gute Integration mit Web-Tools wie GitHub und Node.
Um loszulegen, siehe zum Beispiel:
- Travis CI für komplette Anfänger
- Ein Node.js Projekt bauen (mit Travis)
- Using Sauce Labs with Travis CI
Hinweis: Wenn Sie kontinuierliche Tests mit codeless automation durchführen möchten, können Sie Endtest oder TestingBot verwenden.
Zusammenfassung
Dieses Modul sollte Ihnen Spaß gemacht haben und sollte Ihnen einen ausreichenden Einblick in das Schreiben und Ausführen automatisierter Tests gegeben haben, damit Sie mit dem Schreiben Ihrer eigenen automatisierten Tests beginnen können.