Selenium

Selenium 定义

Selenium 是一个用于 Web 应用程序自动化测试的开源工具集合,最初由 ThoughtWorks 开发,目前由社区进行维护和更新。它可以帮助开发人员、测试人员对网站功能、页面交互进行自动化测试或操作,用以替代手动测试,提高测试效率和准确性。Selenium 的核心组件包括 Selenium IDE、Selenium WebDriver、Selenium Grid 等。


Selenium 基本原理

  • WebDriver:Selenium 中最核心的组件,通过调用各个浏览器厂商提供的原生驱动(如 ChromeDriver、SafariDriver)来控制浏览器进行自动化操作。
  • 原理简述:Selenium WebDriver 通过与浏览器驱动(Driver)通信,将测试脚本中的各种动作(如点击、输入文本、切换页面等)转换为浏览器可以理解的原生 API 调用,从而完成对浏览器的操作。

Selenium 官网

  • Selenium 官方网址https://www.selenium.dev/
    在该网站可以获取到 Selenium 项目的最新文档、下载链接、更新日志以及社区资源等。

核心术语及术语解释

  1. Selenium IDE
    • 是一个浏览器插件(最初是 Firefox,后来也支持 Chrome)可用于录制回放测试脚本,适用于编写快速测试验证。
  2. Selenium WebDriver
    • 最常用的 Selenium 工具,通过浏览器驱动程序与浏览器通信,提供对网页控件的查找、操作、断言等能力。
  3. Selenium Grid
    • 用于分布式测试,可将测试任务分配到不同的机器或者不同的浏览器上并行执行,提高测试效率。
  4. Browser Driver(浏览器驱动)
    • 如 ChromeDriver、SafariDriver、EdgeDriver、FirefoxDriver 等。每个浏览器都有相应的专属驱动,用来接收 Selenium WebDriver 发送的指令并实际控制浏览器行为。
  5. Locator(元素定位器)
    • 定位网页元素的方式,如 id、name、className、cssSelector、xpath 等。是自动化脚本中查找元素的核心。
  6. Wait(等待)
    • 在自动化过程中,为了保证元素已经加载或处于可操作状态,需要设置等待策略,常见有隐式等待(Implicit Wait)和显示等待(Explicit Wait)。
  7. Actions(鼠标键盘操作)
    • Selenium 提供 Actions 类用于模拟复杂的鼠标键盘动作,如鼠标悬停、拖拽、右键、双击、按键输入、组合键等。

驱动器版本与浏览器版本匹配

Selenium WebDriver 需要使用到各浏览器厂商提供的驱动,如:

  • Google Chrome 浏览器
    • 对应的驱动是 ChromeDriver
    • 需要确保 ChromeDriver 的版本与本地安装的 Chrome 浏览器版本兼容或匹配,否则运行测试时可能会出现错误。
    • 例如,本地浏览器版本是 108.x,则最好使用对应的 108.x ChromeDriver。
  • Safari 浏览器
    • 对应的驱动是 SafariDriver(在 macOS 上通常默认随系统自带 Safari WebDriver,前提是开启 “允许远程自动化” 选项)。
    • 版本兼容性:SafariDriver 与 Safari 浏览器在同一个系统上,只要 macOS 和 Safari 为最新兼容版本即可。

在使用时,可通过以下方式获取驱动:


等待机制(显示等待与隐式等待)

  1. 隐式等待(Implicit Wait)

    • 在设置过隐式等待后,WebDriver 在查找元素时会默认轮询一定时间,直到元素出现或时间超过才抛出异常。它的作用范围是全局一旦设置,对后续的所有元素定位都生效。
    • 示例:driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
  2. 显示等待(Explicit Wait)

    • 指定某个条件(Condition),在该条件满足之前,WebDriver 会按一定频率不断检查,直到超时或者条件满足才进行下一步操作。

    • 常用:WebDriverWait + ExpectedConditions

    • 示例:

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

两者区别:

  • 隐式等待适合大部分简单的元素等待场景,配置较为简单,但对全局都生效;
  • 显示等待针对特定元素或条件,可以灵活控制等待逻辑,更加精细化。

隐式等待在固定时间内没有等待到就会报错
显示等待是一直等,即便超过设置的等待时间


鼠标、键盘等驱动操作

Selenium 提供 Actions 类来模拟复杂的人机交互动作,常见例如:

  1. 鼠标操作
    • 移动鼠标到元素上(悬停)、点击、双击、右键点击、拖拽等。
    • 示例:actions.moveToElement(element).click().perform();
  2. 键盘操作
    • 键盘按键(如 Enter、Esc 等)、按住 Shift 键点击元素、同时按住 Ctrl 键等。
    • 示例:actions.keyDown(Keys.CONTROL).click(element).keyUp(Keys.CONTROL).perform();

通过这些操作,可以模拟真实用户在网页上的各种行为,完成对应用的交互式测试或自动化操作。


Code Demo

基配 Maven(3.9.x 以上)、JDK 17 环境下的 Selenium WebDriver .

1. Maven pom.xml 依赖示例

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>selenium-demo</artifactId>
    <version>1.0.0</version>
    <name>Selenium Demo</name>
    <properties>
        <java.version>17</java.version>
        <!-- 如果用 Selenium 4.x,可指定版本 -->
        <selenium.version>4.10.0</selenium.version>
    </properties>
    <dependencies>
        <!-- Selenium WebDriver -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>

        <!-- 如需 WebDriverManager 自动管理驱动,可引入 -->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.2</version>
        </dependency>

        <!-- Spring Boot 相关依赖 (若需要) -->
        <!--
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        -->
    </dependencies>
    <build>
        <plugins>
            <!-- Compiler Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. 示例代码

package com.example.seleniumdemo;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.safari.SafariDriver;
// 显式等待相关
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

// 如果需要自动管理驱动:
// import io.github.bonigarcia.wdm.WebDriverManager;

import java.time.Duration;

public class SeleniumDemoApplication {

    public static void main(String[] args) {

        // 如果使用 WebDriverManager 来自动管理 ChromeDriver,可用下面代码:
        // WebDriverManager.chromedriver().setup();
        // WebDriver driver = new ChromeDriver();

        // 使用 ChromeDriver 手动指定路径或系统已有的可执行文件:
        // System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        // WebDriver driver = new ChromeDriver();

        // 若使用 Safari 浏览器,则在 macOS 上需要开启 “允许远程自动化”:
        // WebDriver driver = new SafariDriver();

        // 以下示例以 ChromeDriver 为例:
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        WebDriver driver = new ChromeDriver();

        try {
            // 设置隐式等待 10 秒
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

            // 打开目标网页
            driver.get("https://www.google.com");

            // 使用显示等待:等待页面上的搜索输入框可见
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            WebElement searchBox = wait.until(ExpectedConditions
                    .visibilityOfElementLocated(By.name("q")));

            // 输入关键字 Selenium
            searchBox.sendKeys("Selenium WebDriver");
            // 模拟回车
            searchBox.submit();

            // 再等待搜索结果的出现
            WebElement resultStats = wait.until(ExpectedConditions
                    .visibilityOfElementLocated(By.id("result-stats")));

            System.out.println("搜索结果统计信息: " + resultStats.getText());

            // 后续还可以进行 Actions 的鼠标键盘操作
            // ...

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭浏览器
            driver.quit();
        }
    }
}

说明

  1. 若要使用 Safari,请改用 WebDriver driver = new SafariDriver(); 并确认在 Safari->开发者设置 中启用了 允许远程自动化。mac不需要额外下载插件,因为本身就有。但要设置一下才能生效
  2. 如果使用 macOS,需要保证 Safari 与系统版本兼容;Chrome 则需要下载对应版本的 ChromeDriver

如果是win 浏览器版本和驱动版本一定要匹配


Selenium 的业务应用场景

  1. 回归测试
    • 产品迭代开发后,需要确保已有功能不被破坏,通常会有大量的重复性测试,Selenium 能自动化执行浏览器端操作,大幅降低人工回归成本。
  2. 功能测试
    • 对网站的核心业务流程(如登录、下单、支付、信息填写等)进行自动化测试,减少疏漏。
  3. 跨浏览器测试
    • 产品在 Chrome、Safari、Edge、Firefox 等主流浏览器下的兼容性验证。
  4. 持续集成/持续交付(CI/CD)
    • 与 Jenkins、GitLab CI、GitHub Actions 等整合,在每次代码提交后自动触发 Selenium 测试,快速反馈并保证质量。
  5. 爬虫和数据采集(虽然不算 Selenium 的主要目的,但也有团队用它进行需要复杂交互场景下的数据采集)。
  6. 自动化演示、脚本化交互
    • 例如做一些自动化网页操作(批量更新信息、自动填写表单等),减少重复人力投入。

总结

  • Selenium 是目前 Web 自动化测试最常用的方案之一,兼容各大主流浏览器。
  • 驱动与浏览器版本 需要匹配,以避免不必要的问题。
  • 隐式等待与显示等待 可以帮助我们更好地控制脚本的执行节奏,从而提高测试稳定性。
  • 鼠标和键盘操作 等高级交互功能能覆盖较复杂的场景。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容