You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium WebDriver Java及Cucumber获取动态表格数据并写入CSV

Selenium WebDriver & Cucumber Java 问题解决方案

1. 获取动态表格特定行列的单元格值

动态表格的核心是先定位表格元素,再通过行列索引定位目标单元格,步骤如下:

  • 定位目标表格(可通过ID、XPath、Class等方式)
  • 提取表格所有行元素集合,根据指定索引获取目标行
  • 从目标行中提取所有列元素集合,根据指定索引获取目标单元格
  • 读取单元格的文本值

代码示例:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;

public class TableCellExtractor {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("目标页面URL");

        // 定位动态表格
        WebElement table = driver.findElement(By.id("dynamic-table"));
        
        // 指定目标行列索引(示例:第2行、第3列,索引从0开始)
        int targetRowIndex = 1;
        int targetColIndex = 2;

        List<WebElement> rows = table.findElements(By.tagName("tr"));
        if (targetRowIndex < rows.size()) {
            WebElement targetRow = rows.get(targetRowIndex);
            List<WebElement> cols = targetRow.findElements(By.tagName("td"));
            
            if (targetColIndex < cols.size()) {
                String cellValue = cols.get(targetColIndex).getText();
                System.out.println("目标单元格值:" + cellValue);
            } else {
                System.out.println("指定列索引超出表格列数范围");
            }
        } else {
            System.out.println("指定行索引超出表格行数范围");
        }

        driver.quit();
    }
}

2. Cucumber场景下提取表格列值并写入CSV指定列

结合Cucumber的Step Definition,通过循环提取指定列所有值,再写入CSV指定列,推荐使用OpenCSV简化文件操作:

第一步:引入OpenCSV依赖(Maven)

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>

第二步:编写Cucumber Step Definition

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class TableToCsvSteps {
    private WebDriver driver;
    private static final String CSV_OUTPUT_PATH = "./table-data.csv";

    @Given("打开目标页面")
    public void launchTargetPage() {
        driver = new ChromeDriver();
        driver.get("目标页面URL");
    }

    @Then("提取表格第{int}列所有值并写入CSV第{int}列")
    public void extractColumnToCsv(int tableColIndex, int csvColIndex) throws IOException {
        WebElement table = driver.findElement(By.xpath("//table[@class='dynamic-table']"));
        List<WebElement> rows = table.findElements(By.tagName("tr"));

        // 初始化CSV写入器,自动关闭资源
        try (CSVWriter writer = new CSVWriter(new FileWriter(CSV_OUTPUT_PATH))) {
            // 写入CSV表头(根据实际列数调整)
            String[] csvHeader = {"序号", "提取列", "其他列"};
            writer.writeNext(csvHeader);

            // 遍历表格行(跳过表头行,若表头用<th>标签则从i=1开始)
            for (int i = 1; i < rows.size(); i++) {
                WebElement currentRow = rows.get(i);
                List<WebElement> cols = currentRow.findElements(By.tagName("td"));
                
                // 初始化CSV行数组,默认填充空字符串
                String[] csvRow = new String[3];
                if (tableColIndex < cols.size()) {
                    String cellValue = cols.get(tableColIndex).getText();
                    csvRow[csvColIndex - 1] = cellValue; // CSV索引从0开始,需转换用户输入的列数
                }
                writer.writeNext(csvRow);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        driver.quit();
    }
}

注意事项

  • 若表格表头使用<th>标签,循环需从索引1开始跳过表头;若表头用<td>则从0开始
  • 确保CSV文件路径有写入权限,避免IO异常
  • OpenCSV会自动处理包含逗号、引号的特殊单元格值,无需手动转义

内容的提问来源于stack exchange,提问作者user2236394

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:52