【问题标题】:Spring Boot JUnit with Selenium ClassNotFoundException: org.apache.xml.utils.PrefixResolver带有 Selenium ClassNotFoundException 的 Spring Boot JUnit:org.apache.xml.utils.PrefixResolver
【发布时间】:2018-03-07 13:55:31
【问题描述】:

我正在尝试使用 selenium 运行一个简单的测试,但是当我运行我的测试时出现 ClassNotFoundException 并且我不知道要导入什么依赖项来解决这个问题。

我找不到任何与此不同的示例。

我正在使用 Java 8 和 spring-boot 1.5.10.RELEASE

你们能帮帮我吗?

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class VersaoControllerTest extends AbstractTest{

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebDriver webDriver;

    @Test
    public void test() {
        this.webDriver.get("/");
    }
}

pom.xml

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-api</artifactId>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit-driver</artifactId>
        <scope>test</scope>
    </dependency>

错误:

Caused by: java.lang.ClassNotFoundException: org.apache.xml.utils.PrefixResolver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_131]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[?:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_131]
    at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_131]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[?:1.8.0_131]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_131]
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~[?:1.8.0_131]
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) ~[?:1.8.0_131]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368) ~[?:1.8.0_131]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[?:1.8.0_131]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_131]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[?:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_131]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[?:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_131]
    at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.<clinit>(JavaScriptConfiguration.java:407) ~[htmlunit-2.21.jar:2.21]
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.<init>(JavaScriptEngine.java:129) ~[htmlunit-2.21.jar:2.21]
    at com.gargoylesoftware.htmlunit.WebClient.init(WebClient.java:239) ~[htmlunit-2.21.jar:2.21]
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:213) ~[htmlunit-2.21.jar:2.21]
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:204) ~[htmlunit-2.21.jar:2.21]
    at org.springframework.boot.test.web.htmlunit.LocalHostWebClient.<init>(LocalHostWebClient.java:40) ~[spring-boot-test-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration.mockMvcWebClientBuilder(MockMvcWebClientAutoConfiguration.java:55) ~[spring-boot-test-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration$$EnhancerBySpringCGLIB$$90ad153.CGLIB$mockMvcWebClientBuilder$0(<generated>) ~[spring-boot-test-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration$$EnhancerBySpringCGLIB$$90ad153$$FastClassBySpringCGLIB$$cf4a3653.invoke(<generated>) ~[spring-boot-test-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) ~[spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration$$EnhancerBySpringCGLIB$$90ad153.mockMvcWebClientBuilder(<generated>) ~[spring-boot-test-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) ~[spring-boot-test-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) ~[spring-test-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) ~[spring-test-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    ... 27 more

【问题讨论】:

    标签: java selenium spring-boot junit


    【解决方案1】:

    java.lang.ClassNotFoundException

    ClassNotFoundException 在 Java 中是 java.lang.Exception 的子类,当 Java 虚拟机 尝试加载特定类但在类路径中找不到请求的类时发生。这是一个已检查的异常,对于可能抛出 ClassNotFoundException 的事件需要显式异常处理方法,方法是使用 try-catch 块或使用 throws 子句。

    根据Java DocsClassNotFoundException 有以下几种情况:

    1. 当我们尝试使用 Class.forName() 方法加载类时,.class 文件或类的二进制文件在类路径中不可用。
    2. Classloader 尝试使用 findSystemClass() 方法加载类时。
    3. 在 Java 中使用 ClassLoader 类的 loadClass() 方法时。

    ClassNotFoundExcepiton 仅在 JVM 尝试在运行时加载类但与编译时无关时才会出现,这与 NoClassDefFoundError 不同。这是因为直到运行时JVM都不知道这个类,它只能通过上面指定的方法或使用Reflection从一些配置中读取类的名称然后加载这些配置文件中指定的类来完成。


    这个用例

    该错误确实提示我们出了什么问题,如下所示:

    Caused by: java.lang.ClassNotFoundException: org.apache.xml.utils.PrefixResolver
    

    根据 pom.xml,您已经清楚地分享了 &lt;version&gt;x.y.z&lt;/version&gt; 标记丢失。您需要更改 如下:

    • selenium-api

      <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api -->
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-api</artifactId>
          <version>3.10.0</version>
      </dependency>
      
    • selenium-htmlunit-driver

       <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-htmlunit-driver -->
       <dependency>
           <groupId>org.seleniumhq.selenium</groupId>
           <artifactId>selenium-htmlunit-driver</artifactId>
           <version>2.52.0</version>
       </dependency>
      

    当您使用 spring-boot 1.5.10 时,您可能还需要添加以下任一 &lt;dependency&gt;

    • selenium-java

      <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>3.10.0</version>
      </dependency>
      
    • selenium-server

      <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-server</artifactId>
          <version>3.10.0</version>
      </dependency>
      

    【讨论】:

    • 我做了所有这些配置,但现在我收到了这个错误:Archive for required library: 'C:/maven_repo/org/seleniumhq/selenium/selenium-remote-driver/2.53.1/selenium无法读取项目“WSLocaliza”中的 -remote-driver-2.53.1.jar' 或不是有效的 ZIP 文件
    • @brazuka 在我的回答中,我已经解决了您面临的ClassNotFoundException。新错误来自 Maven 存储库。我认为maven clean 可以解决您的问题。您能接受答案并根据您的新要求提出新问题吗?
    猜你喜欢
    • 2017-08-01
    • 2021-03-10
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2018-08-18
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多