Java 页面对象模型最佳实践 - 新对象

标签 java automation cucumber pageobjects

在 Java 页面对象模型中创建步骤时实例化对象的最佳方法是什么?

有谁知道Cucumber脚本是如何编译的吗?

我想如果一切都已构建并遵守,下面的第二个或第三个选项可能是最好的方法。

如果只编译与正在执行的测试相关的步骤,那么我想这将是第一个。

我有以下示例:

private LoginPage loginPage = new LoginPage(driver);

@Given("^I have logged in as customer with two stored cards$")
public void iHaveLoggedInAsCustomerWithTwoStoredCards() throws Throwable {
    new HomePage(driver).clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d1a5b4a2a591a5b4a2a5ffb2bebc" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

@Given("^I have logged in as customer with expired card$")
public void iHaveLoggedInAsCustomerWithExpiredCard() throws Throwable {
    new HomePage(driver).clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="99edfceaeda9abd9edfceaedb7faf6f4" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

@Given("^the user logged in as customer with three stored cards$")
public void theUserLoggedInAsCustomerWithThreeStoredCards() throws Throwable {
    new HomePage(driver).clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0175647275313241756472752f626e6c" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

以上所有步骤(以及同一 LoginSteps.java 类中的更多步骤)均以

开头
new HomePage(driver).clickLoginButton();

这是最好的方法,还是创建单个实例更好?

private LoginPage loginPage = new LoginPage(driver);
private HomePage homePage = new HomePage(driver);

@Given("^I have logged in as customer with two stored cards$")
public void iHaveLoggedInAsCustomerWithTwoStoredCards() throws Throwable {
    homePage.clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="344051474074405147401a575b59" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

@Given("^I have logged in as customer with expired card$")
public void iHaveLoggedInAsCustomerWithExpiredCard() throws Throwable {
    homePage.clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="89fdecfafdb9bbc9fdecfafda7eae6e4" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

@Given("^the user logged in as customer with three stored cards$")
public void theUserLoggedInAsCustomerWithThreeStoredCards() throws Throwable {
    homePage.clickLoginButton();
    loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4236273136727102362731366c212d2f" rel="noreferrer noopener nofollow">[email protected]</a>");
    loginPage.enterPassword("Password1");
    loginPage.clickLogin();        
}

或者在 LoginSteps 扩展的“baseSteps”类中实例化所有页面是否会更有效?

public class LoginSteps extends BaseSteps {
    @Given("^I have logged in as customer with two stored cards$")
    public void iHaveLoggedInAsCustomerWithTwoStoredCards() throws Throwable {
        homePage.clickLoginButton();
        loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="710514020531051402055f121e1c" rel="noreferrer noopener nofollow">[email protected]</a>");
        loginPage.enterPassword("Password1");
        loginPage.clickLogin();        
    }

    @Given("^I have logged in as customer with expired card$")
    public void iHaveLoggedInAsCustomerWithExpiredCard() throws Throwable {
        homePage.clickLoginButton();
        loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0d79687e793d3f4d79687e79236e6260" rel="noreferrer noopener nofollow">[email protected]</a>");
        loginPage.enterPassword("Password1");
        loginPage.clickLogin();        
    }

    @Given("^the user logged in as customer with three stored cards$")
    public void theUserLoggedInAsCustomerWithThreeStoredCards() throws Throwable {
        homePage.clickLoginButton();
        loginPage.enterEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c58495f581c1f6c58495f58024f4341" rel="noreferrer noopener nofollow">[email protected]</a>");
        loginPage.enterPassword("Password1");
        loginPage.clickLogin();        
    }
}

public baseSteps {

    protected LoginPage loginPage = new LoginPage(driver);
    protected HomePage homePage = new HomePage(driver);
}

最佳答案

我会进行基准测试,看看哪个版本最有效。

Cucumber 代码的编译方式取决于您的构建工具。我假设一切都在使用之前进行了编译。但是,在执行一段时间后进行 self 优化的 JVM 可能在一段时间后表现会有所不同。

我真的很想听听您为什么要考虑这个级别的性能?您是否希望一次执行此代码几个小时?我的大多数场景都很短,在第二个尺度上执行,然后就被扔掉了。

关于Java 页面对象模型最佳实践 - 新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572760/

相关文章:

user-interface - 在 Windows 上通过 OpenSSH 启动 GUI 程序?

ruby - 如何为 Webrat、Mechanize 设置 "base URL"

ruby-on-rails - 测试和 cucumber 环境中的 Config.gem

java - 检查经过身份验证的用户是否可以访问 URL

java - 当 onBackPressed() 被覆盖时保留过渡动画

java - 在网页上搜索 iframe

delphi - 如何加快 Delphi XE2 的文字自动化速度

java - 如何划分以不同语言特定字符开头的名称字符串

python - 自动将 jupyter notebook 转换为 .py

java - 带有 Guice 的 cucumber - 多 guice 注入(inject)器