如何将Excel第1列URL传入driver.get()并断言第2列预期URL?
解决URL重定向验证的Excel数据驱动测试问题
我看了你的代码,发现几个关键问题需要调整,同时帮你实现预期的URL重定向验证逻辑。TestNG的DataProvider其实已经帮我们做好了数据遍历的工作,不需要自己写循环,下面是修正后的完整代码和详细说明:
修正后的完整代码
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class UrlRedirectCheck { private WebDriver driver; private WebDriverWait wait; @BeforeClass public void testSetup() { driver = new FirefoxDriver(); driver.manage().window().maximize(); wait = new WebDriverWait(driver, 10); // 延长等待时间应对慢加载场景 } // DataProvider会自动把Excel每行数据传入这个测试方法,无需手动循环 @Test(dataProvider = "Urls") public void verifyRedirectURL(String originalUrl, String expectedRedirectUrl) { // 访问Excel第0列的原始URL driver.get(originalUrl); // 可选:等待跳转完成(推荐添加,避免页面未加载完就获取URL) // wait.until(ExpectedConditions.urlContains(expectedRedirectUrl)); // 获取实际跳转后的URL String actualRedirectUrl = driver.getCurrentUrl(); // 断言实际URL与Excel第1列的预期URL是否一致 Assert.assertEquals(actualRedirectUrl, expectedRedirectUrl, "跳转验证失败:原始URL[" + originalUrl + "] 实际跳转到[" + actualRedirectUrl + "],预期为[" + expectedRedirectUrl + "]"); } @DataProvider(name = "Urls") public Object[][] milbURL() { // 替换成你的Excel文件绝对路径,比如 "C:/test/redirects.xls" return getExcelData("<你的Excel文件路径>", "Sheet1"); } /** * 读取Excel数据,返回二维数组供DataProvider使用 * @param fileName Excel文件路径 * @param sheetName 工作表名称 * @return 二维数组,每行对应Excel的一行数据(跳过表头行) */ private String[][] getExcelData(String fileName, String sheetName) { String[][] arrayExcelData = null; // 使用try-with-resources自动关闭文件流,避免资源泄漏 try (FileInputStream fs = new FileInputStream(fileName)) { Workbook wb = Workbook.getWorkbook(fs); Sheet sh = wb.getSheet(sheetName); int totalCols = sh.getColumns(); int totalRows = sh.getRows(); // 跳过Excel表头(第一行),所以行数是totalRows-1 arrayExcelData = new String[totalRows - 1][totalCols]; for (int i = 1; i < totalRows; i++) { for (int j = 0; j < totalCols; j++) { // jxl的getCell是(列索引, 行索引),这里去除内容首尾空格避免意外错误 arrayExcelData[i - 1][j] = sh.getCell(j, i).getContents().trim(); } } } catch (FileNotFoundException e) { e.printStackTrace(); throw new RuntimeException("未找到指定Excel文件:" + fileName); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("读取Excel文件时发生IO错误"); } catch (BiffException e) { e.printStackTrace(); throw new RuntimeException("Excel文件格式错误(仅支持.xls格式)"); } return arrayExcelData; } // 测试完成后关闭浏览器,用@AfterClass确保只执行一次 @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } }
关键调整说明
- 移除冗余内部类:把
ReadExcelDataProvider内部类去掉,所有方法直接放在主类中,避免类结构混乱。 - 修正注解错误:
- 去掉
getExcelData和tearDown上的@Test注解,前者是辅助方法不需要作为测试用例,后者改用@AfterClass确保测试结束后只执行一次浏览器关闭操作。
- 去掉
- 利用DataProvider自动遍历数据:
- DataProvider会自动读取Excel的每一行数据(跳过表头),逐个传入
verifyRedirectURL方法,完全不需要自己写for循环。 - 方法参数
originalUrl对应Excel第0列的待访问URL,expectedRedirectUrl对应第1列的预期跳转URL。
- DataProvider会自动读取Excel的每一行数据(跳过表头),逐个传入
- 优化验证逻辑:
- 添加可选的等待条件,确保页面跳转完成后再获取当前URL,避免因页面加载慢导致断言失败。
- 断言时添加自定义错误信息,方便快速定位哪条URL的跳转验证失败。
- 提升代码健壮性:
- 使用
try-with-resources自动关闭文件流,避免资源泄漏。 - 对Excel读取的内容调用
trim(),去除首尾空格,避免因Excel中不小心输入的空格导致断言失败。 - 异常处理中抛出运行时异常,确保Excel读取失败时直接终止测试,避免后续无效执行。
- 使用
使用注意事项
- 确保项目已引入jxl(仅支持.xls格式)、TestNG和Selenium的依赖;如果需要支持.xlsx格式,可以改用Apache POI库。
- 替换代码中的
<你的Excel文件路径>为实际的Excel文件绝对路径。 - 如果跳转加载较慢,可以调整
WebDriverWait的等待时间,或者添加更具体的等待条件(比如等待目标页面的某个元素出现)。
内容的提问来源于stack exchange,提问作者TheAutomator
相关产品推荐
相关产品推荐

