Selenium Java读取Excel链接逐个打开仅执行首条问题排查
问题根因
代码仅能打开第一个链接,由4个明确问题导致:
- 数组长度计算错误:POI的
getLastRowNum()返回0起始的行索引,直接用该值初始化数组、且循环从第2行(索引1)开始读,会导致数组出现空元素、有效数据缺失,TestNG读取到异常参数组会终止后续调用。 - 单元格读取无兼容逻辑:直接调用
getStringCellValue()读取单元格,只要后续行的单元格不是纯文本格式(比如Excel超链接格式、公式格式),就会抛出异常中断测试,仅第一个纯文本格式的链接能正常读取。 - 参数维度不匹配:读取整行所有列的单元格存入参数数组,但测试方法仅接收1个字符串参数,当行内存在多列数据时会触发参数不匹配错误。
- 驱动生命周期缺失:驱动初始化方法未和测试流程绑定,第一次调用后驱动实例状态异常时,后续调用会直接失败。
修复方案
- 改用动态列表存储有效链接,避免手动计算数组长度出错,固定读取第一列前5行数据,跳过空行空单元格
- 增加单元格类型兼容判断,支持读取纯文本、超链接、公式等不同格式存储的链接
- 绑定测试生命周期,保证驱动实例可用,测试完成后自动回收资源
- 用文件流读取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
相关产品推荐
相关产品推荐

