Selenium は、Web ブラウザーの自動化を可能にするさまざまなツールとライブラリをカプセル化した包括的なプロジェクトです。 Selenium は、特に W3C WebDriver 仕様のインフラストラクチャを提供します。これは、すべての主要な Web ブラウザと互換性のあるプラットフォームおよび言語に依存しないコーディング インターフェイスです。
このプロジェクトは、コードの開発と維持に何千時間も惜しみなく寄付してくれたボランティアの貢献者によって可能になりました。
Selenium のソース コードは、Apache 2.0 ライセンスに基づいて利用可能です。
この README は、プロジェクトへの貢献に関心のある開発者を対象としています。 Selenium の使用を開始したいと考えている人は、詳細な例と説明についてはユーザー マニュアルを参照してください。行き詰まった場合は、ヘルプを得る方法がいくつかあります。
プル リクエストを送信する前に CONTRIBUTING.md をお読みください。
これらは、Selenium に貢献するための独自のローカル開発環境を作成するための要件です。
Bazelisk は、 .bazelversion
ファイルで指定されたバージョンの Bazel を自動的にダウンロードし、すべてのコマンドライン引数を実際の Bazel バイナリに透過的に渡す Bazel ラッパーです。
Java JDK バージョン 17 以降 (例: Java 17 Temurin)
JAVA_HOME
環境変数を Java 実行可能ファイル (JRE ではなく JDK) の場所に設定します。
これをテストするには、コマンドjavac
を実行してみてください。 JRE のみがインストールされている場合、このコマンドは存在しません。コマンドライン オプションのリストが表示された場合は、JDK を適切に参照していることになります。
コマンドラインツールを含むXcode。 xcode-select --install
を使用して最新バージョンをインストールします。
Apple Silicon Mac 用のロゼッタ。 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"
Unix のようなコマンドを提供する代替シェル環境である MSYS2 をインストールします。
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 /f /v "LongPathsEnabled" /d "1"
ファイルselenium/.bazelrc.windows.local
を作成します。
ファイルに「startup --output_user_root=C:/tmp」を追加します。
Bazel が長いファイル パスの短い名前バージョンを作成できるようにします: fsutil 8dot3name set 0
bazel 出力をプロジェクト ディレクトリ内にネストするのではなくC:/tmp
に設定します。
次の 2 つのレジストリ コマンドを使用して、長いパスのサポートを有効にします。
プロジェクトに貢献したいが、独自のローカル開発環境をセットアップしたくない場合は、2 つの選択肢があります。
GitPod は、独自のローカル開発環境を作成するのではなく、すぐに使用できる環境を提供します。
代わりに、.devcontainer ディレクトリ内の devcontainer.json を使用して、Selenium の構築とテストに適した開発コンテナ (基本的には Docker コンテナ) を構築できます。 VS Code や IntelliJ IDEA などの IDE をサポートすると、そのようなコンテナーを作成する方法が示されます。
dev イメージ ディレクトリの Dockerfile を使用して、Selenium の構築とテストに適した Docker イメージを構築することもできます。
Selenium は、Bazel と呼ばれる一般的なビルド ツールを使用して構築されており、依存関係のダウンロードの管理、必要なバイナリの生成、パッケージのビルドとリリース、テストの実行を簡単に行うことができます。すべてを高速かつ効率的に実行できます。さらに詳しい説明については、Selenium の構築に関する Simon Stewart の記事を参照してください。
多くの場合、Bazel コマンドをカスタム Rake ラッパーでラップします。これらは./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 プラグインをインストールすることを強くお勧めします。
IntelliJ Bazel プラグインで Selenium を使用するには、リポジトリを Bazel プロジェクトとしてインポートし、スクリプト ディレクトリからプロジェクト ビュー ファイルを選択します。 Mac/Linux の場合はij.bazelproject
、Windows の場合はij-win.bazelproject
です。
lint には Google Java Format も使用するため、Google Java Formatter Plugin を使用すると便利です。動作させるにはいくつかの手順があるため、設定ドキュメントを読んでください。実行できる自動フォーマット スクリプトもあります: ./scripts/format.sh
Selenium は Maven で構築されていませんが、以下を使用してローカル Maven リポジトリ ( ~/.m2/repository
) にデプロイすることで、Maven がローカルで使用できるように Selenium の部分を構築してインストールできます。
./go java:インストール
依存関係はファイル maven_deps.bzl で定義されます。新しい依存関係を自動的に更新して固定するには、次を実行します。
./go java:update
以下を使用して、Python ディレクトリ内の生成されたファイルを更新することで、Python コードをローカルで実行できます。
./go py:更新
特定のコミットに基づいて Selenium をローカルにインストールするには、以下を使用できます。
./go py:インストール
irb
使用する代わりに、 bazel run //rb:console
使用してロードされたすべての gem を含む対話型 REPL を作成できます。
コードをデバッグしたい場合は、 debug
gem を使用して実行できます。
デバッガーを開始するコードにbinding.break
を追加します。
ruby_debug
構成を使用してテストを実行します: bazel test --config ruby_debug
。
デバッガーが起動したら、別のターミナルで次のコマンドを実行してデバッガーに接続します。
bazel-selenium/external/bundle/bin/rdbg -A
開発に RubyMine を使用したい場合は、Bazel アーティファクトを使用して構成できます。
rb/
メインプロジェクトディレクトリとして開きます。
必要に応じて、 bundle exec rake update
実行して、最新のアーティファクトを作成します。これが機能しない場合は、 selenium
(親) ディレクトリから./go rb:update
を実行します。
設定 / 言語とフレームワーク / Ruby SDK および Gemsで、 ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
を指す新しいインタープリターを追加します。
これで、あらゆる仕様を実行してデバッグできるようになります。デフォルトでは Chrome を使用しますが、以下の「Ruby テスト」セクションで指定されている環境変数を使用して変更できます。
Carbo.Bazel.lock
とCargo.lock
の同期を維持するには、次を実行します。
CARGO_BAZEL_REPIN=真のバゼル同期 --only=クレート
テストに特化したバゼル構成が多数あります。
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
- すべてのテストを 1 つずつ実行し、その出力をすぐに出力します
--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
単体テストを実行するには:
bazel test //java/... --test_size_filters=small
統合テストを実行するには:
bazel test //java/... --test_size_filters=medium
ブラウザテストを実行するには:
bazel test //java/... --test_size_filters=large --test_tag_filters=<ブラウザ>
特定のテストを実行するには:
bazel テスト //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
テストを実行するには、次のコマンドを実行します。
bazel テスト //javascript/node/selenium-webdriver:tests
--test_env
使用して、ブラウザ名をSELENIUM_BROWSER
として渡すことができます。
bazel テスト //javascript/node/selenium-webdriver:tests --test_env=SELENIUM_BROWSER=firefox
以下を使用して単体テストを実行します。
bazel テスト //py:unit
特定のブラウザでテストを実行するには:
bazel テスト //py:test-<ブラウザ名>
すべての Python テストを実行するには:
bazel テスト //py:all
テスト対象:
指示 | 説明 |
---|---|
bazel test //rb/... | ユニット、すべての統合テスト、および lint を実行する |
bazel test //rb:lint | RuboCop リンターを実行する |
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 ファイルから_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
- クロム、エッジ、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-version
.NET テストは現在、固定されたブラウザーでのみ機能するため、必ずそれを含めてください。
すべてのテストを次のように実行します。
bazel テスト //dotnet/test/common:AllTests --pin_browsers=true
クラス名を指定して、特定のテストを実行できます。
bazel テスト //dotnet/test/common:ElementFindingTest --pin_browsers=true
モジュールが複数のブラウザをサポートしている場合:
bazel テスト //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Rust テストは以下を使用して実行されます。
bazel テスト //rust/...
デフォルトでは、Bazel は現在の X サーバー UI でこれらのテストを実行します。必要に応じて、仮想サーバーまたはネストされた X サーバーで実行することもできます。
X サーバーXvfb :99
またはXnest :99
を実行します。
ウィンドウ マネージャーを実行します (例: DISPLAY=:99 jwm
興味のあるテストを実行します。
bazel テスト --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
仮想 X サーバーでテストを実行する簡単な方法は、Bazel の--run_under
機能を使用することです。
bazel test --run_under="xvfb-run -a" //java/...
API ドキュメントは次の場所にあります。
C#
JavaScript
ジャワ
パイソン
ルビー
特定の言語の API ドキュメントを更新するには: ./go
すべてのドキュメントを更新するには: ./go all:docs
JavaScript の生成は現在壊れていることに注意してください。
リリースを行うための完全なプロセスは wiki にあります。
リリースはビルドと公開を組み合わせたもので、多くの場合、複数の実行の調整と追加の処理が必要になります。 「構築」セクションで説明したように、これらの処理には./go
コマンドを使用して Rake タスクを使用します。これらの./go
コマンドには、構築されたアセットに関する必要な情報を提供する--stamp
引数が含まれています。
以下を使用してすべてをビルドしてリリースできます。
./すべてに行く:リリース
特定の言語をビルドしてリリースするには:
./go <言語>:リリース
Selenium EngFlow リポジトリにアクセスできる場合は、以下を使用してアセットをリモートで構築し、ローカルにダウンロードできます。
./go all:release['--config', 'release']