WebDriverManager簡介
1. 引言
Java 中的 Web 自動化目的很簡單。本質上,就是打開瀏覽器並與網頁互動。然而,瀏覽器本身就帶來了一個直接的挑戰,即二進位相容性。具體來說,每個瀏覽器都需要一個對應的驅動程式二進位文件,而且該二進位檔案必須與已安裝的瀏覽器版本相符。即使是微小的不匹配也會導致運行時錯誤。 Java 中的WebDriverManager透過自動化基於 Java 的 Selenium 專案中的驅動程式管理來解決這個問題。
在本教學中,我們將介紹WebDriverManager 。首先,我們將探討該驅動程式的用途和必要性。隨後,我們將介紹如何在程式碼中包含WebDriverManager 。最後,我們將討論如何將WebDriverManager與不同的庫整合。
2. 什麼是WebDriverManager ?
WebDriverManager是一個 Java 函式庫,它可以自動解析、下載和設定 Selenium 所需的瀏覽器驅動程式。該庫無需手動管理二進位和系統屬性,而是以程式設計方式處理這些步驟。它會確定已安裝的瀏覽器版本,找到正確的驅動程式版本,並在必要時下載驅動程序,然後配置系統以便 Selenium 可以使用它。
值得注意的是,Selenium 內建了一個名為 Selenium Manager 的工具,它也能自動管理驅動程式。 Selenium Manager 免於了手動下載瀏覽器驅動程式的麻煩。不過, WebDriverManager是一個更強大的替代方案,它提供了更多功能,例如驅動程式快取控制、對 Docker 化瀏覽器的支援以及在複雜環境中的靈活性。
傳統的 Selenium 配置需要在程式碼中明確指定驅動程式路徑。例如,對於 Chrome 瀏覽器,我們使用setProperty設定驅動程式:
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
這種方法初期有效,但擴展性不佳。每次瀏覽器更新時,對應的驅動程式也需要手動更新。在 CI/CD 管線或團隊專案等共享環境中,維護一致的驅動程式版本會變得非常困難。此外,硬編碼的路徑會降低程式碼在不同系統間的可移植性。
此外, WebDriverManager透過動態處理驅動程式解析來減輕這種負擔。它還會將下載的驅動程式快取到本機,因此重複執行不會觸發不必要的下載。因此,測試執行速度更快,可靠性更高。
要使用WebDriverManager ,我們應該將其作為依賴項新增至 XML 檔案。
對於 Maven,我們使用<dependency>標籤:
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>6.3.3</version>
<scope>test</scope>
</dependency>
對於 Gradle,我們使用依賴項:
dependencies {
testImplementation("io.github.bonigarcia:webdrivermanager:6.3.3")
}
這樣可以確保在測試執行期間庫可用,而不會影響生產建置。
3. 使用WebDriverManager
在這個範例中,我們將介紹使用WebDriverManager進行簡單呼叫的基本方法:
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class SimpleWebDriver {
public static void main(String[] args) {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("https://google.com");
driver.quit();
}
}
在上面的範例中, WebDriverManager.chromedriver()專門為 Chrome 建立了一個管理器實例。此實例隱藏了處理ChromeDriver二進位所需的所有邏輯。
為了進一步解釋這段程式碼,呼叫.setup()會觸發解析過程:
- 檢查系統以偵測已安裝的 Chrome 版本。
- 確定相容的驅動程式版本。
- 如果尚未緩存,請下載正確的驅動程式版本。
- 設定對應的系統屬性
webdriver.chrome.driver。
因此,接下來的ChromeDriver()行無需任何手動設定即可正常運作。
此外, driver.get()開啟所需的 URL, driver.quit()關閉瀏覽器並釋放資源。
4. 將WebDriverManager與不同的庫一起使用
本節將探討WebDriverManager如何與JUnit整合以實現結構化測試執行,以及如何透過統一的介面支援多種瀏覽器。此外,我們還將探討它如何擴展到更高級的用例,例如通用驅動程式實例化和瀏覽器檢測。
4.1. 將WebDriverManager與 JUnit 結合使用
在專業的測試環境中,最佳實踐是每個測試類別只執行一次設定操作,而不是在每個測試之前重複執行WebDriverManager與 JUnit 5 的@BeforeAll註解結合使用時,就符合這種模式:
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class GoogleTest {
@BeforeAll
static void setupClass() {
WebDriverManager.chromedriver().setup();
}
@Test
void testGoogle() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.google.com");
driver.quit();
}
}
@BeforeAll註解確保 ` setupClass()方法在類別中的任何測試方法運行之前只執行一次。透過在此階段呼叫WebDriverManager.chromedriver().setup() ,框架會預先下載並配置正確的 ChromeDriver 二進位文件,這樣後續測試就不需要重複此過程。這避免了每個測試案例重複進行驅動程式解析。設定完成後,每個測試方法都可以專注於瀏覽器互動、導航到 URL 以及退出驅動程式。
4.2. 與多個瀏覽器協同工作
WebDriverManager的優點之一在於它能夠使用相同的模式管理多個瀏覽器的驅動程式。該程式庫無需為每個瀏覽器編寫單獨的設定邏輯,而是提供了專用的管理器方法,這些方法無論目標瀏覽器是什麼,都遵循相同的結構:
// Firefox
WebDriverManager.firefoxdriver().setup();
WebDriver driver = new org.openqa.selenium.firefox.FirefoxDriver();
// Microsoft Edge
WebDriverManager.edgedriver().setup();
WebDriver driver = new org.openqa.selenium.edge.EdgeDriver();
每個方法都會傳回一個特定於瀏覽器的管理器對象,該對象負責處理該瀏覽器的相應驅動程式二進位的解析和配置。
4.3. 通用管理器的使用
通用管理器的一個應用場景是,我們在編譯時不知道目標瀏覽器的類型。
例如,當瀏覽器類型作為執行時間參數傳遞,或從設定檔讀取時,我們使用WebDriverManager動態確定適當的管理器:
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class GenericExample {
public static void main(String[] args) {
WebDriverManager.getInstance(ChromeDriver.class).setup();
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
driver.quit();
}
}
在上面的程式碼中, getInstance(ChromeDriver.class) ` 呼叫接受一個驅動程式類別作為參數,並使用該類別在運行時識別並傳回正確的管理器。這意味著只需替換類別引用,同一行程式碼就可以為任何受支援的瀏覽器解析管理器。實際上,這在參數化或資料驅動的測試框架中非常有用,因為在這些框架中,瀏覽器類型是從外部注入的。
5. 結論
本文首先對WebDriverManager進行了基本介紹。我們也討論瞭如何將此驅動程式用於 Selenium 自動化測試。最後,我們探討如何將此驅動程式與各種程式庫結合使用。
總之, WebDriverManager透過消除手動驅動程式管理,簡化了 Selenium 自動化流程。專案無需再處理下載、版本相容性和配置等問題,只需呼叫一個方法即可完成所有設定任務。這有助於保持程式碼簡潔,減少運行時錯誤,並提高程式碼的可維護性。
原始碼可在 GitHub 上找到。