Selenium ist ein Dachprojekt, das eine Vielzahl von Tools und Bibliotheken umfasst, die die Automatisierung von Webbrowsern ermöglichen. Selenium stellt speziell eine Infrastruktur für die W3C-WebDriver-Spezifikation bereit – eine plattform- und sprachneutrale Codierungsschnittstelle, die mit allen gängigen Webbrowsern kompatibel ist.
Das Projekt wird durch ehrenamtliche Mitarbeiter ermöglicht, die großzügig Tausende von Stunden in die Codeentwicklung und -pflege gespendet haben.
Der Quellcode von Selenium wird unter der Apache 2.0-Lizenz zur Verfügung gestellt.
Diese README-Datei richtet sich an Entwickler, die daran interessiert sind, zum Projekt beizutragen. Wenn Sie mit der Verwendung von Selenium beginnen möchten, lesen Sie bitte unser Benutzerhandbuch mit detaillierten Beispielen und Beschreibungen. Wenn Sie nicht weiterkommen, gibt es mehrere Möglichkeiten, Hilfe zu erhalten.
Bitte lesen Sie CONTRIBUTING.md, bevor Sie Ihre Pull-Anfragen einreichen.
Dies sind die Voraussetzungen, um Ihre eigene lokale Entwicklungsumgebung zu erstellen und zu Selenium beizutragen.
Bazelisk, ein Bazel-Wrapper, der automatisch die in .bazelversion
Datei angegebene Version von Bazel herunterlädt und alle Befehlszeilenargumente transparent an die echte Bazel-Binärdatei weiterleitet.
Java JDK Version 17 oder höher (z. B. Java 17 Temurin)
Setzen Sie die Umgebungsvariable JAVA_HOME
auf den Speicherort der ausführbaren Java-Datei (das JDK, nicht die JRE).
Um dies zu testen, führen Sie den Befehl javac
aus. Dieser Befehl ist nicht vorhanden, wenn Sie nur die JRE installiert haben. Wenn Sie auf eine Liste mit Befehlszeilenoptionen stoßen, verweisen Sie richtig auf das JDK.
Xcode einschließlich der Befehlszeilentools. Installieren Sie die neueste Version mit: xcode-select --install
Rosetta für Apple Silicon Macs. Fügen Sie build --host_platform=//:rosetta
zur Datei .bazelrc.local
hinzu. Wir arbeiten daran, sicherzustellen, dass dies auf lange Sicht nicht erforderlich ist.
Vor einigen Jahren veröffentlichte Jim Evans einen großartigen Artikel über das Einrichten einer Windows-Entwicklungsumgebung für die Selenium .NET-Sprachbindungen; Dieser Artikel ist veraltet, enthält jedoch ausführlichere Beschreibungen und Screenshots, die für einige Leute nützlich sein könnten.
Dieses Skript stellt eine vollständig ausführungsbereite Entwicklerumgebung sicher. (Es wird nichts installiert oder eingestellt, was bereits vorhanden ist, es sei denn, Sie werden dazu aufgefordert.)
Öffnen Sie Powershell als Administrator
Ausführen: Set-ExecutionPolicy Bypass -Scope Process -Force
, um die Ausführung des Skripts im Prozess zu ermöglichen
Navigieren Sie zu dem Verzeichnis, in dem Sie Selenium klonen möchten, oder zum übergeordneten Verzeichnis eines bereits geklonten Selenium-Repositorys
Laden Sie dieses Skript herunter und führen Sie es im Powershell-Terminal aus: [scripts/dev-environment-setup.ps1]`
Erlauben Sie die Ausführung von Skripten in Selenium im Allgemeinen:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Entwicklermodus aktivieren:
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
Installieren Sie MSYS2, eine alternative Shell-Umgebung, die Unix-ähnliche Befehle bereitstellt
Bin-Verzeichnis zur PATH
Umgebungsvariablen hinzufügen (z. B. "C:toolsmsys64usrbin"
)
Fügen Sie den Speicherort bash.exe
als Umgebungsvariable BAZEL_SH
hinzu (z. B. "C:toolsmsys64usrbinbash.exe"
).
Installieren Sie die neueste Version der Visual Studio Community
Verwenden Sie das Visual Studio-Installationsprogramm, um die Workload „Desktop-Entwicklung mit C++“ zu ändern und hinzuzufügen
Fügen Sie den Speicherort des Installationsverzeichnisses für Visual C++-Build-Tools zur Umgebungsvariablen BAZEL_VC
hinzu (z. B. "C:Program FilesMicrosoft Visual Studio2022CommunityVC"
).
Fügen Sie der Umgebungsvariablen BAZEL_VC_FULL_VERSION
die Visual C++ Build-Tools-Version hinzu (dies kann anhand des Verzeichnisnamens in "$BAZEL_VCToolsMSVC
ermittelt werden).
Unterstützung für lange Dateinamen hinzufügen (Bazel verfügt über viele verschachtelte Verzeichnisse, die die Standardgrenzen in Windows überschreiten können)
reg add „HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor“ /t REG_DWORD /f /v „DisableUNCCheck“ /d „1“reg add „HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem“ /t REG_DWORD /f /v „LongPathsEnabled“ /d „1“
Erstellen Sie eine Datei selenium/.bazelrc.windows.local
Fügen Sie „startup --output_user_root=C:/tmp“ zur Datei hinzu
Erlauben Sie Bazel, Kurznamenversionen langer Dateipfade zu erstellen: fsutil 8dot3name set 0
Legen Sie die Bazel-Ausgabe auf C:/tmp
fest, anstatt sie im Projektverzeichnis zu verschachteln:
Aktivieren Sie die Unterstützung für lange Pfade mit diesen beiden Registrierungsbefehlen:
Wenn Sie zum Projekt beitragen, aber keine eigene lokale Entwicklungsumgebung einrichten möchten, stehen Ihnen zwei Alternativen zur Verfügung.
Anstatt Ihre eigene lokale Entwicklungsumgebung zu erstellen, stellt GitPod eine gebrauchsfertige Umgebung für Sie bereit.
Alternativ können Sie mithilfe der devcontainer.json im .devcontainer-Verzeichnis einen Dev-Container erstellen – im Grunde ein Docker-Container –, der zum Erstellen und Testen von Selenium geeignet ist. Unterstützende IDEs wie VS Code oder IntelliJ IDEA sollten Ihnen zeigen, wie ein solcher Container erstellt werden kann.
Sie können auch ein Docker-Image erstellen, das zum Erstellen und Testen von Selenium geeignet ist, indem Sie die Docker-Datei im Dev-Image-Verzeichnis verwenden.
Selenium wird mit einem gängigen Build-Tool namens Bazel erstellt, damit wir Abhängigkeits-Downloads einfach verwalten, erforderliche Binärdateien generieren, Pakete erstellen und veröffentlichen sowie Tests ausführen können. alles schnell und effizient. Für eine ausführlichere Diskussion lesen Sie Simon Stewarts Artikel über den Bau von Selen
Oft verpacken wir Bazel-Befehle mit unserem benutzerdefinierten Rake-Wrapper. Diese werden mit dem Befehl ./go
ausgeführt.
Die gebräuchlichen Bazel-Befehle sind:
bazel build
– wertet Abhängigkeiten aus, kompiliert Quelldateien und generiert Ausgabedateien für das angegebene Ziel. Es wird zum Erstellen ausführbarer Binärdateien, Bibliotheken oder anderer Artefakte verwendet.
bazel run
– erstellt das Ziel und führt es dann aus. Es wird normalerweise für Ziele verwendet, die ausführbare Binärdateien erzeugen.
bazel test
– erstellt und führt das Ziel in einem Kontext mit zusätzlichen Testfunktionen aus
bazel query
– identifiziert verfügbare Ziele für den angegebenen Pfad.
Jedes Modul, das erstellt werden kann, ist in einer BUILD.bazel
Datei definiert. Um das Modul auszuführen, verweisen Sie darauf, beginnend mit //
, geben dann den relativen Pfad zu der Datei an, die es definiert, dann :
und dann den Namen des Ziels. Das Ziel zum Erstellen des Grids heißt beispielsweise executable-grid
und ist in der Datei 'selenium/java/src/org/openqa/selenium/grid/BAZEL.build'
definiert. Um das Grid zu erstellen, würden Sie also Folgendes ausführen: bazel build //java/src/org/openqa/selenium/grid:executable-grid
.
Die Bazel-Dokumentation enthält eine praktische Anleitung für verschiedene Verknüpfungen und alle Möglichkeiten zum Erstellen mehrerer Ziele, die Selenium häufig verwendet.
Um alles für eine bestimmte Sprache zu erstellen:
bazel build ///...
Um nur das Raster zu erstellen, muss ein Aliasname verwendet werden (im Protokoll wird angezeigt, wo sich das Ausgabe-JAR befindet):
Bazel-Build-Raster
Zur Vereinfachung ist das Erstellen jeder Bindung mit diesem ./go
möglich
./go:build
Der Großteil des Teams nutzt Intellij für die tägliche Bearbeitung. Wenn Sie mit IntelliJ arbeiten, empfehlen wir dringend die Installation des Bazel IJ-Plugins, das auf einer eigenen Website dokumentiert ist.
Um Selenium mit dem IntelliJ Bazel-Plugin zu verwenden, importieren Sie das Repository als Bazel-Projekt und wählen Sie die Projektansichtsdatei aus dem Skriptverzeichnis aus. ij.bazelproject
für Mac/Linux und ij-win.bazelproject
für Windows.
Wir verwenden auch das Google Java Format zum Linting, daher ist die Verwendung des Google Java Formatter Plugins nützlich; Es sind ein paar Schritte erforderlich, um es zum Laufen zu bringen. Lesen Sie daher die Konfigurationsdokumentation. Es gibt auch ein Skript zur automatischen Formatierung, das ausgeführt werden kann: ./scripts/format.sh
Während Selenium nicht mit Maven erstellt wird, können Sie die Selenium-Teile für Maven zur lokalen Verwendung erstellen und installieren, indem Sie sie in Ihrem lokalen Maven-Repository ( ~/.m2/repository
) bereitstellen, indem Sie Folgendes verwenden:
./go java:install
Abhängigkeiten werden in der Datei maven_deps.bzl definiert. Führen Sie Folgendes aus, um neue Abhängigkeiten automatisch zu aktualisieren und anzuheften:
./go java:update
Sie können Python-Code lokal ausführen, indem Sie generierte Dateien im Python-Verzeichnis aktualisieren, indem Sie Folgendes verwenden:
./go py:update
Um Selenium basierend auf einem bestimmten Commit lokal zu installieren, können Sie Folgendes verwenden:
./go py:install
Anstatt irb
zu verwenden, können Sie eine interaktive REPL mit allen geladenen Gems erstellen, indem Sie Folgendes verwenden: bazel run //rb:console
Wenn Sie Code debuggen möchten, können Sie dies über debug
gem tun:
Fügen Sie binding.break
dem Code hinzu, an dem der Debugger starten soll.
Führen Sie Tests mit ruby_debug
-Konfiguration aus: bazel test --config ruby_debug
.
Wenn der Debugger startet, führen Sie Folgendes in einem separaten Terminal aus, um eine Verbindung zum Debugger herzustellen:
bazel-selenium/external/bundle/bin/rdbg -A
Wenn Sie RubyMine für die Entwicklung verwenden möchten, können Sie es mithilfe von Bazel-Artefakten konfigurieren:
Öffnen Sie rb/
als Hauptprojektverzeichnis.
Führen Sie bei Bedarf bundle exec rake update
aus, um aktuelle Artefakte zu erstellen. Wenn dies nicht funktioniert, führen Sie ./go rb:update
aus dem selenium
-Verzeichnis (übergeordnet) aus.
Fügen Sie unter Einstellungen / Sprachen & Frameworks / Ruby SDK und Gems einen neuen Interpreter hinzu, der auf ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
verweist.
Sie sollten nun in der Lage sein, jede Spezifikation auszuführen und zu debuggen. Es verwendet standardmäßig Chrome, Sie können es jedoch mithilfe von Umgebungsvariablen ändern, die im Abschnitt „Ruby-Tests“ unten angegeben sind.
Um Carbo.Bazel.lock
mit Cargo.lock
synchron zu halten, führen Sie Folgendes aus:
CARGO_BAZEL_REPIN=true bazel sync --only=crates
Es gibt eine Reihe spezieller Bazel-Konfigurationen zum Testen.
Hier sind Beispiele für Argumente, die wir beim Testen des Selenium-Codes verwenden:
--pin_browsers
– bestimmte im Build definierte Browserversionen ausführen (Versionen werden regelmäßig aktualisiert)
--headless
– Browser im Headless-Modus ausführen (unterstützt von Chrome, Edge und Firefox)
--flaky_test_attempts 3
– fehlgeschlagene Tests bis zu dreimal erneut ausführen
--local_test_jobs 1
– steuert die Parallelität von Tests
--cache_test_results=no
, -t-
– Deaktiviert die Zwischenspeicherung der Testergebnisse und führt sie alle erneut aus
--test_output all
– druckt alle Ausgaben der Tests, nicht nur Fehler
--test_output streamed
– führt alle Tests einzeln aus und druckt die Ausgabe sofort aus
--test_env FOO=bar
– Übergibt zusätzliche Umgebungsvariable an den Testprozess
--run_under="xvfb-run -a"
– Präfix zum Einfügen vor der Ausführung
Selentests können nach Größe gefiltert werden:
klein – typischerweise Unit-Tests, bei denen kein Browser geöffnet ist
groß – normalerweise Tests, die tatsächlich einen Browser steuern
mittel – Tests, die aufwändiger sind als einfache Unit-Tests, die jedoch einen Browser nicht vollständig steuern
Diese können mit dem Argument test_size_filters
wie folgt gefiltert werden:
bazel test ///... --test_size_filters=small
Tests können auch nach Tags gefiltert werden wie:
bazel test ///... --test_tag_filters=this,-not-this
So führen Sie Unit-Tests durch:
bazel test //java/... --test_size_filters=small
So führen Sie Integrationstests aus:
bazel test //java/... --test_size_filters=medium
So führen Sie Browsertests durch:
bazel test //java/... --test_size_filters=large --test_tag_filters=
So führen Sie einen bestimmten Test aus:
Bazel-Test //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
Um die Tests auszuführen, führen Sie Folgendes aus:
Bazel-Test //javascript/node/selenium-webdriver:tests
Sie können --test_env
verwenden, um den Browsernamen als SELENIUM_BROWSER
zu übergeben.
bazel test //javascript/node/selenium-webdriver:tests --test_env=SELENIUM_BROWSER=firefox
Führen Sie Unit-Tests durch mit:
Bazel-Test //py:unit
So führen Sie Tests mit einem bestimmten Browser durch:
bazel test //py:test-
So führen Sie alle Python-Tests aus:
Bazel-Test //py:all
Testziele:
Befehl | Beschreibung |
---|---|
bazel test //rb/... | Führen Sie die Einheit, alle Integrationstests und Lint aus |
bazel test //rb:lint | Führen Sie RuboCop-Linter aus |
bazel test //rb/spec/... | Führen Sie Unit- und Integrationstests für alle Browser durch |
bazel test //rb/spec/... --test_size_filters small | Führen Sie Unit-Tests durch |
bazel test //rb/spec/unit/... | Führen Sie Unit-Tests durch |
bazel test //rb/spec/... --test_size_filters large | Führen Sie Integrationstests für alle Browser durch |
bazel test //rb/spec/integration/... | Führen Sie Integrationstests für alle Browser durch |
bazel test //rb/spec/integration/... --test_tag_filters firefox | Führen Sie Integrationstests nur für lokalen Firefox durch |
bazel test //rb/spec/integration/... --test_tag_filters firefox-remote | Führen Sie Integrationstests nur für Remote-Firefox aus |
bazel test //rb/spec/integration/... --test_tag_filters firefox,firefox-remote | Führen Sie Integrationstests für lokalen und Remote-Firefox durch |
Ruby-Testziele haben denselben Namen wie die Spezifikationsdatei, wobei _spec.rb
entfernt wurde, sodass Sie sie einzeln ausführen können. Integrationstestziele verfügen außerdem über einen Browser und ein Remote-Suffix, um zu steuern, welcher Browser ausgewählt werden soll und ob Grid verwendet werden soll.
Testdatei | Testziel |
---|---|
rb/spec/unit/selenium/webdriver/proxy_spec.rb | //rb/spec/unit/selenium/webdriver:proxy |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome-remote |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox-remote |
Unterstützte Browser:
chrome
edge
firefox
firefox-beta
ie
safari
safari-preview
Zusätzlich zu den allgemeinen Optionenbeispielen finden Sie hier einige zusätzliche Ruby-spezifische Beispiele:
--test_arg "-eTimeouts"
– testet nur Spezifikationen, deren Name „Timeouts“ enthält.
--test_arg "
– Übergibt alle zusätzlichen RSpec-Argumente (siehe bazel run @bundle//bin:rspec -- --help
)
Unterstützte Umgebungsvariablen zur Verwendung mit --test_env
:
WD_SPEC_DRIVER
– der zu testende Treiber; entweder der Browsername oder „remote“ (wird von Bazel festgelegt)
WD_REMOTE_BROWSER
– wenn WD_SPEC_DRIVER
remote
ist; der Name des zu testenden Browsers (wird von Bazel festgelegt)
WD_REMOTE_URL
– URL eines bereits laufenden Servers zur Verwendung für Remote-Tests
DOWNLOAD_SERVER
– wenn WD_REMOTE_URL
nicht festgelegt ist; ob die zuletzt veröffentlichte Serverversion heruntergeladen und für Remote-Tests verwendet werden soll
DEBUG
– aktiviert das ausführliche Debuggen
HEADLESS
– für Chrome, Edge und Firefox; Führt Tests im Headless-Modus durch
DISABLE_BUILD_CHECK
– für Chrome und Edge; ob Treiber- und Browserversionskonflikte ignoriert werden sollen (ermöglicht das Testen von Canary-Builds)
CHROME_BINARY
– Pfad zum Testen eines bestimmten Chrome-Browsers
CHROMEDRIVER_BINARY
– Pfad zum Testen eines bestimmten ChromeDriver
EDGE_BINARY
– Pfad zum Testen eines bestimmten Edge-Browsers
MSEDGEDRIVER_BINARY
– Pfad zum Testen eines bestimmten msedgedriver
FIREFOX_BINARY
– Pfad zum Testen eines bestimmten Firefox-Browsers
GECKODRIVER_BINARY
– Pfad zum Testen eines bestimmten GeckoDriver
Um mit einer bestimmten Ruby-Version zu arbeiten, können Sie die Version in rb/.ruby-version
oder über die Befehlszeile ändern:
echo '' > rb/.ruby-version
.NET-Tests funktionieren derzeit nur mit angehefteten Browsern, also stellen Sie sicher, dass Sie diese einschließen.
Führen Sie alle Tests aus mit:
Bazel-Test //dotnet/test/common:AllTests --pin_browsers=true
Sie können bestimmte Tests ausführen, indem Sie den Klassennamen angeben:
bazel test //dotnet/test/common:ElementFindingTest --pin_browsers=true
Wenn das Modul mehrere Browser unterstützt:
bazel test //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Rosttests werden durchgeführt mit:
Bazel-Test //Rost/...
Standardmäßig führt Bazel diese Tests in Ihrer aktuellen X-Server-Benutzeroberfläche aus. Wenn Sie möchten, können Sie sie alternativ auf einem virtuellen oder verschachtelten X-Server ausführen.
Führen Sie den X-Server Xvfb :99
oder Xnest :99
aus
Führen Sie einen Fenstermanager aus, zum Beispiel DISPLAY=:99 jwm
Führen Sie die Tests durch, die Sie interessieren:
bazel test --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
Eine einfache Möglichkeit, Tests auf einem virtuellen X-Server auszuführen, ist die Verwendung --run_under
Funktionalität von Bazel:
bazel test --run_under="xvfb-run -a" //java/...
Die API-Dokumentation finden Sie hier:
C#
JavaScript
Java
Python
Rubin
So aktualisieren Sie die API-Dokumentation für eine bestimmte Sprache: ./go
So aktualisieren Sie die gesamte Dokumentation: ./go all:docs
Beachten Sie, dass die JavaScript-Generierung derzeit unterbrochen ist.
Den vollständigen Prozess zum Erstellen einer Veröffentlichung finden Sie im Wiki
Das Freigeben ist eine Kombination aus Erstellen und Veröffentlichen, was häufig die Koordination mehrerer Ausführungen und zusätzliche Verarbeitung erfordert. Wie im Abschnitt „Erstellen“ besprochen, verwenden wir für diese Dinge Rake-Aufgaben mit dem Befehl ./go
. Diese ./go
enthalten das Argument --stamp
, um die notwendigen Informationen über das erstellte Asset bereitzustellen.
Sie können alles erstellen und veröffentlichen mit:
./go all:release
So erstellen und veröffentlichen Sie eine bestimmte Sprache:
./go:Veröffentlichung
Wenn Sie Zugriff auf das Selenium EngFlow-Repository haben, können Sie die Assets remote erstellen und lokal herunterladen lassen, indem Sie Folgendes verwenden:
./go all:release['--config', 'release']