Selenium 是一個傘式項目,封裝了各種支援 Web 瀏覽器自動化的工具和函式庫。 Selenium 專門為 W3C WebDriver 規範提供了基礎設施——與所有主要 Web 瀏覽器相容的平台和語言中立的編碼介面。
該專案是由志願者貢獻者實現的,他們慷慨地貢獻了數千個小時的程式碼開發和維護時間。
Selenium 的原始碼在 Apache 2.0 許可證下提供。
本自述文件適用於有興趣為該專案做出貢獻的開發人員。對於想要開始使用 Selenium 的人,請查看我們的使用者手冊以取得詳細的範例和說明,如果您遇到困難,可以透過多種方式取得協助。
請在提交拉取請求之前閱讀 CONTRIBUTING.md。
這些是創建您自己的本地開發環境以對 Selenium 做出貢獻的要求。
Bazelisk,一個 Bazel 包裝器,它會自動下載.bazelversion
檔案中指定的 Bazel 版本,並透明地將所有命令列參數傳遞給真正的 Bazel 二進位檔案。
Java JDK 版本 17 或更高版本(例如 Java 17 Temurin)
將JAVA_HOME
環境變數設定為 Java 執行檔的位置(JDK 而不是 JRE)
若要測試這一點,請嘗試執行命令javac
。如果您只安裝了 JRE,則此命令將不存在。如果您遇到命令列選項列表,則表示您正確引用了 JDK。
Xcode 包括命令列工具。使用以下命令安裝最新版本: xcode-select --install
適用於 Apple Silicon Mac 的 Rosetta。將build --host_platform=//:rosetta
加入.bazelrc.local
檔案中。我們正在努力確保從長遠來看不需要這樣做。
幾年前,Jim Evans 發表了一篇關於為 Selenium .NET 語言綁定設定 Windows 開發環境的精彩文章;本文已過時,但其中包含更詳細的描述和螢幕截圖,某些人可能會覺得有用。
該腳本將確保開發人員環境完全準備好執行。 (除非另有提示,否則不會安裝或設定已存在的任何內容)
以管理員身分開啟 Powershell
執行: Set-ExecutionPolicy Bypass -Scope Process -Force
允許在進程中執行腳本
導覽至要複製 Selenium 的目錄,或已複製的 Selenium 儲存庫的父目錄
在 powershell 終端中下載並執行此腳本:[scripts/dev-environment-setup.ps1]`
一般允許在 Selenium 中執行腳本:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
啟用開發者模式:
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
安裝 MSYS2,這是一個提供類別 Unix 指令的替代 shell 環境
將 bin 目錄加入PATH
環境變數(例如"C:toolsmsys64usrbin"
)
將bash.exe
位置加入為BAZEL_SH
環境變數(例如, "C:toolsmsys64usrbinbash.exe"
)
安裝最新版本的 Visual Studio Community
使用 Visual Studio 安裝程式修改並新增「使用 C++ 進行桌面開發」工作負載
將 Visual C++ 建置工具安裝目錄位置新增至BAZEL_VC
環境變數(例如"C:Program FilesMicrosoft Visual Studio2022CommunityVC"
)
將 Visual C++ 建置工具版本新增至BAZEL_VC_FULL_VERSION
環境變數(可從"$BAZEL_VCToolsMSVC
中的目錄名稱找到)
新增對長檔名的支援(bazel 有很多嵌套目錄,可能超出 Windows 中的預設限制)
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1"reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem" /t REG_DWORD /HINESYSTEMCurrentControl SetControlFileSystem" /t REG_DWORD /
建立檔案selenium/.bazelrc.windows.local
將“startup --output_user_root=C:/tmp”加入到檔案中
允許 Bazel 建立長檔案路徑的短名稱版本: fsutil 8dot3name set 0
將 bazel 輸出設定為C:/tmp
而不是嵌套在專案目錄中:
使用以下 2 個註冊表命令啟用長路徑支援:
如果您想為該專案做出貢獻,但不想設定自己的本機開發環境,有兩種選擇。
GitPod 不是創建您自己的本機開發環境,而是為您提供了一個隨時可用的環境。
作為替代方案,您可以建立一個開發容器(基本上是一個 docker 容器),適合使用 .devcontainer 目錄中的 devcontainer.json 建置和測試 Selenium。支援 VS Code 或 IntelliJ IDEA 等 IDE 應該會告訴您如何建立這樣的容器。
您也可以使用 dev 映像檔目錄中的 Dockerfile 建置適合建置和測試 Selenium 的 Docker 映像。
Selenium 使用名為 Bazel 的通用構建工具構建,使我們能夠輕鬆管理依賴項下載、生成所需的二進位、構建和發布包以及執行測試;一切都以快速、有效率的方式進行。有關更詳細的討論,請閱讀 Simon Stewart 的有關構建 Selenium 的文章
通常我們使用自訂的 Rake 包裝器來包裝 Bazel 指令。這些是使用./go
命令運行的。
常見的 Bazel 指令有:
bazel build
— 評估依賴關係,編譯原始檔並為指定目標產生輸出檔。它用於建立可執行二進位檔案、庫或其他工件。
bazel run
— 建置目標然後執行它。它通常用於產生可執行二進位檔案的目標。
bazel test
— 在具有附加測試功能的上下文中建置並執行目標
bazel query
— 辨識所提供路徑的可用目標。
每個可以建構的模組都在BUILD.bazel
檔案中定義。要執行該模組,請以//
開頭引用它,然後包含定義它的檔案的相對路徑,然後是:
,然後是目標的名稱。例如,建立網格的目標名稱為executable-grid
,它在'selenium/java/src/org/openqa/selenium/grid/BAZEL.build'
檔案中定義。因此,要建立網格,您可以運行: bazel build //java/src/org/openqa/selenium/grid:executable-grid
。
Bazel 文件提供了有關各種快捷方式以及構建多個目標的所有方法的便捷指南,Selenium 經常使用這些方法。
為給定語言建構一切:
bazel build //<語言>/...
要僅建置網格,可以使用一個別名(日誌將顯示輸出 jar 所在的位置):
bazel建構網格
為了讓事情變得更簡單,可以使用這個./go
指令來建構每個綁定
./go <語言>:構建
團隊的大多數成員都使用 Intellij 進行日常編輯。如果您使用 IntelliJ,那麼我們強烈建議您安裝 Bazel IJ 插件,該插件在其自己的網站上有記錄。
若要將 Selenium 與 IntelliJ Bazel 外掛程式結合使用,請將儲存庫匯入為 Bazel 項目,然後從腳本目錄中選擇項目檢視檔案。 Mac/Linux 為ij.bazelproject
,Windows 為ij-win.bazelproject
。
我們也使用 Google Java Format 進行 linting,因此使用 Google Java Formatter 外掛程式很有用;有幾個步驟可以讓它工作,所以請閱讀他們的配置文件。還有一個可以運行的自動格式化腳本: ./scripts/format.sh
雖然 Selenium 不是使用 Maven 建置的,但您可以透過部署到本機 Maven 儲存庫 ( ~/.m2/repository
) 來建置和安裝供 Maven 在本機使用的 Selenium 片段,使用:
./去java:安裝
依賴關係在檔案 maven_deps.bzl 中定義。若要自動更新並固定新的依賴項,請執行:
./go java:更新
您可以透過使用以下命令更新 python 目錄中產生的檔案來在本機上執行 Python 程式碼:
./去py:更新
若要根據特定提交在本地安裝 Selenium,您可以使用:
./去py:安裝
您可以使用irb
建立一個包含所有載入的 gem 的互動式 REPL,而不是使用 irb : bazel run //rb:console
如果你想調試程式碼,可以透過debug
gem 來完成:
將binding.break
加入到您希望偵錯器啟動的程式碼中。
使用ruby_debug
配置來執行測試: bazel test --config ruby_debug
。
當偵錯器啟動時,在單獨的終端機中執行以下命令以連接到偵錯器:
bazel-selenium/外部/捆綁/bin/rdbg -A
如果你想使用 RubyMine 進行開發,你可以使用 Bazel 工件來設定它:
開啟rb/
作為主專案目錄。
根據需要執行bundle exec rake update
以建立最新的工件。如果這不起作用,請從selenium
(父)目錄執行./go rb:update
。
在Settings / Languages & Frameworks / Ruby SDK and Gems中新增指向../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
的新解釋器。
您現在應該能夠運行和調試任何規範。它預設使用 Chrome,但您可以使用下面 Ruby 測試部分中指定的環境變數來變更它。
若要保持Carbo.Bazel.lock
與Cargo.lock
同步,請執行:
CARGO_BAZEL_REPIN=true bazel 同步 --only=板條箱
有許多專門用於測試的 bazel 配置。
以下是我們在測試 Selenium 程式碼時使用的參數範例:
--pin_browsers
- 執行建置中定義的特定瀏覽器版本(版本定期更新)
--headless
- 以無頭模式執行瀏覽器(支援 Chrome、Edge 和 Firefox)
--flaky_test_attempts 3
- 重新執行失敗的測試最多 3 次
--local_test_jobs 1
- 控制測試的平行度
--cache_test_results=no
, -t-
- 停用測試結果快取並重新執行所有結果
--test_output all
- 列印測試的所有輸出,而不僅僅是錯誤
--test_output streamed
- 一項一項地運行所有測試並立即列印其輸出
--test_env FOO=bar
- 將額外的環境變數傳遞給測試進程
--run_under="xvfb-run -a"
- 在執行之前插入的前綴
Selenium 測試可以按大小過濾:
小-通常是在不開啟瀏覽器的情況下進行單元測試
大——通常是實際驅動瀏覽器的測試
中等-比簡單的單元測試更複雜的測試,但不能完全驅動瀏覽器
可以使用test_size_filters
參數來過濾它們,如下所示:
bazel test //<語言>/... --test_size_filters=small
測試也可以按標籤過濾,例如:
bazel test //<語言>/... --test_tag_filters=this,-not-this
運行單元測試:
巴澤爾測試 //java/... --test_size_filters=small
要運行整合測試:
巴澤爾測試 //java/... --test_size_filters=medium
要執行瀏覽器測試:
bazel 測試 //java/... --test_size_filters=large --test_tag_filters=<瀏覽器>
要執行特定測試:
巴澤爾測試 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
若要執行測試,請執行:
巴澤爾測試 //javascript/node/selenium-webdriver:tests
您可以使用--test_env
將瀏覽器名稱作為SELENIUM_BROWSER
傳遞。
巴澤爾測試 //javascript/node/selenium-webdriver:tests --test_env=SELENIUM_BROWSER=firefox
使用以下命令執行單元測試:
巴澤爾測試 //py:unit
若要使用特定瀏覽器執行測試:
bazel 測試 //py:test-<瀏覽器名稱>
運行所有 Python 測試:
巴澤爾測試 //py:all
測試目標:
命令 | 描述 |
---|---|
bazel test //rb/... | 運行單元、所有整合測試和 lint |
bazel test //rb:lint | 運行 RuboCop linter |
bazel test //rb/spec/... | 為所有瀏覽器運行單元和整合測試 |
bazel test //rb/spec/... --test_size_filters small | 運行單元測試 |
bazel test //rb/spec/unit/... | 運行單元測試 |
bazel test //rb/spec/... --test_size_filters large | 為所有瀏覽器執行整合測試 |
bazel test //rb/spec/integration/... | 為所有瀏覽器執行整合測試 |
bazel test //rb/spec/integration/... --test_tag_filters firefox | 僅針對本地 Firefox 執行整合測試 |
bazel test //rb/spec/integration/... --test_tag_filters firefox-remote | 僅對遠端 Firefox 執行整合測試 |
bazel test //rb/spec/integration/... --test_tag_filters firefox,firefox-remote | 為本地和遠端 Firefox 執行整合測試 |
Ruby 測試目標與刪除了_spec.rb
的規格檔案具有相同的名稱,因此您可以單獨執行它們。整合測試目標還有一個瀏覽器和遠端後綴來控制選擇哪個瀏覽器以及是否使用網格。
測試文件 | 測試目標 |
---|---|
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 |
支援的瀏覽器:
chrome
edge
firefox
firefox-beta
ie
safari
safari-preview
除了通用選項範例之外,這裡還有一些其他 Ruby 特定的範例:
--test_arg "-eTimeouts"
- 僅測試名稱包含「Timeouts」的規範
--test_arg "
- 傳遞任何額外的 RSpec 參數(請參閱bazel run @bundle//bin:rspec -- --help
)
支援與--test_env
一起使用的環境變數:
WD_SPEC_DRIVER
- 要測試的驅動程式;瀏覽器名稱或“遠端”(由 Bazel 設定)
WD_REMOTE_BROWSER
- 當WD_SPEC_DRIVER
為remote
時;要測試的瀏覽器的名稱(由 Bazel 設定)
WD_REMOTE_URL
- 用於遠端測試的已執行伺服器的 URL
DOWNLOAD_SERVER
- 當WD_REMOTE_URL
未設定時;是否下載並使用最新發布的伺服器版本進行遠端測試
DEBUG
- 開啟詳細調試
HEADLESS
- 適用於 chrome、edge 和 firefox;在無頭模式下執行測試
DISABLE_BUILD_CHECK
- 用於鍍鉻和邊緣;是否忽略驅動程式和瀏覽器版本不符(允許測試 Canary 版本)
CHROME_BINARY
- 測試特定 Chrome 瀏覽器的路徑
CHROMEDRIVER_BINARY
- 測試特定 ChromeDriver 的路徑
EDGE_BINARY
- 測試特定 Edge 瀏覽器的路徑
MSEDGEDRIVER_BINARY
- 測試特定 msedgedriver 的路徑
FIREFOX_BINARY
- 測試特定 Firefox 瀏覽器的路徑
GECKODRIVER_BINARY
- 測試特定 GeckoDriver 的路徑
要使用特定版本的 Ruby 運行,您可以在rb/.ruby-version
中或從命令列更改版本:
echo '' > rb/.ruby-版本
.NET 測試目前僅適用於固定瀏覽器,因此請確保包含該瀏覽器。
使用以下命令執行所有測試:
巴澤爾測試 //dotnet/test/common:AllTests --pin_browsers=true
您可以透過指定類別名稱來執行特定測試:
巴澤爾測試 //dotnet/test/common:ElementFindingTest --pin_browsers=true
如果模組支援多種瀏覽器:
巴澤爾測試 //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Rust 測試的運作方式為:
巴澤爾測試//rust/...
預設情況下,Bazel 在您目前的 X-server UI 中執行這些測試。如果您願意,您也可以在虛擬或巢狀 X 伺服器中執行它們。
運行 X 伺服器Xvfb :99
或Xnest :99
運行視窗管理器,例如DISPLAY=:99 jwm
運行您感興趣的測試:
巴澤爾測試 --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
在虛擬 X 伺服器中執行測試的簡單方法是使用 Bazel 的--run_under
功能:
bazel test --run_under="xvfb-run -a" //java/...
API 文件可以在這裡找到:
C#
JavaScript
爪哇
Python
紅寶石
要更新特定語言的 API 文件: ./go
若要更新所有文件: ./go all:docs
請注意,JavaScript 產生目前已損壞。
發布的完整流程可以在 wiki 中找到
發布是建置和發布的結合,通常需要協調多個執行和額外的處理。正如構建部分中所討論的,我們使用 Rake 任務和./go
命令來完成這些事情。這些./go
指令包含--stamp
參數,以提供有關所建置資產的必要資訊。
您可以使用以下方式建立和發布所有內容:
./全部執行:釋放
建構並發布特定語言:
./go <語言>:release
如果您有權存取 Selenium EngFlow 儲存庫,則可以使用下列命令遠端建置資產並在本機下載:
./go all:release['--config', 'release']