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

Selenium Java读取Excel链接逐个打开仅执行首条问题排查

问题根因

代码仅能打开第一个链接,由4个明确问题导致:

  • 数组长度计算错误:POI的getLastRowNum()返回0起始的行索引,直接用该值初始化数组、且循环从第2行(索引1)开始读,会导致数组出现空元素、有效数据缺失,TestNG读取到异常参数组会终止后续调用。
  • 单元格读取无兼容逻辑:直接调用getStringCellValue()读取单元格,只要后续行的单元格不是纯文本格式(比如Excel超链接格式、公式格式),就会抛出异常中断测试,仅第一个纯文本格式的链接能正常读取。
  • 参数维度不匹配:读取整行所有列的单元格存入参数数组,但测试方法仅接收1个字符串参数,当行内存在多列数据时会触发参数不匹配错误。
  • 驱动生命周期缺失:驱动初始化方法未和测试流程绑定,第一次调用后驱动实例状态异常时,后续调用会直接失败。
修复方案
  1. 改用动态列表存储有效链接,避免手动计算数组长度出错,固定读取第一列前5行数据,跳过空行空单元格
  2. 增加单元格类型兼容判断,支持读取纯文本、超链接、公式等不同格式存储的链接
  3. 绑定测试生命周期,保证驱动实例可用,测试完成后自动回收资源
  4. 用文件流读取Excel文件,避免相对路径识别异常,读取完成后关闭文件流
修正后可运行代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class LinkJumpTest {
    private WebDriver driver;

    @DataProvider(name = "URLS")
    public Object[][] readFromExcel() throws IOException {
        FileInputStream fis = new FileInputStream("pagelinks.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(fis);
        Sheet sheet = workbook.getSheet("URL");
        
        List<String> validUrls = new ArrayList<>();
        // 读取第一列前5行(索引0-4对应Excel界面显示的1-5行),如果第一行是表头,把i初始值改成1即可
        for (int i = 0; i < 5; i++) {
            Row row = sheet.getRow(i);
            if (row == null) continue;
            Cell cell = row.getCell(0);
            if (cell == null) continue;
            
            String url;
            // 兼容不同单元格格式
            switch (cell.getCellType()) {
                case STRING:
                    url = cell.getStringCellValue().trim();
                    break;
                case FORMULA:
                    url = cell.getHyperlink() != null ? cell.getHyperlink().getAddress() : cell.getStringCellValue().trim();
                    break;
                default:
                    url = cell.toString().trim();
            }
            if (!url.isEmpty()) {
                validUrls.add(url);
            }
        }
        workbook.close();
        fis.close();

        // 转换为TestNG要求的二维数组格式,单组参数长度为1,匹配测试方法入参
        Object[][] urls = new Object[validUrls.size()][1];
        for (int i = 0; i < validUrls.size(); i++) {
            urls[i][0] = validUrls.get(i);
        }
        return urls;
    }

    @BeforeMethod
    public void initDriver() {
        System.setProperty("webdriver.chrome.driver", "C:\\Natesh\\Automation\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @Test(dataProvider = "URLS")
    public void logInMethod(String url) {
        driver.get(url);
        System.out.println("已打开链接:" + url);
        // 可在此处补充页面校验逻辑
    }

    @AfterMethod
    public void tearDown() {
        // 执行完成后关闭浏览器回收资源
        if (driver != null) {
            driver.quit();
        }
    }
}
补充说明
  • 如果需要5个链接在同一个浏览器窗口依次打开,把@BeforeMethod改成@BeforeClass、@AfterMethod改成@AfterClass即可,无需每次启动新浏览器
  • 运行前确认pagelinks.xlsx存放在项目根目录,否则文件流会读取失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:15:41