0

0

Java Selenium:验证表格数据排序的专业指南

DDD

DDD

发布时间:2025-10-10 13:58:13

|

140人浏览过

|

来源于php中文网

原创

Java Selenium:验证表格数据排序的专业指南

本文详细介绍了如何使用 Java Selenium 自动化测试网页表格数据的排序功能。文章涵盖了从 WebDriver 初始化、用户登录、数据提取、清洗、类型转换到最终的排序验证等关键步骤,并强调了处理数值型数据时的最佳实践,确保测试的准确性和健壮性,帮助开发者高效地验证表格内容的动态排序行为。

引言:自动化表格排序验证的重要性

在现代 web 应用程序中,表格是展示大量结构化数据的常用方式。用户经常需要根据特定列(如金额、日期、名称等)对数据进行升序或降序排序,以便快速查找和分析信息。作为自动化测试工程师,验证这些排序功能的正确性至关重要。本教程将详细指导您如何使用 java 和 selenium webdriver 自动化验证网页表格中的数值型数据排序。

1. 环境准备与 WebDriver 初始化

开始之前,请确保您的开发环境中已安装 Java JDK、Maven 或 Gradle(用于依赖管理),并下载了对应浏览器版本的 WebDriver 可执行文件(例如 ChromeDriver)。

首先,我们需要设置 WebDriver 并打开目标网页。

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
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.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TableSortVerification {

    private static WebDriver driver;
    private static WebDriverWait wait;

    @BeforeClass
    public static void setupWebDriver() {
        // 设置 ChromeDriver 路径
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe"); // 请替换为您的 ChromeDriver 实际路径
        driver = new ChromeDriver();
        // 初始化显式等待,最大等待时间为10秒
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        // 最大化浏览器窗口
        driver.manage().window().maximize();
        // 导航到登录页面
        String baseUrl = "https://sakshingp.github.io/assignment/login.html";
        driver.get(baseUrl);
    }

2. 用户登录与页面导航

在进行表格排序验证之前,通常需要先完成用户登录或导航到包含目标表格的页面。

    @Test
    public void verifyAmountTableSorting() {
        // 1. 执行登录操作
        System.out.println("执行登录操作...");
        driver.findElement(By.id("username")).sendKeys("Lakshay");
        driver.findElement(By.id("password")).sendKeys("Wingify");
        driver.findElement(By.id("log-in")).click();

        // 显式等待,直到进入主页,例如等待“Amount”列头可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("amount")));
        System.out.println("登录成功,进入主页。");

        // (可选) 滚动页面,确保所有元素可见
        // JavascriptExecutor js = (JavascriptExecutor) driver;
        // js.executeScript("window.scrollBy(0, document.body.scrollHeight)");

3. 提取并清洗表格数据

这是核心步骤之一。我们需要从网页表格中提取数值,并进行必要的清洗和类型转换,以便后续的排序和比较。

立即学习Java免费学习笔记(深入)”;

关键点:

DeepL
DeepL

DeepL是一款强大的在线AI翻译工具,可以翻译31种不同语言的文本,并可以处理PDF、Word、PowerPoint等文档文件

下载
  • 定位表格元素: 使用 XPath 或 CSS 选择器定位到表格中所有“金额”列的单元格。
  • 数据清洗: 移除货币符号(如 "USD")、千位分隔符(如 ",")和多余的空格。
  • 数据类型转换: 将清洗后的字符串转换为 Double 或 BigDecimal 类型,以确保数值比较的准确性。直接对字符串进行排序可能导致 "100.00" 排在 "20.00" 之前。
    /**
     * 辅助方法:从页面提取并清洗金额数据
     * @return 清洗并转换为 Double 类型的金额列表
     */
    private List extractAndCleanAmounts() {
        // 定位所有金额列的 span 元素
        List amountElements = driver.findElementsByXPath("//*[@id=\"transactionsTable\"]/tbody/tr/td/span");
        List cleanedAmounts = new ArrayList<>();
        for (WebElement element : amountElements) {
            String text = element.getText();
            // 清洗字符串:移除 "USD", ",", " "
            String cleanedText = text.replaceAll("USD", "")
                                     .replaceAll(",", "")
                                     .replaceAll(" ", "")
                                     .trim();
            // 转换为 Double 类型
            try {
                cleanedAmounts.add(Double.parseDouble(cleanedText));
            } catch (NumberFormatException e) {
                System.err.println("无法解析金额字符串: " + cleanedText + ",跳过此项。");
            }
        }
        return cleanedAmounts;
    }

4. 触发排序操作与等待页面更新

在验证排序之前,需要模拟用户点击排序按钮。点击后,页面内容通常会动态更新,因此需要等待页面完成更新。

        // 2. 提取点击排序按钮前的原始数据(用于生成预期排序结果)
        List initialAmounts = extractAndCleanAmounts();
        System.out.println("初始金额数据: " + initialAmounts);

        // 3. 点击“Amount”列头触发排序
        System.out.println("点击 'Amount' 按钮触发排序...");
        WebElement amountHeader = driver.findElement(By.id("amount"));
        amountHeader.click();

        // 显式等待,直到表格内容更新。
        // 可以等待某个特定元素的状态变化,或者等待表格数据重新加载。
        // 这里我们简单地等待 Amount 列头再次可见(暗示页面已稳定),
        // 或者更健壮地等待某个表格行中的数据发生变化。
        wait.until(ExpectedConditions.stalenessOf(amountHeader)); // 等待旧的元素变得“陈旧”
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("amount"))); // 等待新的元素或刷新后的元素可见
        System.out.println("排序操作完成,等待页面更新。");

5. 生成预期排序列表

预期排序列表是通过对原始提取数据进行程序化排序而得到的。这与页面上实际显示的排序结果进行比较。

        // 4. 生成预期升序排序列表
        List expectedSortedAscendingAmounts = new ArrayList<>(initialAmounts);
        Collections.sort(expectedSortedAscendingAmounts); // 默认升序
        System.out.println("预期升序排序结果: " + expectedSortedAscendingAmounts);

        // 如果需要验证降序,可以这样生成预期降序列表:
        // List expectedSortedDescendingAmounts = new ArrayList<>(initialAmounts);
        // Collections.sort(expectedSortedDescendingAmounts, Collections.reverseOrder());
        // System.out.println("预期降序排序结果: " + expectedSortedDescendingAmounts);

6. 验证实际与预期排序结果

最后一步是重新从页面提取排序后的数据(即实际结果),并将其与我们程序生成的预期排序列表进行比较。

        // 5. 重新从页面提取实际排序后的数据
        List actualSortedAmounts = extractAndCleanAmounts();
        System.out.println("实际排序结果: " + actualSortedAmounts);

        // 6. 断言:比较实际排序结果与预期升序结果
        System.out.println("开始验证排序结果...");
        Assert.assertEquals("表格金额未按预期升序排序!", expectedSortedAscendingAmounts, actualSortedAmounts);
        System.out.println("表格金额已成功按升序排序!");
    }

    @AfterClass
    public static void tearDown() {
        if (driver != null) {
            driver.quit(); // 关闭浏览器
            System.out.println("浏览器已关闭。");
        }
    }
}

完整示例代码

以下是整合所有步骤的完整 JUnit 测试类:

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
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.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TableSortVerification {

    private static WebDriver driver;
    private static WebDriverWait wait;

    @BeforeClass
    public static void setupWebDriver() {
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe"); // 请替换为您的 ChromeDriver 实际路径
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        driver.manage().window().maximize();
        String baseUrl = "https://sakshingp.github.io/assignment/login.html";
        driver.get(baseUrl);
    }

    @Test
    public void verifyAmountTableSorting() {
        // 1. 执行登录操作
        System.out.println("执行登录操作...");
        driver.findElement(By.id("username")).sendKeys("Lakshay");
        driver.findElement(By.id("password")).sendKeys("Wingify");
        driver.findElement(By.id("log-in")).click();

        // 显式等待,直到进入主页,例如等待“Amount”列头可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("amount")));
        System.out.println("登录成功,进入主页。");

        // 2. 提取点击排序按钮前的原始数据
        List initialAmounts = extractAndCleanAmounts();
        System.out.println("初始金额数据: " + initialAmounts);

        // 3. 点击“Amount”列头触发排序
        System.out.println("点击 'Amount' 按钮触发排序...");
        WebElement amountHeader = driver.findElement(By.id("amount"));
        amountHeader.click();

        // 显式等待,直到表格内容更新。
        // 这里等待旧的元素变得“陈旧”,然后等待新的元素或刷新后的元素可见,以确保页面已稳定。
        wait.until(ExpectedConditions.stalenessOf(amountHeader));
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("amount")));
        System.out.println("排序操作完成,等待页面更新。");

        // 4. 生成预期升序排序列表
        List expectedSortedAscendingAmounts = new ArrayList<>(initialAmounts);
        Collections.sort(expectedSortedAscendingAmounts); // 默认升序
        System.out.println("预期升序排序结果: " + expectedSortedAscendingAmounts);

        // 如果需要验证降序,可以这样生成预期降序列表:
        // List expectedSortedDescendingAmounts = new ArrayList<>(initialAmounts);
        // Collections.sort(expectedSortedDescendingAmounts, Collections.reverseOrder());
        // System.out.println("预期降序排序结果: " + expectedSortedDescendingAmounts);

        // 5. 重新从页面提取实际排序后的数据
        List actualSortedAmounts = extractAndCleanAmounts();
        System.out.println("实际排序结果: " + actualSortedAmounts);

        // 6. 断言:比较实际排序结果与预期升序结果
        System.out.println("开始验证排序结果...");
        Assert.assertEquals("表格金额未按预期升序排序!", expectedSortedAscendingAmounts, actualSortedAmounts);
        System.out.println("表格金额已成功按升序排序!");
    }

    /**
     * 辅助方法:从页面提取并清洗金额数据
     * @return 清洗并转换为 Double 类型的金额列表
     */
    private List extractAndCleanAmounts() {
        // 定位所有金额列的 span 元素
        List amountElements = driver.findElementsByXPath("//*[@id=\"transactionsTable\"]/tbody/tr/td/span");
        List cleanedAmounts = new ArrayList<>();
        for (WebElement element : amountElements) {
            String text = element.getText();
            // 清洗字符串:移除 "USD", ",", " "
            String cleanedText = text.replaceAll("USD", "")
                                     .replaceAll(",", "")
                                     .replaceAll(" ", "")
                                     .trim();
            // 转换为 Double 类型
            try {
                cleanedAmounts.add(Double.parseDouble(cleanedText));
            } catch (NumberFormatException e) {
                System.err.println("无法解析金额字符串: " + cleanedText + ",跳过此项。");
            }
        }
        return cleanedAmounts;
    }

    @AfterClass
    public static void tearDown() {
        if (driver != null) {
            driver.quit(); // 关闭浏览器
            System.out.println("浏览器已关闭。");
        }
    }
}

注意事项与最佳实践

  1. 数据类型处理: 对于数值型数据(尤其是金融数据),务必将其转换为 Double 或 BigDecimal 进行比较。直接对字符串进行排序(例如 "100" 在 "20" 之前)会导致错误的结果。
  2. 显式等待(Explicit Waits): 避免使用 Thread.sleep() 或 CountDownLatch 等硬编码的等待方式。WebDriverWait 结合 ExpectedConditions 可以更智能、更稳定地等待页面元素状态变化,提高测试的健壮性。
  3. 健壮的定位器: 优先使用唯一的 ID 或 CSS 选择器。当没有 ID 时,使用稳定且不易变化的 CSS 选择器。XPath 虽然强大,但如果结构变化频繁,维护成本较高。
  4. 国际化处理: 如果您的应用程序支持多种语言或地区,请注意不同地区数字格式(例如,逗号作为小数点分隔符)可能带来的影响。在清洗数据时需要考虑这些差异。
  5. 错误处理与日志记录: 在数据解析等可能出错的地方添加 try-catch 块,并输出有意义的日志信息,有助于调试和问题排查。
  6. 验证升序/降序: 如果需要验证降序排序,在生成预期列表时使用 Collections.sort(list, Collections.reverseOrder());。在实际应用中,您可能需要根据点击排序按钮的次数或表格列头的状态来判断当前是升序还是降序。

总结

通过本文的详细教程,您应该已经掌握了使用 Java Selenium 验证网页表格数据排序的核心方法。从 WebDriver 初始化到数据提取、清洗、排序和最终验证,每一步都至关重要。遵循最佳实践,

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号