使用TestNG+Selenium Java跨浏览器启动失败问题求助
让我来帮你排查这两个问题,我看了你的代码、配置和报错信息,找到了几个关键问题点,下面逐个解决:
问题1:直接运行类文件时的参数缺失报错
当你直接运行VerifyTitle类时,TestNG没办法读取testng.xml里配置的browser参数,而你的browsers方法通过@Parameters({"browser"})声明了必填参数,但没有标记@Optional,所以TestNG会抛出参数缺失的异常。
修复方案
给参数添加@Optional注解并指定一个默认值(比如默认用chrome),这样直接运行类时也能正常执行:
@Test(priority = 2) @Parameters({"browser"}) public void browsers(@Optional("chrome") String browsername) { // 原方法逻辑保持不变 }
不过更建议你跨浏览器测试统一通过testng.xml执行,这个修改只是为了避免直接运行类时报错。
问题2:通过XML运行时Chrome启动后测试失败
从日志可以看到ChromeDriver已经成功启动了,但测试最终失败,核心原因有两个:
2.1 URL缺少协议头
你代码里写的driver.get("www.yahoo.com");没有指定http://或https://协议头,Selenium会把这个地址当作相对路径处理,导致浏览器无法正确导航到Yahoo网站,进而触发测试失败。
修复方法
修改URL为带协议头的完整地址:
driver.get("https://www.yahoo.com");
2.2 ChromeDriver与Chrome浏览器版本不兼容
你使用的ChromeDriver版本是2.36,这个版本非常老旧,仅支持Chrome 63-65版本。如果你的Chrome是较新的版本(比如110+),两者版本不兼容会导致浏览器启动后无响应或崩溃,最终测试失败。
修复方法
- 打开Chrome浏览器,通过「设置→关于Chrome」查看当前浏览器版本
- 下载对应版本的ChromeDriver(注意:ChromeDriver大版本要和Chrome一致,比如Chrome 118.x对应ChromeDriver 118.x)
- 替换你项目中
Drivers/Windows目录下的chromedriver.exe文件
可选优化:添加资源清理
为了避免浏览器进程残留,建议在测试结束后关闭浏览器,添加一个@AfterMethod注解的方法:
import org.testng.annotations.AfterMethod; // ... 其他代码 ... @AfterMethod public void tearDown() { if (driver != null) { driver.quit(); } }
修改后的完整代码
package corssBrowsers; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class VerifyTitle { WebDriver driver; @Test(priority=1) public void sam() { System.out.println("Hello sam"); } @Test(priority = 2) @Parameters({"browser"}) public void browsers(@Optional("chrome") String browsername) { System.out.println(browsername); if(browsername.equalsIgnoreCase("chrome")) { System.out.println("You have selected " + browsername); System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\Drivers\\Windows\\chromedriver.exe"); driver = new ChromeDriver(); } else { System.out.println("You have not selected chrome"); } driver.manage().window().maximize(); driver.get("https://www.yahoo.com"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } @AfterMethod public void tearDown() { if (driver != null) { driver.quit(); } } }
按照以上步骤修改后,重新通过testng.xml运行测试,Chrome应该能正常启动并完成测试,直接运行类时也不会再出现参数缺失的报错了。
内容的提问来源于stack exchange,提问作者Sunny

