使用Selenium-WebDriver与Spring Boot测试时应用加载失败问题
Spring Boot + Selenium WebDriver 测试加载失败问题
在使用Selenium-WebDriver与Spring Boot进行应用测试时,遇到应用加载失败的情况,具体表现为Spring容器创建WebDriver Bean时抛出NoSuchFieldError: Companion异常,导致测试无法正常运行。
Pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.8</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ksupwlt</groupId> <artifactId>stepcounttracker</artifactId> <version>0.0.1-SNAPSHOT</version> <name>stepcounttracker</name> <description>KSU Patient Weight Loss Tracker</description> <properties> <java.version>11</java.version> <selenium.version>3.141.59</selenium.version> <webdrivermanager.version>4.3.1</webdrivermanager.version> <testng.version>7.7.1</testng.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.14 </version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- WebDriverManager --> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>${webdrivermanager.version}</version> </dependency> <!-- Selenium Java --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>${selenium.version}</version> </dependency> <!-- TestNG --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>${testng.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.8</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <includes> <include>com.ea.SpringBasic.SpringTestNGTest</include> </includes> </configuration> </plugin> </plugins> </build> </project>
WebDriver配置类
import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebDriverLibrary { @Bean public WebDriver getChromeDriver(){ WebDriverManager.chromedriver().setup(); return new ChromeDriver(); } }
MainPage页面类
import org.openqa.selenium.WebDriver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MainPage { @Autowired private LandingPage landingPage; @Autowired private LoginPage loginPage; @Autowired private SignUpPage signUpPage; @Autowired private QuestionnairePage questionnairePage; @Autowired private UserProfilePage userProfilePage; @Value("${app.url}") private String appUrl; @Value("chrome") private String browser; @Autowired private WebDriver webDriver; public void PerformLogin(){ webDriver.navigate().to(appUrl); System.out.println(appUrl); landingPage.ClickLetStart(); loginPage.ClickLogin(); } }
测试类
@SpringBootTest class StepcounttrackerApplicationTests { @Autowired private MainPage mainPage; @Test void contextLoads() { mainPage.PerformLogin(); mainPage.EditUserProfile(); mainPage.PerformSignup(); mainPage.SubmitQuestion(); } }
错误信息
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'mainPage'的Bean时依赖不满足,其webDriver字段存在依赖问题;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建类路径资源[com/ksupwlt/stepcounttracker/libraries/WebDriverLibrary.class]中定义的'getChromeDriver' Bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException: 实例化[org.openqa.selenium.WebDriver]失败;工厂方法'getChromeDriver'抛出异常;嵌套异常为java.lang.NoSuchFieldError: Companion at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:136) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90) ... 71 more
解决方法
这个NoSuchFieldError: Companion异常核心原因是WebDriverManager与Selenium版本不兼容:
调整依赖版本匹配
WebDriverManager 4.3.1适配的是Selenium 4.x系列,而当前使用的Selenium 3.141.59属于旧版本,两者存在API差异。可以二选一调整:- 升级Selenium到兼容版本(比如4.1.4),修改pom.xml中的版本配置:
<properties> <java.version>11</java.version> <selenium.version>4.1.4</selenium.version> <webdrivermanager.version>4.3.1</webdrivermanager.version> <testng.version>7.7.1</testng.version> </properties> - 或者降级WebDriverManager到适配Selenium 3的版本(比如3.8.1)。
- 升级Selenium到兼容版本(比如4.1.4),修改pom.xml中的版本配置:
优化WebDriver Bean作用域
测试场景下,WebDriver作为单例Bean会在容器启动时提前初始化浏览器,建议将其作用域改为prototype,每次注入都创建新实例:@Configuration public class WebDriverLibrary { @Bean @Scope("prototype") public WebDriver getChromeDriver(){ WebDriverManager.chromedriver().setup(); return new ChromeDriver(); } }
内容的提问来源于stack exchange,提问作者Santhiya s
相关产品推荐
相关产品推荐

