0

0

使用Java Selenium验证表格数据排序:金额列的升序与降序检查

碧海醫心

碧海醫心

发布时间:2025-10-10 13:21:20

|

176人浏览过

|

来源于php中文网

原创

使用java selenium验证表格数据排序:金额列的升序与降序检查

本教程详细介绍了如何利用Java Selenium WebDriver验证网页表格中金额列的排序功能。文章涵盖了从环境配置、登录应用到数据提取、清洗、数值转换,再到实现表格数据(特别是金额数据)的升序或降序验证的完整流程。通过示例代码,演示了如何获取页面元素、处理文本数据,并使用JUnit进行断言,确保表格排序逻辑的准确性与健壮性。

1. 环境准备与项目配置

在开始之前,请确保您的开发环境中已配置好Java开发工具包(JDK)和Maven或Gradle等构建工具。本教程将使用JUnit 5作为测试框架,并依赖Selenium WebDriver库。

Maven pom.xml 依赖示例:


    
    
        org.seleniumhq.selenium
        selenium-java
        4.18.1 
    
    
    
        org.junit.jupiter
        junit-jupiter-api
        5.10.1 
        test
    
    
        org.junit.jupiter
        junit-jupiter-engine
        5.10.1
        test
    

同时,您需要下载对应浏览器版本的WebDriver可执行文件(例如,ChromeDriver),并将其路径配置到系统属性中。

2. 登录与页面导航

首先,我们需要通过Selenium模拟用户登录并导航到包含目标表格的页面。这通常涉及定位用户名、密码输入框,输入凭据,然后点击登录按钮。

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

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 org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

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

public class TableSortingVerification {

    private WebDriver driver;
    private WebDriverWait wait;

    @BeforeEach
    public void setup() {
        // 设置ChromeDriver路径,请替换为您的实际路径
        System.setProperty("webdriver.chrome.driver", "path/to/your/chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        // 使用WebDriverWait提供更健壮的等待机制
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    }

    @Test
    public void verifyAmountColumnSorting() {
        // 1. 登录到应用
        driver.get("https://sakshingp.github.io/assignment/login.html");
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username"))).sendKeys("Lakshay");
        driver.findElement(By.id("password")).sendKeys("Wingify");
        driver.findElement(By.id("log-in")).click();

        // 2. 等待页面加载并导航到包含表格的页面
        // 假设登录后直接跳转到 home.html,或者通过点击某个链接
        wait.until(ExpectedConditions.urlContains("home.html"));
        // 等待表格元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("transactionsTable")));

        // ... 后续排序验证逻辑 ...
    }

    @AfterEach
    public void tearDown() {
        if (driver != null) {
            driver.quit(); // 关闭浏览器
        }
    }
}

3. 数据提取与清洗

表格数据的验证核心在于准确地从网页中提取数据,并将其转换为可比较的格式。对于金额列,通常需要移除货币符号、逗号和多余的空格,然后将字符串转换为数值类型(如Double),以便进行正确的数值排序。

我们将创建一个辅助方法 extractAndCleanAmountData() 来处理这些步骤:

居然设计家
居然设计家

居然之家和阿里巴巴共同打造的家居家装AI设计平台

下载
    /**
     * 从表格中提取“Amount”列的数据并进行清洗和类型转换。
     * @return 包含Double类型金额的列表。
     */
    private List extractAndCleanAmountData() {
        // 定位所有包含金额的span元素。这里的XPath定位了transactionsTable下tbody中所有td内的span元素。
        // 请根据实际页面结构调整XPath或CSS选择器。
        List amountElements = driver.findElements(By.xpath("//*[@id=\"transactionsTable\"]/tbody/tr/td/span"));
        List amounts = new ArrayList<>();

        for (WebElement element : amountElements) {
            String text = element.getText();
            // 清理字符串:移除"USD", ",", " "
            String cleanedText = text.replace("USD", "")
                                     .replace(",", "")
                                     .trim();
            try {
                // 转换为Double类型进行数值比较
                amounts.add(Double.parseDouble(cleanedText));
            } catch (NumberFormatException e) {
                System.err.println("解析金额时发生错误: " + cleanedText + " - " + e.getMessage());
                // 根据需求处理错误,例如跳过此行数据或抛出异常
            }
        }
        return amounts;
    }

4. 实现排序与验证逻辑

验证表格排序的关键在于:

  1. 模拟点击排序按钮。
  2. 重新从页面上提取数据(这是验证动态排序的关键)。
  3. 创建一个提取数据的副本。
  4. 对副本进行程序化排序(例如,使用Collections.sort())。
  5. 比较从页面提取的实际排序数据与程序化排序后的副本数据。

验证升序排序示例:

    @Test
    public void verifyAmountColumnSorting() {
        // ... (登录和导航代码,如上所示) ...

        // 3. 点击“Amount”列头进行排序
        WebElement amountHeader = driver.findElement(By.id("amount"));
        amountHeader.click();

        // 重要的:等待页面更新或数据重新加载。
        // 对于这个页面,点击后数据会立即重新排列,但为了健壮性,可以加入短暂的等待。
        // 实际项目中应使用更智能的等待,例如等待某个数据元素文本发生变化。
        try {
            Thread.sleep(1000); 
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 4. 重新提取排序后的金额数据
        List actualSortedAmounts = extractAndCleanAmountData();
        System.out.println("页面实际排序后的金额: " + actualSortedAmounts);

        // 5. 创建一个预期排序的列表副本并进行程序化排序
        List expectedSortedAmounts = new ArrayList<>(actualSortedAmounts); // 创建副本
        Collections.sort(expectedSortedAmounts); // 默认升序
        System.out.println("程序化升序排序的金额: " + expectedSortedAmounts);

        // 6. 验证实际数据是否与预期升序排序一致
        // 假设第一次点击“Amount”按钮是升序排序。
        assertEquals(expectedSortedAmounts, actualSortedAmounts, "金额列未按升序排列。");
    }

验证降序排序示例(如果页面支持):

如果页面在再次点击同一列头时切换到降序排序,您可以扩展上述逻辑:

    @Test
    public void verifyAmountColumnDescendingSorting() {
        // ... (登录和导航代码) ...

        WebElement amountHeader = driver.findElement(By.id("amount"));
        amountHeader.click(); // 第一次点击,假设为升序
        try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }

        amountHeader.click(); // 第二次点击,假设为降序
        try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }

        // 重新提取降序排序后的金额数据
        List actualDescendingAmounts = extractAndCleanAmountData();
        System.out.println("页面实际降序排序后的金额: " + actualDescendingAmounts);

        // 创建一个副本并进行程序化降序排序
        List expectedDescendingAmounts = new ArrayList<>(actualDescendingAmounts);
        Collections.sort(expectedDescendingAmounts, Collections.reverseOrder()); // 降序排序
        System.out.println("程序化降序排序的金额: " + expectedDescendingAmounts);

        // 验证实际数据是否与预期降序排序一致
        assertEquals(expectedDescendingAmounts, actualDescendingAmounts, "金额列未按降序排列。");
    }

5. 注意事项与最佳实践

  • 等待策略: 避免使用硬编码的 Thread.sleep()。在实际项目中,应优先使用 WebDriverWait 结合 ExpectedConditions 来等待元素可见、可点击或数据更新,以提高测试的稳定性和效率。例如,可以等待某个表格单元格的文本发生变化。
  • 数据类型: 对于金额等数值数据,务必将其转换为 Double 或 BigDecimal 进行比较。直接比较字符串会进行字典序排序,可能导致 "100.00" 小于 "20.00" 的错误结果。BigDecimal 更适合处理高精度货币计算,避免浮点数精度问题。
  • 元素定位器: 使用稳定且唯一的定位器(如 id、name、CSS Selector)。XPath虽然强大,但过于复杂的XPath可能因页面结构微小变化而失效。
  • 代码复用: 将数据提取和清洗的逻辑封装成独立的方法,提高代码的可读性和可维护性。
  • 断言信息: 在 assertEquals 等断言方法中提供清晰的错误消息,有助于快速定位问题。
  • 异常处理: 在数据解析(如 Double.parseDouble())时,考虑使用 try-catch 块处理 NumberFormatException,以应对可能出现的非数字数据或格式错误。

总结

通过上述步骤,我们构建了一个健壮的Java Selenium测试脚本,能够有效地验证网页表格中金额列的升序或降序排序功能。关键在于正确地提取、清洗、转换数据,并利用程序化排序的副本与页面实际排序结果进行比较。遵循最佳实践,如使用智能等待和合适的数值类型,将使您的自动化测试更加稳定和可靠。

相关专题

更多
java
java

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

651

2023.06.15

java流程控制语句有哪些
java流程控制语句有哪些

java流程控制语句:1、if语句;2、if-else语句;3、switch语句;4、while循环;5、do-while循环;6、for循环;7、foreach循环;8、break语句;9、continue语句;10、return语句。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

453

2024.02.23

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

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

722

2023.07.05

java自学难吗
java自学难吗

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

725

2023.07.31

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

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

394

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基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

441

2023.08.02

java有什么用
java有什么用

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

426

2023.08.02

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

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

精品课程

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

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.6万人学习

CSS教程
CSS教程

共754课时 | 16.2万人学习

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

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