前言
这里只是是一本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 浏览器驱动
2.2 WebDriver 架构
1
| 测试脚本 → WebDriver API → 浏览器驱动 → 真实浏览器
|
2.3 基本工作流程
1 2 3 4 5 6
| WebDriver driver = new ChromeDriver(); driver.get("https://example.com"); WebElement element = driver.findElement(By.id("username")); element.sendKeys("testuser"); driver.quit();
|
三、元素定位策略
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 最佳实践
- 优先使用ID:最稳定且高效的定位方式
- 避免绝对XPath:使用相对路径或CSS选择器
- 使用显式等待:避免硬性等待(Thread.sleep)
- 组合定位策略:如
By.cssSelector("input.login-btn")
四、常用操作与交互
4.1 浏览器操作
1 2 3 4 5 6
| driver.get("https://example.com"); 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"); 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 配置步骤
- 启动Hub:
java -jar selenium-server-standalone.jar -role hub
- 注册Node:
java -jar selenium-server-standalone.jar -role node -hub http://hub-ip:4444/grid/register
- 测试脚本指定远程地址:
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 性能优化技巧
- 使用CSS选择器替代XPath(速度更快)
- 减少不必要的浏览器操作(如最大化窗口)
- 复用浏览器会话(避免频繁启动/关闭)
- 并行执行测试(结合TestNG或pytest-xdist)
- 使用无头浏览器模式(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 稳定性问题
版权声明: 此文章版权归曦曦所有,如有转载,请注明来自原作者