遠端 WebDriver

如果遠端電腦上執行 Selenium Grid,Selenium 可讓您自動化遠端電腦上的瀏覽器。執行程式碼的電腦稱為用戶端電腦,而具有瀏覽器和驅動程式的電腦稱為遠端電腦,有時也稱為終端節點。若要將 Selenium 測試導向遠端電腦,您需要使用 Remote WebDriver 類別並傳遞 URL,包括該機器上 Grid 的埠號。有關 Grid 各種組態方式,請參閱 Grid 文件。

基本範例

驅動程式需要知道將命令傳送到哪裡,以及在遠端電腦上啟動哪個瀏覽器。因此,需要位址和選項實例。

    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 功能來切換是否負責管理瀏覽器位置。每個繫結在選項類別中都有一個方法來設定此功能。

    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 繫結都實作了在 Remote Session 中使用這些功能的不同方式

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 用戶端繫結(Beta 版或更新版本)。Remote WebDriver 用戶端將請求傳送到 Selenium Grid 伺服器,然後伺服器將請求傳遞到 WebDriver。應在伺服器和用戶端啟用追蹤,以端對端追蹤 HTTP 請求。兩端都應設定指向視覺化框架的追蹤匯出器。預設情況下,用戶端和伺服器都已啟用追蹤。若要設定視覺化框架 Jaeger UI 和 Selenium Grid 4,請參閱追蹤設定以取得所需版本。

如需用戶端設定,請依照下列步驟操作。

新增必要的依賴項

可以使用 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 版本所需的外部依賴項版本,請參閱追蹤設定

更多資訊請參閱: