【问题标题】:Do we really need to instantiate the constructor in a method for Selenium Java?我们真的需要在 Selenium Java 的方法中实例化构造函数吗?
【发布时间】:2017-12-20 10:51:06
【问题描述】:

在 Java Selenium 中,为什么我需要在方法中实例化构造函数?

public class Navigation extends BasePage {
public Navigation(WebDriver driver) {
    super(driver);
}

public Navigation visitUsSite() {
    driver.navigate().to("https://www.randomwebsite.com"));
    return new Navigation(driver);
}
}

上面不是和下面一样有效吗:

public class Navigation extends BasePage {
public Navigation(WebDriver driver) {
    super(driver);
}

public void visitUsSite() {
    driver.navigate().to("https://www.randomwebsite.com");
}
}

【问题讨论】:

  • 你为什么不试试呢?
  • 一个返回Navigation,另一个什么也不返回。如果你不使用返回值,对你可能没有区别,但它们绝对不一样。顺便说一句,您不返回构造函数,也不实例化构造函数。您使用(调用/调用)构造函数来实例化一个对象。不是构造函数,而是方法返回的对象实例。
  • 我都执行了,它们都有效。我只是很好奇为什么网上这么多教程建议在方法中返回构造函数?
  • @Samranator 这是一个基于页面对象概念的良好编码实践。当您通过单击按钮或链接离开当前页面时,您希望将新页面的页面对象返回给调用方法。在您的情况下,您返回的是同一页面,所以看起来有点矫枉过正。

标签: java selenium pageobjects


【解决方案1】:

您不必返回该类的实例,但在许多情况下它非常有用。 正如@Grasshopper 在 cmets 中所写,已经创建一个与您正在打开的新页面相对应的类的实例很有用。例如,您有一个包含以下内容的登录页面: 1) 用户名​​字段 2) 密码字段 3) 登录按钮

输入用户名和密码的方法如下:

public class LoginPage extends BasePage {

    public LoginPage (WebDriver driver) {
        super(driver);
    }

    public LoginPage enterUsername(String username) {
        WebElement usernameField = driver.findElementBy...;
        usernameField.sendKeys(username);
        return this; // returns this instance because it stays on the LoginPage
    }

    public LoginPage enterPassword (String password) {
        WebElement passwordField = driver.findElementBy...;
        passwordField.sendKeys(password);
        return this; // returns this instance because it stays on the LoginPage
    }
}

然后你有一个点击登录按钮的方法,它会将你重定向到主页。

public HomePage clickLoginButton () {
        WebElement loginButton = driver.findElementBy...;
        loginButton.click();
        return new HomePage(driver); // returns a new instance on the HomePage because homepage will be opened
    }

返回 'this' 实例并返回一个新实例的最酷之处在于,在您的测试类中,您可以一个接一个地使用您的方法,而不会出现乱七八糟的代码:

LoginPage loginPage = new LoginPage(driver);
loginPage.enterUsername("username")
      .enterPassword("password");
HomePage homepage = loginPage.clickLoginButton();

【讨论】:

  • 这很有帮助!学到了一些新东西,很高兴可以使步骤定义代码看起来不那么冗长。非常感谢你和@Grasshopper
猜你喜欢
  • 2011-04-08
  • 2011-12-13
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多