Selenium Cucumber问题:通过Runner类执行时Feature文件无法识别Step Definition类
解决Cucumber测试中Feature无法关联Step Definition的问题
看起来你遇到了Cucumber测试里经典的「步骤未定义(Undefined Steps)」问题,同时还有PendingException导致的失败,我来帮你一步步排查和解决:
核心问题分析
从错误信息和代码来看,主要有几个关键问题:
- Cucumber依赖版本不兼容:你的Runner类用了旧版的
cucumber.api包,而Step Definition用了新版的io.cucumber包,版本混合会导致Cucumber无法识别步骤绑定。 - Feature步骤与Step Definition不匹配:Feature里的
When User enters and缺少参数,无法匹配Step Definition里的正则表达式(.*)。 - 主动抛出
PendingException:你的browser_open方法里主动抛出了这个异常,即使步骤匹配成功也会直接失败。
分步解决方案
1. 统一Cucumber依赖版本
Cucumber从4.x版本开始就迁移到了io.cucumber包,旧版的cucumber.api已经被弃用,所以需要修改Runner类的导入:
package StepDefinition; import org.junit.runner.RunWith; // 替换旧的导入为新版io.cucumber的包 import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; @RunWith(Cucumber.class) @CucumberOptions( features = {"src/test/resources/Features"}, monochrome = true, plugin = {"pretty","junit:target/JUnitReports/report.xml", "json:target/JSONReports/report.json", "html:target/HTMLReports"}, glue={"StepDefinition"}, strict = true, tags= {"@Login, @Home"} // ,dryRun = true ) public class RunnerClass { }
同时确保你的依赖管理文件(如Maven的pom.xml或Gradle的build.gradle)里所有Cucumber依赖的版本一致,比如用6.10.4版本:
<!-- Maven示例 --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>6.10.4</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>6.10.4</version> <scope>test</scope> </dependency>
2. 修复Feature文件的步骤参数
你的Step Definition里的@When注解用了(.*)来捕获用户名和密码,但Feature里的步骤没有提供参数,导致无法匹配。修改Alogin.feature:
@Login Feature: login check Scenario: Check if user can login Given User is on login page <!-- 添加具体的参数值,用引号包裹 --> When User enters "Admin" and "admin123" And I click on the login button Then I Print succesfully logged in
3. 移除不必要的PendingException
PendingException是用来标记未实现的步骤,你的browser_open方法已经实现了初始化浏览器的逻辑,所以要删掉这个抛出语句:
@Given("^User is on login page$") public void browser_open() throws Throwable{ System.setProperty("webdriver.chrome.driver","D:\\automation\\chrome driver new version\\87\\chromedriver.exe"); driver=new ChromeDriver(); driver.navigate().to("https://opensource-demo.orangehrmlive.com/"); // 移除这行代码 // throw new PendingException(); }
4. 额外检查点
- 确认
src/test/resources/Features目录下确实存在Alogin.feature和Bhome.feature文件,路径和Runner里的配置一致。 - 检查Step Definition类的包名是
StepDefinition,和Runner里glue={"StepDefinition"}的配置匹配,Cucumber会自动扫描这个包下的所有步骤类。
验证修改
完成以上修改后,重新运行Runner类,应该能看到步骤成功关联,不会再出现Undefined Steps的提示,同时PendingException的错误也会消失。
内容的提问来源于stack exchange,提问作者Konain
相关产品推荐
相关产品推荐

