无法实例化测试步骤类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法实例化测试步骤类相关的知识,希望对你有一定的参考价值。
我有以下jar文件添加到我的项目中:
- 小黄瓜2.12
- cucumber-junit 1.2.5
- cucumber-java 1.2.5
- 黄瓜核心1.2.5
- 黄瓜jvm-deps 1.0.5
- 报道2.1.1
- mockito all 1.9.1
- 黄瓜报告3.13
我尝试运行测试运行器类时遇到错误:
cucumber.runtime.CucumberException: Failed to instantiate class stepDefinition.Test_steps
测试跑步者类:
package CucumberTest;
import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
import cucumber.api.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(
features = "Feature"
,glue={"stepDefinition"}
)
public class TestRunner {
}
Test_steps类
package stepDefinition;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import PageObject.LoginVariables;
import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class Test_steps {
private static WebDriver driver = null;
WebDriverWait wait = new WebDriverWait(driver, 60);
@Given("^User is on Homepage$")
public void user_is_on_Homepage() throws Throwable {
// Write code here that turns the phrase above into concrete actions
driver = new ChromeDriver();
System.setProperty("webdriver.chrome.driver", "C:Seleniumchromedriver.exe");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://test.salesforce.com");
throw new PendingException();
}
@When("^User Enters userId and Password$")
public void user_Enters_userId_and_Password() throws Throwable {
// Write code here that turns the phrase above into concrete actions
wait.until(ExpectedConditions
.visibilityOfElementLocated(By.xpath(LoginVariables.login_xpath)))
.sendKeys("username@mail.com");
wait.until(ExpectedConditions
.visibilityOfElementLocated(By.xpath(LoginVariables.password_xpath)))
.sendKeys("password");
wait.until(ExpectedConditions
.visibilityOfElementLocated(By.xpath(LoginVariables.login_xpath))).click();
throw new PendingException();
}
@Then("^User is able to login sucessfully in salesorce$")
public void user_is_able_to_login_sucessfully_in_salesorce() throws Throwable {
// Write code here that turns the phrase above into concrete actions
System.out.println("User Login Sucessful");
throw new PendingException();
}
}
文件夹结构:
答案
问题出现在下面代码的第二行,因为“wait”初始化时“driver”对象为null,并导致NullPointerException。
private static WebDriver driver = null;
WebDriverWait wait = new WebDriverWait(driver, 60);
您应该在Before钩子上初始化“驱动程序”,或者在“驱动程序”初始化之后初始化“等待”。
另一答案
在我看来你的文件夹结构是错误的,我将TestRunner放在测试包的顶部,而不是src包。 pageobjects和stepdef也属于测试包而不是src,并且功能文件属于test resources文件夹。
另一答案
初看起来@AndréBarbosa的答案看起来很有希望。但是,您需要处理下面提到的所有这些方面:
- 当您尝试将
WebDriver
实例强制转换为WebDriverWait
时,如下所示驱动程序为null,这应该会在运行时给您一个NullPointerException。但似乎我们甚至没有到达这里。private static WebDriver driver = null; WebDriverWait wait = new WebDriverWait(driver, 60);
- 正如你使用
WebDriverWait
一样,你应该完全删除ImplicitlyWait
,因为documentation
清楚地说:WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.
- 理想情况下,每个元素(
javascript
/AJAX Call
除外)都不会需要60秒才能看到/可点击/可互动。因此,您可以动态如下:new WebDriverWait(driver, 5).until(ExpectedConditions.visibilityOfElementLocated(By.id("element_xpath"))).sendKeys("value");
Feature Folder
认为我是主要关注点。Feature
文件夹和LogIn.feature
文件看起来未使用。如果您从其他项目移动或复制了Feature
文件夹,则可能会发生这种情况。因此,解决方案将完全删除Feature
文件夹,并通过您的Feature
创建一个新的LogIn.feature
文件夹和IDE
文件(不是通过其他软件Notepad
或Textpad
或SubLime3
),如下图所示(New
- >File
):
- 在你的
Project Workspace
清理你IDE
并执行Test
- 在
CCleaner
之前和之后运行Test Execution
工具来擦除所有操作系统的杂务。
注意:不要
move
/copy
功能file(s)
/directory(ies)
。删除unwanted
并仅通过IDE
创建一个新的。
以上是关于无法实例化测试步骤类的主要内容,如果未能解决你的问题,请参考以下文章