【问题标题】:Generics with Cucumber-jvm and Page Objects don't workCucumber-jvm 和页面对象的泛型不起作用
【发布时间】:2014-09-18 19:15:53
【问题描述】:

请帮忙: 我正在使用带有页面对象模式的 cucumber-jvm+WebDriver+jUnit+maven 进行自动化测试。

我想要一个可以返回多种类型对象的方法。 (不同的预期页面)。 在我过去,我使用泛型通过清晰的 java+Webdriver 来实现它。 在This Post 中有一个很好的解释。

但现在我想用黄瓜来补充它。

我的项目结构如下所示:

驱动基类:

public class DriverBase {
    public static WebDriver driver;

    @Before
    public void setUp() {
    driver = new FirefoxDriver();

    @After
    public void tearDown() throws Exception {
    driver.quit();
    }
}

用于页面对象之间交互的导航器类:

public class Navigator {
    DriverBase base;
    WebDriver driver;

    public NavigationActions(DriverBase base) {
        this.base = base;
        this.driver = base.driver;
    }

    public FirstPage openFirstPage(){
    driver.get("someUrl");
    return new FirstPage(base);
    } 
}

页面对象类:

public class FirstPage {
    WebDriver driver;
    DriverBase base;
    //...
    //Elements locators...
    //Some methods...
    //...
        public FirstPage(DriverBase base) {
            this.base = base;
            this.driver = base.driver;
            PageFactory.initElements(driver, this);
        }

     public <T> T openSecondOrThirdPage(String secondPgUrl, Class<T> expectedPage) {
     driver.get("secondPgUrl");
     return PageFactory.initElements(driver, expectedPage);
}

public class SecondPage {
    WebDriver driver;
    DriverBase base;
    //...
    //Elements locators...
    //Some methods...
    //...
        public SecondPage(DriverBase base) {
            this.base = base;
            this.driver = base.driver;
            PageFactory.initElements(driver, this);
        }
}

我的 StepsDefinition 类:

public class MyTestStepsDefs {
    DriverBase base;
    Navigator navigator;

@Given("^bla-bla$"){
    public void go_from_first_to_second_page() {
    navigator.openFirstPage().openSecondOrThirdPage("http://urlOfMyPage.com", SecondPage.class); 
}
@When("^blu-blu$")
    public void login_with_selected_role() {
System.out.println("Some log");
}
@Then("^blo-blo$")
    public void check_links_available(List<String> availableLinks) {
System.out.println("Some log");
}

所以,当我运行这个黄瓜测试时 - 在 openSecondOrThirdPage 方法上出现错误:

java.lang.RuntimeException: java.lang.InstantiationException: myprjct.pages.SecondPage
    at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:136)
    at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:66)
    at myprjct.pages.FirstPage.openSecondOrThirdPage(FirstPage.java:31)
    .......
Caused by: java.lang.InstantiationException: myprjct.pages.SecondPage
    at java.lang.Class.newInstance(Class.java:359)
    at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:133)
    at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:66)
    ........

请建议我,我做错了什么?

【问题讨论】:

  • 正如我所见,方法被声明为接受字符串类型的参数和泛型类 openSecondOrThirdPage(String secondPgUrl, Class&lt;T&gt; expectedPage) 但我假设你传递了错误的参数 openSecondOrThirdPage(driver, SecondPage.class) 因为我打赌你的 driver 是 WebDriver 类的一个实例.不是吗?
  • 是的,你是对的。 - 我已修复它 - 当我为帖子编写此示例时,这只是一个错误。

标签: java generics webdriver cucumber pageobjects


【解决方案1】:

您的问题可能是您的页面对象没有符合以下条件之一的构造函数:

  • 将“WebDriver”作为其唯一参数(public SomePage(WebDriver driver))。
  • 默认构造函数。

您的构造函数类似于 public SecondPage(DriverBase base),如果您为类编写带有参数的构造函数,那么 Java 不会生成默认构造函数,这可能是问题所在. PageFactory 无法实例化您的页面对象,因为它找不到合适的构造函数。

您可以在此处找到有关 PageFactory 的更多信息。 https://code.google.com/p/selenium/wiki/PageFactory

希望这会有所帮助。

【讨论】:

  • 非常感谢,朋友!你把我推向了正确的方向。我只使用 WebDriver 参数创建了我的页面对象,并且我在 StepsDef 类中使用了 SharedDriver。现在它工作正常。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
相关资源
最近更新 更多