Selenium 测试框架 - Java

🚀 Selenium Java 实战入门与进阶指南

在这里插入图片描述

Selenium 是自动化 Web UI 测试的强大工具,而 Java 则是其广泛支持的主力语言之一。本文将手把手带你完成一个完整的 Selenium Java 项目,从基础环境搭建,到多浏览器支持、定位技巧与动作模拟,并配合 TestNG/JUnit 实现高效测试自动化。


📦 一、环境准备与依赖配置

✅ 前置条件

  • 安装 JDK 8+
  • 安装 Maven
  • 准备对应的浏览器驱动(推荐使用 WebDriverManager 自动管理)

🧩 Maven依赖(pom.xml

<dependencies>
    <!-- Selenium Java 核心库 -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.12.0</version>
    </dependency>

    <!-- TestNG 测试框架 -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.8.0</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit(可选) -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- WebDriverManager 自动下载驱动 -->
    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>5.4.1</version>
    </dependency>
</dependencies>

🧪 二、测试框架集成示例

2.1 ✅ TestNG 示例

public class BaiduSearchTestNG {
    WebDriver driver;

    @BeforeMethod
    public void setUp() {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @Test
    public void testBaiduSearch() {
        driver.get("https://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("Selenium");
        driver.findElement(By.id("su")).click();
        assertEquals(driver.getTitle(), "Selenium_百度搜索");
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }
}

2.2 ✅ JUnit 示例

public class BaiduSearchJUnit {
    WebDriver driver;

    @Before
    public void setUp() {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @Test
    public void testBaiduSearch() {
        driver.get("https://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("Selenium");
        driver.findElement(By.id("su")).click();
        assertEquals(driver.getTitle(), "Selenium_百度搜索");
    }

    @After
    public void tearDown() {
        driver.quit();
    }
}

🌐 三、多浏览器支持实战

3.1 🛠️ 浏览器工厂类封装

public class BrowserFactory {
    public static WebDriver getDriver(String browserName) {
        WebDriver driver;
        switch (browserName.toLowerCase()) {
            case "chrome":
                WebDriverManager.chromedriver().setup();
                driver = new ChromeDriver();
                break;
            case "firefox":
                WebDriverManager.firefoxdriver().setup();
                driver = new FirefoxDriver();
                break;
            case "edge":
                WebDriverManager.edgedriver().setup();
                driver = new EdgeDriver();
                break;
            case "safari":
                driver = new SafariDriver(); // 不需WebDriverManager
                break;
            default:
                throw new IllegalArgumentException("不支持的浏览器类型: " + browserName);
        }
        driver.manage().window().maximize();
        return driver;
    }
}

3.2 🧪 TestNG多浏览器测试

public class MultiBrowserTest {
    WebDriver driver;

    @Parameters("browser")
    @Test
    public void testOnMultipleBrowsers(String browser) {
        driver = BrowserFactory.getDriver(browser);
        driver.get("https://www.baidu.com");
        driver.quit();
    }
}

TestNG XML 配置:

<test name="Chrome Test">
    <parameter name="browser" value="chrome"/>
    <classes>
        <class name="MultiBrowserTest"/>
    </classes>
</test>

<test name="Firefox Test">
    <parameter name="browser" value="firefox"/>
    <classes>
        <class name="MultiBrowserTest"/>
    </classes>
</test>

🔍 四、元素定位方式详解

4.1 常用定位方式

driver.findElement(By.id("elementId"));                    // ID
driver.findElement(By.name("elementName"));                // Name
driver.findElement(By.className("elementClass"));          // Class
driver.findElement(By.tagName("div"));                     // Tag
driver.findElement(By.linkText("点击这里"));               // 完整链接文本
driver.findElement(By.partialLinkText("点击"));           // 部分链接
driver.findElement(By.cssSelector("#id .class > div"));    // CSS选择器
driver.findElement(By.xpath("//div[@class='class']"));     // XPath

4.2 高级定位技巧

✅ 动态属性定位
driver.findElement(By.xpath("//div[contains(@id, 'dynamic')]"));
driver.findElement(By.xpath("//input[starts-with(@name, 'search')]"));
driver.findElement(By.xpath("//button[text()='Submit']"));
✅ 父子元素组合定位
WebElement parent = driver.findElement(By.id("parent"));
WebElement child = parent.findElement(By.className("child"));

driver.findElement(By.cssSelector("#parent .child")); // 更简洁

🎮 五、动作模拟详解(交互+键盘)

5.1 基础交互动作

driver.findElement(By.id("searchBox")).sendKeys("Selenium"); // 输入
driver.findElement(By.id("searchBox")).clear();              // 清除
driver.findElement(By.id("submit")).click();                 // 点击
driver.findElement(By.id("form")).submit();                  // 表单提交

5.2 高级动作(Actions类)

Actions actions = new Actions(driver);

// 悬停
actions.moveToElement(driver.findElement(By.id("hover"))).perform();

// 双击
actions.doubleClick(driver.findElement(By.id("double"))).perform();

// 右击
actions.contextClick(driver.findElement(By.id("rightClick"))).perform();

// 拖拽
actions.dragAndDrop(source, target).perform();

// 组合动作
actions.clickAndHold(source).moveToElement(target).release().build().perform();

5.3 键盘操作

driver.findElement(By.id("searchBox")).sendKeys(Keys.chord(Keys.CONTROL, "a")); // Ctrl+A
driver.findElement(By.id("searchBox")).sendKeys(Keys.DELETE);                   // 删除

🧩 六、完整测试案例:百度搜索

public class BaiduSearchCompleteExample {
    WebDriver driver;

    @BeforeMethod
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @Test
    public void testBaiduSearch() {
        driver.get("https://www.baidu.com");
        Assert.assertTrue(driver.getTitle().contains("百度"));

        WebElement searchBox = driver.findElement(By.id("kw"));
        searchBox.sendKeys("Selenium WebDriver");

        new Actions(driver)
            .moveToElement(searchBox)
            .click()
            .sendKeys(" 教程")
            .build()
            .perform();

        driver.findElement(By.id("su")).click();

        String actualTitle = driver.getTitle();
        Assert.assertTrue(actualTitle.contains("Selenium WebDriver"));
        Assert.assertTrue(actualTitle.contains("教程"));
    }

    @AfterMethod
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

✅ 七、实用最佳实践建议

建议说明
显式等待避免 Thread.sleep(),使用 WebDriverWait 提升稳定性
页面对象模型(POM)页面结构与操作分离,提升复用性与可维护性
日志记录引入日志框架(如Log4j)追踪测试流程
异常处理包装关键操作,减少测试失败率
配置分离浏览器类型、URL等写入配置文件或系统参数中
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));

🎉 总结

通过本篇文章,你可以掌握 Selenium Java 在不同测试框架下的基本用法、多浏览器支持、元素定位与复杂交互操作,并了解实战中的最佳实践。后续你可以进一步探索:

  • 页面对象模型(POM)设计模式
  • 持续集成平台(Jenkins、GitLab CI)
  • 自动化测试报告(Allure、ExtentReports)

🎉如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和关注我!也欢迎评论区留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas Kant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值