无法实例化测试步骤类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法实例化测试步骤类相关的知识,希望对你有一定的参考价值。

我有以下jar文件添加到我的项目中:

  1. 小黄瓜2.12
  2. cucumber-junit 1.2.5
  3. cucumber-java 1.2.5
  4. 黄瓜核心1.2.5
  5. 黄瓜jvm-deps 1.0.5
  6. 报道2.1.1
  7. mockito all 1.9.1
  8. 黄瓜报告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文件(不是通过其他软件NotepadTextpadSubLime3),如下图所示(New - > File):

New_Feature_File_Folder

  • 在你的Project Workspace清理你IDE并执行Test
  • CCleaner之前和之后运行Test Execution工具来擦除所有操作系统的杂务。

注意:不要move / copy功能file(s) / directory(ies)。删除unwanted并仅通过IDE创建一个新的。

以上是关于无法实例化测试步骤类的主要内容,如果未能解决你的问题,请参考以下文章

片段事务中的实例化错误

Android - 试图实例化一个不是片段的类

启用 Proguard 后无法实例化片段

调用片段活动错误无法实例化活动。无法转换为 android.app.Activity

我如何使用Java反射来实例化无法导入的类?

将ehcache添加到DAO类后Junit测试失败,无法在测试类中实例化DAO