原创

测试类中试图启动ChromeDriver但是报No System TLS错误

测试类中试图启动ChromeDriver但是报No System TLS错误

1. 问题再现

当我试图在JUnit中运行以下测试代码启动 ChromeDriver 时,会报 java.lang.AssertionError: No System TLS 错误。

 @Test
 public void test() {
     String property = System.getProperty("javax.net.ssl.trustStore");
     System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver_119.0.6045.106.exe");
     ChromeOptions options = new ChromeOptions();
     options.addArguments("--start-maximized");
     options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
     options.setAcceptInsecureCerts(true);
     options.addArguments("--incognito");
     ChromeDriver chromeDriver = new ChromeDriver(options);
 }

错误信息栈为:

java.lang.AssertionError: No System TLS
	at okhttp3.internal.Util.assertionError(Util.java:502)
	at okhttp3.internal.Util.platformTrustManager(Util.java:672)
	at okhttp3.OkHttpClient.<init>(OkHttpClient.java:248)
	at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:927)
	at org.openqa.selenium.remote.internal.OkHttpClient$Factory$1.createClient(OkHttpClient.java:158)
	at org.openqa.selenium.remote.http.HttpClient$Factory.createClient(HttpClient.java:82)
	at org.openqa.selenium.remote.HttpCommandExecutor.<init>(HttpCommandExecutor.java:89)
	at org.openqa.selenium.remote.HttpCommandExecutor.<init>(HttpCommandExecutor.java:72)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.<init>(DriverCommandExecutor.java:63)
	at org.openqa.selenium.chrome.ChromeDriverCommandExecutor.<init>(ChromeDriverCommandExecutor.java:46)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
	at core.BrowserExtractorTest.test(BrowserExtractorTest.java:342)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
	at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
	at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
	at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
	at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
	at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
	at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
	at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: java.security.NoSuchAlgorithmException: class configured for TrustManagerFactory: sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory not a TrustManagerFactory
	at sun.security.jca.GetInstance.checkSuperClass(GetInstance.java:260)
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:237)
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
	at javax.net.ssl.TrustManagerFactory.getInstance(TrustManagerFactory.java:139)
	at okhttp3.internal.Util.platformTrustManager(Util.java:662)
	... 43 more
Disconnected from the target VM, address: '127.0.0.1:51294', transport: 'socket'
Process finished with exit code -1

2. 解决办法

我在该测试类中事先加载了下面三个 PowerMockito 注解:@RunWith(PowerMockRunner.class)@PrepareForTest({BrowserExtractor.class, FileUtil.class})@PowerMockIgnore({"javax.management.*"})

此时还需要在注解 @PowerMockIgnore() 中添加: @PowerMockIgnore({"javax.management.*", "javax.net.ssl.*"})

这样浏览器驱动就能启动了。

Java
  • 作者:CoCo(联系作者)
  • 发表时间:2024-03-28 19:00:54
  • 更新时间:2024-03-28 19:00:54
  • 版权声明 © 原创不易,转载请注明出处
  • 留言