前言

这里只是是一本selenium的简单修炼手册


一、Selenium 概述

1.1 什么是 Selenium

Selenium 是一个用于Web应用自动化测试的开源工具套件,支持多种浏览器和编程语言。核心组件包括:

  • Selenium WebDriver:浏览器自动化框架
  • Selenium IDE:录制/回放测试工具
  • Selenium Grid:分布式测试执行环境

1.2 核心特性

  • 跨浏览器测试(Chrome, Firefox, Edge, Safari等)
  • 多语言支持(Java, Python, C#, JavaScript, Ruby)
  • 跨平台兼容(Windows, macOS, Linux)
  • 丰富的定位策略(ID, XPath, CSS等)
  • 与主流测试框架集成(JUnit, TestNG, PyTest等)

二、Selenium WebDriver 核心组件

2.1 浏览器驱动

浏览器 驱动名称 下载地址
Chrome ChromeDriver chromedriver.chromium.org
Firefox GeckoDriver github.com/mozilla/geckodriver
Edge Microsoft Edge Driver developer.microsoft.com
Safari Safari Driver 内置(需开启开发者模式)

2.2 WebDriver 架构

1
测试脚本 → WebDriver API → 浏览器驱动 → 真实浏览器

2.3 基本工作流程

1
2
3
4
5
6
// Java 示例
WebDriver driver = new ChromeDriver(); // 1. 初始化驱动
driver.get("https://example.com"); // 2. 打开URL
WebElement element = driver.findElement(By.id("username")); // 3. 定位元素
element.sendKeys("testuser"); // 4. 操作元素
driver.quit(); // 5. 关闭浏览器

三、元素定位策略

3.1 常用定位方式

定位器 示例(Java) 说明
ID By.id("elementId") 通过元素ID
Name By.name("elementName") 通过元素name属性
Class By.className("className") 通过CSS类名
Tag By.tagName("input") 通过HTML标签名
Link Text By.linkText("Click Here") 通过链接文本
Partial Link By.partialLinkText("Click") 通过部分链接文本
CSS Selector By.cssSelector("#login > button") CSS选择器
XPath By.xpath("//input[@name='username']") XML路径语言

3.2 最佳实践

  1. 优先使用ID:最稳定且高效的定位方式
  2. 避免绝对XPath:使用相对路径或CSS选择器
  3. 使用显式等待:避免硬性等待(Thread.sleep)
  4. 组合定位策略:如 By.cssSelector("input.login-btn")

四、常用操作与交互

4.1 浏览器操作

1
2
3
4
5
6
driver.get("https://example.com"); // 打开URL
driver.navigate().back(); // 后退
driver.navigate().forward(); // 前进
driver.navigate().refresh(); // 刷新
driver.manage().window().maximize(); // 最大化窗口
driver.quit(); // 关闭浏览器并退出驱动

4.2 元素操作

1
2
3
4
5
6
7
8
element.click();                   // 点击元素
element.sendKeys("text"); // 输入文本
element.clear(); // 清除内容
element.getText(); // 获取文本
element.getAttribute("value"); // 获取属性值
element.isDisplayed(); // 是否可见
element.isEnabled(); // 是否可用
element.isSelected(); // 是否被选中

4.3 下拉框处理

1
2
3
4
Select dropdown = new Select(driver.findElement(By.id("country")));
dropdown.selectByVisibleText("China"); // 按文本选择
dropdown.selectByValue("CN"); // 按value选择
dropdown.selectByIndex(1); // 按索引选择

五、等待机制

5.1 等待类型对比

等待类型 说明 示例
硬性等待 固定时间等待 Thread.sleep(3000)
隐式等待 全局等待设置 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
显式等待 条件触发等待 见5.2

5.2 显式等待(推荐)

1
2
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));

5.3 常用等待条件

1
2
3
4
5
ExpectedConditions.elementToBeClickable(locator)
ExpectedConditions.visibilityOfElementLocated(locator)
ExpectedConditions.presenceOfElementLocated(locator)
ExpectedConditions.titleContains("text")
ExpectedConditions.alertIsPresent()

六、高级特性

6.1 处理弹窗/警告框

1
2
3
4
5
6
// 获取并处理警告框
Alert alert = driver.switchTo().alert();
alert.accept(); // 确认
alert.dismiss(); // 取消
alert.getText(); // 获取文本
alert.sendKeys(""); // 输入文本

6.2 框架切换

1
2
3
4
5
6
// 切换到框架
driver.switchTo().frame("frameName");
driver.switchTo().frame(0); // 按索引

// 切回主文档
driver.switchTo().defaultContent();

6.3 多窗口处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String mainWindow = driver.getWindowHandle();

// 点击打开新窗口
driver.findElement(By.linkText("New Window")).click();

// 切换到新窗口
for (String handle : driver.getWindowHandles()) {
if (!handle.equals(mainWindow)) {
driver.switchTo().window(handle);
break;
}
}

// 操作后切回主窗口
driver.switchTo().window(mainWindow);

七、Selenium Grid 分布式测试

7.1 架构组成

1
2
3
Hub(中心节点) → 管理测试分发

Node(节点) → 执行测试的浏览器实例

7.2 配置步骤

  1. 启动Hub:java -jar selenium-server-standalone.jar -role hub
  2. 注册Node:java -jar selenium-server-standalone.jar -role node -hub http://hub-ip:4444/grid/register
  3. 测试脚本指定远程地址:
    1
    2
    DesiredCapabilities caps = DesiredCapabilities.chrome();
    WebDriver driver = new RemoteWebDriver(new URL("http://hub-ip:4444/wd/hub"), caps);

八、最佳实践与优化

8.1 测试框架集成

语言 测试框架 报告工具
Java TestNG/JUnit ExtentReports/Allure
Python pytest pytest-html/Allure
C# NUnit ExtentReports/Allure

8.2 Page Object 模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 登录页类
public class LoginPage {
private WebDriver driver;

// 元素定位器
By usernameField = By.id("username");
By passwordField = By.id("password");
By submitButton = By.id("submit");

public LoginPage(WebDriver driver) {
this.driver = driver;
}

// 登录操作
public HomePage login(String user, String pass) {
driver.findElement(usernameField).sendKeys(user);
driver.findElement(passwordField).sendKeys(pass);
driver.findElement(submitButton).click();
return new HomePage(driver);
}
}

// 测试用例
@Test
public void testLogin() {
LoginPage loginPage = new LoginPage(driver);
HomePage homePage = loginPage.login("testuser", "password");
Assert.assertTrue(homePage.isUserLoggedIn());
}

8.3 性能优化技巧

  1. 使用CSS选择器替代XPath(速度更快)
  2. 减少不必要的浏览器操作(如最大化窗口)
  3. 复用浏览器会话(避免频繁启动/关闭)
  4. 并行执行测试(结合TestNG或pytest-xdist)
  5. 使用无头浏览器模式(Headless)
    1
    2
    3
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    WebDriver driver = new ChromeDriver(options);

九、常见问题解决

9.1 元素定位问题

  • 元素未找到:检查定位器、等待时间、是否在iframe内
  • 元素不可交互:检查元素是否可见/启用,可能需要滚动到视图
    1
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);

9.2 跨浏览器问题

  • 使用兼容性更好的定位器
  • 避免浏览器特定操作
  • 针对不同浏览器调整等待时间

9.3 稳定性问题

  • 增加显式等待
  • 添加重试机制
  • 使用更稳定的定位策略