WebDriver (Selenium 2) 作為瀏覽器自動化測試的核心引擎,提供了簡潔、面向對象的 API,完全取代了 Selenium 1 的 JavaScript 注入模式,通過原生瀏覽器驅動直接控制瀏覽器,繞過 JS 沙箱限制,支援 Firefox、Chrome、IE、Edge、Safari 及移動端 (Appium/Selendroid),並可通過 Java、Python、C#、JS 等多語言調用。本文手把手教你搭建 Java + Maven + Eclipse/IDEA 環境,完成首個百度搜索自動化腳本。
| 組件 | 推薦版本 | 獲取途徑 |
|---|---|---|
| JDK | 11 / 17 LTS | Adoptium / Oracle |
| IDE | IntelliJ IDEA 2023+ / Eclipse | 官網 |
| Maven | 3.9+ | 官網 |
| Selenium Java | 4.15+ (最新穩定版) | Maven Central |
| 瀏覽器驅動 | 匹配瀏覽器主版本 | WebDriverManager 自動管理 |
現代最佳實踐:不再手動下載 JAR/驅動,直接在 pom.xml 引入 Selenium 依賴,並使用 WebDriverManager 自動下載匹配版本的驅動:
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.15.0</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
</dependencies>
import org.junit.jupiter.api.*;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.*;
class BaiduSearchTest {
private WebDriver driver;
private WebDriverWait wait;
@BeforeEach
void setUp() {
// WebDriverManager 自動下載匹配 Chrome 版本的 chromedriver
io.github.bonigarcia.wdm.WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
// 顯式等待:最長 10 秒,每 500ms 轮詢
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
void searchEuroCup() {
driver.get("https://www.baidu.com");
// 定位搜索框並輸入
WebElement searchBox = wait.until(d -> d.findElement(By.name("wd")));
searchBox.sendKeys("歐洲杯");
// 定位並點擊搜索按鈕
WebElement searchBtn = wait.until(d -> d.findElement(By.id("su")));
searchBtn.click();
// 斷言:結果頁標題包含關鍵詞
wait.until(d -> d.getTitle().contains("歐洲杯"));
assertTrue(driver.getTitle().contains("歐洲杯"));
}
@AfterEach
void tearDown() {
if (driver != null) driver.quit();
}
}
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)),全局生效,僅針對 findElement,靈活性差。WebDriverWait + ExpectedConditions,針對特定條件 (可見、可點擊、文本出現等) 精準等待,支援自定義邏輯。FluentWait,可自定義輪詢間隔、忽略異常類型,最靈活。id > name > cssSelector > xpath > linkText/partialLinkText > tagName/className。優先使用穩定唯一的 id/name,複雜結構用 CSS Selector,最後才用 XPath。
public class BaiduHomePage {
private final WebDriver driver;
private final By searchBox = By.name("wd");
private final By searchBtn = By.id("su");
public BaiduHomePage(WebDriver driver) { this.driver = driver; }
public BaiduResultPage search(String keyword) {
driver.findElement(searchBox).sendKeys(keyword);
driver.findElement(searchBtn).click();
return new BaiduResultPage(driver);
}
}
將頁面元素與操作封裝,測試用例只調用業務方法,實現「測試代碼與頁面結構解耦」,便於維護。
| 現象 | 原因 | 解決方案 |
|---|---|---|
| driver 版本不匹配報錯 | 瀏覽器自動更新導致主版本號變化 | 使用 WebDriverManager 自動管理 |
| 元素找不到 | 頁面未加載完成 / iframe / Shadow DOM / 動態渲染 | 顯式等待 + 切換 iframe + JS 定位 |
| 點擊被攔截 | 元素被遮擋 / 未滾動到可視區 | JS 滾動 ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView()", el) + 顯式等待可點擊 |
| 中文輸入亂碼 | 編碼問題 | 確保源文件 UTF-8,JVM 參數 -Dfile.encoding=UTF-8 |
ChromeOptions args.add("--headless=new"),CI/CD 環境無界面運行。TakesScreenshot + Allure Report 生成可視化測試報告。PerformanceTiming API 獲取頁面加載關鍵指標 (FP/FCP/LCP/TTI)。Selenium WebDriver 以「標準化 API + 原生驅動 + 多語言支援」成為 Web UI 自動化測試的事實標準。掌握 環境自動化管理、顯式等待策略、POM 設計模式、常見異常排查 四大核心技能,即可編寫穩定、可維護、可擴展的自動化測試套件。