遠端 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 會將檔案捆綁並傳送到遠端機器,以便驅動程式可以看到對它的參考。某些繫結預設包含基本的本機檔案偵測器,並且所有繫結都允許自訂檔案偵測器。
((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()
((RemoteWebDriver)driver).FileDetector = new LocalFileDetector();
IWebElement fileInput = driver.FindElement(By.CssSelector("input[type=file]"));
fileInput.SendKeys(uploadFile);
driver.FindElement(By.Id("file-submit")).Click();
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();
var customCommandDriver = driver as ICustomDriverCommandExecutor;
customCommandDriver.RegisterCustomDriverCommands(FirefoxDriver.CustomCommandDefinitions);
var screenshotResponse = customCommandDriver
.ExecuteCustomDriverCommand(FirefoxDriver.GetFullPageScreenshotCommand, null);
追蹤用戶端請求
此功能僅適用於 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 版本所需的外部依賴項版本,請參閱追蹤設定。
更多資訊請參閱:
- OpenTelemetry: https://opentelemetry.io
- 設定 OpenTelemetry: https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure
- Jaeger: https://jaeger.dev.org.tw
- Selenium Grid 可觀察性