如何解决TestNG中@BeforeSuite注解方法的Native Injection不支持错误
问题:TestNG @BeforeSuite注解方法报错导致测试用例跳过
使用Selenium 4.11.0、TestNG 7.9.0和Eclipse 2022-06开发项目时,启动Chrome Driver失败,测试用例被跳过,错误提示:Native Injection is NOT supported for @BeforeSuite annotated launchbrowser
错误日志
[RemoteTestNG] detected TestNG version 7.9.0 Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [Utils] MethodGroupsHelper.collectMethodsByGroup() took 8 ms. Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [Utils] MethodGroupsHelper.sortMethods() took 14 ms. ...(省略重复INFO日志) Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Running: C:\Users\prabh\AppData\Local\Temp\testng-eclipse-705038558\testng-customsuite.xml Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [Utils] DynamicGraphHelper.createDynamicGraph() took 5 ms. FAILED CONFIGURATION: @BeforeSuite commonfunctionalities.commonfunction.launchbrowser org.testng.TestNGException: Native Injection is NOT supported for @BeforeSuite annotated launchbrowser. at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:445) at org.testng.internal.Parameters.createParametersForMethod(Parameters.java:350) at org.testng.internal.Parameters.createParameters(Parameters.java:702) at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:166) at org.testng.internal.invokers.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:306) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:382) at org.testng.SuiteRunner.run(SuiteRunner.java:336) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) at org.testng.TestNG.runSuitesLocally(TestNG.java:1228) at org.testng.TestNG.runSuites(TestNG.java:1134) at org.testng.TestNG.run(TestNG.java:1101) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) SKIPPED: testcases.pending_leave_request.verifypendingleaverequest org.testng.TestNGException: Native Injection is NOT supported for @BeforeSuite annotated launchbrowser. at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:445) at org.testng.internal.Parameters.createParametersForMethod(Parameters.java:350) at org.testng.internal.Parameters.createParameters(Parameters.java:702) at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:166) at org.testng.internal.invokers.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:306) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:382) at org.testng.SuiteRunner.run(SuiteRunner.java:336) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) at org.testng.TestNG.runSuitesLocally(TestNG.java:1228) at org.testng.TestNG.runSuites(TestNG.java:1134) at org.testng.TestNG.run(TestNG.java:1101) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) =============================================== Default test Tests run: 1, Failures: 0, Skips: 1 Configuration Failures: 1, Skips: 0 =============================================== =============================================== Default suite Total tests run: 1, Passes: 0, Failures: 0, Skips: 1 Configuration Failures: 1, Skips: 1 =============================================== Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.reporters.jq.Main@6d07a63d: 48 ms Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.reporters.FailedReporter@59cba5a: 12 ms Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.reporters.XMLReporter@45a37759: 11 ms Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.reporters.EmailableReporter2@31add175: 7 ms Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@457c9034: 5 ms Feb 14, 2024 3:38:12 PM org.testng.log4testng.Logger info INFO: [TestNG] Time taken by org.testng.internal.ExitCodeListener@345f69f3: 1 ms
通用功能代码
package commonfunctionalities; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.concurrent.TimeUnit; public class commonfunction { public static WebDriver driver=null; public static Properties properties = null; public void loadpropertyfile() throws IOException { FileInputStream fileInputStream = new FileInputStream("C:\\Users\\prabh\\IdeaProjects\\OpenHrmProjects\\extras\\config.properties"); properties = new Properties(); properties.load(fileInputStream); } @SuppressWarnings("deprecation") @BeforeSuite public void launchbrowser(String driverlocation) throws IOException { loadpropertyfile(); String browser = properties.getProperty("browser"); String url = properties.getProperty("url"); String Driverlocation = properties.getProperty("Driverlocation"); if (browser.equalsIgnoreCase("firefox")) { System.setProperty("webdriver.gecko.driver",Driverlocation); driver = new FirefoxDriver(); } else if (browser.equalsIgnoreCase("chrome")) { System.setProperty("webdriver.chrome.driver",Driverlocation); driver = new ChromeDriver();} driver.manage().window().maximize(); driver.get(url); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } @AfterSuite public void teardown() { driver.quit(); } }
解决方法
1. 移除@BeforeSuite方法的多余参数
TestNG不支持给@BeforeSuite注解的方法使用原生依赖注入传递参数,你的launchbrowser方法定义了String driverlocation参数,但该参数既未被使用,也不符合TestNG的参数传递规则。直接移除这个参数即可:
修改后的launchbrowser方法:
@SuppressWarnings("deprecation") @BeforeSuite public void launchbrowser() throws IOException { loadpropertyfile(); String browser = properties.getProperty("browser"); String url = properties.getProperty("url"); String Driverlocation = properties.getProperty("Driverlocation"); if (browser.equalsIgnoreCase("firefox")) { System.setProperty("webdriver.gecko.driver",Driverlocation); driver = new FirefoxDriver(); } else if (browser.equalsIgnoreCase("chrome")) { System.setProperty("webdriver.chrome.driver",Driverlocation); driver = new ChromeDriver(); } driver.manage().window().maximize(); driver.get(url); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); }
2. 可选优化建议
- Selenium 4.11.0已支持自动管理Driver,无需手动设置
System.setProperty,可以引入WebDriverManager库简化Driver管理,避免路径配置错误。 implicitlyWait已被标记为过时,建议替换为driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));(需导入java.time.Duration类)。
内容的提问来源于stack exchange,提问作者Prabhakar
相关产品推荐
相关产品推荐

