Remote WebDriver

Selenium を使用すると、リモートコンピュータ上で Selenium Grid が実行されている場合、リモートコンピュータ上のブラウザを自動化できます。コードを実行するコンピュータはクライアントコンピュータと呼ばれ、ブラウザとドライバがあるコンピュータはリモートコンピュータ、またはエンドノードと呼ばれることもあります。Selenium テストをリモートコンピュータに指示するには、Remote WebDriver クラスを使用し、そのマシン上の Grid のポートを含む URL を渡す必要があります。Grid のさまざまな構成方法については、Grid のドキュメントを参照してください。

基本的な例

ドライバは、コマンドの送信先とリモートコンピュータで起動するブラウザを認識する必要があります。したがって、アドレスと options インスタンスの両方が必要です。

    ChromeOptions options = new ChromeOptions();
    driver = new RemoteWebDriver(gridUrl, options);
    options = webdriver.ChromeOptions()
    driver = webdriver.Remote(command_executor=server, options=options)
            var options = new ChromeOptions();
            driver = new RemoteWebDriver(GridUrl, options);
    options = Selenium::WebDriver::Options.chrome
    driver = Selenium::WebDriver.for :remote, url: grid_url, options: options

アップロード

ファイルのアップロードは、Remote WebDriver セッションではより複雑になります。アップロードするファイルはコードを実行しているコンピュータ上にある可能性が高いですが、リモートコンピュータ上のドライバは、そのローカルファイルシステム上の提供されたパスを探しているためです。解決策は、ローカルファイル検出機能を使用することです。これが設定されている場合、Selenium はファイルをバンドルし、リモートマシンに送信するため、ドライバはファイルへの参照を確認できます。一部のバインディングには、デフォルトで基本的なローカルファイル検出機能が含まれており、すべてがカスタムファイル検出機能を許可しています。

Java には、デフォルトでローカルファイル検出機能が含まれていないため、アップロードを行うには常に機能を追加する必要があります。
    ((RemoteWebDriver) driver).setFileDetector(new LocalFileDetector());
    WebElement fileInput = driver.findElement(By.cssSelector("input[type=file]"));
    fileInput.sendKeys(uploadFile.getAbsolutePath());
    driver.findElement(By.id("file-submit")).click();

Python は、デフォルトでローカルファイル検出機能をリモート WebDriver インスタンスに追加しますが、独自のクラスを作成することもできます。

    driver.file_detector = LocalFileDetector()
    file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
    file_input.send_keys(upload_file)
    driver.find_element(By.ID, "file-submit").click()
.NET は、デフォルトでローカルファイル検出機能をリモート WebDriver インスタンスに追加しますが、独自のクラスを作成することもできます。
            ((RemoteWebDriver)driver).FileDetector = new LocalFileDetector();
            IWebElement fileInput = driver.FindElement(By.CssSelector("input[type=file]"));
            fileInput.SendKeys(uploadFile);
            driver.FindElement(By.Id("file-submit")).Click();
Ruby は、デフォルトでローカルファイル検出機能をリモート WebDriver インスタンスに追加しますが、独自の lambda を作成することもできます。
    driver.file_detector = ->((filename, *)) { filename.include?('selenium') && filename }
    file_input = driver.find_element(css: 'input[type=file]')
    file_input.send_keys(upload_file)
    driver.find_element(id: 'file-submit').click

ダウンロード

Chrome、Edge、Firefox では、ダウンロードディレクトリの場所を設定できます。ただし、リモートコンピュータでこれを行う場合、場所はリモートコンピュータのローカルファイルシステム上にあります。Selenium を使用すると、ダウンロードを有効にして、これらのファイルをクライアントコンピュータに取得できます。

Grid でのダウンロードの有効化

クライアントに関係なく、ノードモードまたはスタンドアロンモードで Grid を起動するときは、フラグを追加する必要があります

--enable-managed-downloads true

クライアントでのダウンロードの有効化

Grid は、se:downloadsEnabled 機能を使用して、ブラウザの場所の管理を担当するかどうかを切り替えます。各バインディングには、これを設定するための options クラスのメソッドがあります。

    ChromeOptions options = new ChromeOptions();
    options.setEnableDownloads(true);
    driver = new RemoteWebDriver(gridUrl, options);
    options = webdriver.ChromeOptions()
    options.enable_downloads = True
    driver = webdriver.Remote(command_executor=server, options=options)
            ChromeOptions options = new ChromeOptions
            {
                EnableDownloads = true
            };

            driver = new RemoteWebDriver(GridUrl, options);
    options = Selenium::WebDriver::Options.chrome(enable_downloads: true)
    driver = Selenium::WebDriver.for :remote, url: grid_url, options: options

ダウンロード可能なファイルの一覧表示

Selenium はファイルのダウンロードが完了するのを待機していないことに注意してください。したがって、リストは、特定のセッションのディレクトリに現在存在するファイル名の即時スナップショットです。

    List<String> files = ((HasDownloads) driver).getDownloadableFiles();
    files = driver.get_downloadable_files()
            IReadOnlyList<string> names = ((RemoteWebDriver)driver).GetDownloadableFiles();
    files = driver.downloadable_files

ファイルのダウンロード

Selenium は、リスト内で提供されたファイルの名前を探し、提供されたターゲットディレクトリにダウンロードします。

    ((HasDownloads) driver).downloadFile(downloadableFile, targetDirectory);
    driver.download_file(downloadable_file, target_directory)
            ((RemoteWebDriver)driver).DownloadFile(downloadableFile, targetDirectory);
    driver.download_file(downloadable_file, target_directory)

ダウンロードしたファイルの削除

デフォルトでは、ダウンロードディレクトリは該当するセッションの終了時に削除されますが、セッション中にすべてのファイルを削除することもできます。

    ((HasDownloads) driver).deleteDownloadableFiles();
    driver.delete_downloadable_files()
            ((RemoteWebDriver)driver).DeleteDownloadableFiles();
    driver.delete_downloadable_files

ブラウザ固有の機能

ブラウザ は、そのブラウザでのみ利用可能な特別な機能を実装しています。Selenium バインディングのそれぞれは、リモートセッションでこれらの機能を使用するためのさまざまな方法を実装しています

Java では、Augmenter クラスを使用する必要があります。これにより、RemoteWebDriver で使用される機能に一致するすべてのインターフェースの実装を自動的にプルインできます

    driver = new Augmenter().augment(driver);

興味深いことに、RemoteWebDriverBuilder を使用すると、ドライバが自動的に拡張されるため、デフォルトですべての機能を取得するのに最適な方法です

        RemoteWebDriver.builder()
            .address(gridUrl)
            .oneOf(new ChromeOptions())
            .setCapability("ext:options", Map.of("key", "value"))
            .config(ClientConfig.defaultConfig())
            .build();
.NET は、リモートドライバで特定のブラウザに対して有効なコマンドを実行するためのカスタムコマンドエグゼキュータを使用します。
            var customCommandDriver = driver as ICustomDriverCommandExecutor;
            customCommandDriver.RegisterCustomDriverCommands(FirefoxDriver.CustomCommandDefinitions);

            var screenshotResponse = customCommandDriver
                .ExecuteCustomDriverCommand(FirefoxDriver.GetFullPageScreenshotCommand, null);
Ruby は、mixin を使用して、該当するブラウザ固有のメソッドを Remote WebDriver セッションに追加します。メソッドは常に正常に機能するはずです。

クライアントリクエストのトレース

この機能は、Java クライアントバインディング (ベータ版以降) でのみ使用できます。Remote WebDriver クライアントは、リクエストを Selenium Grid サーバーに送信し、サーバーは WebDriver にリクエストを渡します。HTTP リクエストのエンドツーエンドをトレースするには、サーバー側とクライアント側でトレースを有効にする必要があります。両端に、可視化フレームワークを指すトレースエクスポータのセットアップが必要です。デフォルトでは、トレースはクライアントとサーバーの両方で有効になっています。可視化フレームワーク Jaeger UI と Selenium Grid 4 のセットアップについては、目的のバージョンに合わせて Tracing Setup を参照してください。

クライアント側のセットアップについては、以下の手順に従ってください。

必要な依存関係の追加

トレースエクスポータ用の外部ライブラリのインストールは、Maven を使用して行うことができます。プロジェクトの pom.xml に opentelemetry-exporter-jaeger および grpc-netty 依存関係を追加します

  <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-exporter-jaeger</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-netty</artifactId>
      <version>1.35.0</version>
    </dependency>

クライアントの実行中に必要なシステムプロパティを追加/渡す

System.setProperty("otel.traces.exporter", "jaeger");
System.setProperty("otel.exporter.jaeger.endpoint", "http://localhost:14250");
System.setProperty("otel.resource.attributes", "service.name=selenium-java-client");

ImmutableCapabilities capabilities = new ImmutableCapabilities("browserName", "chrome");

WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), capabilities);

driver.get("http://www.google.com");

driver.quit();

  

目的の Selenium バージョンに必要な外部依存関係のバージョンに関する詳細については、Tracing Setup を参照してください。

詳細については、以下を参照してください。