【问题标题】:Selenium Page Objects: Why should I return this?Selenium 页面对象:我为什么要返回这个?
【发布时间】:2017-11-01 16:30:06
【问题描述】:

阅读SeleniumHQ's pageobject documentation 他们指定了从不导航到其他页面的方法返回“this”的示例。我的问题是为什么?

我认为页面对象的状态可能是一个原因,但是页面本身(实际的 UI 页面)可能会更改状态或刷新,但页面对象本身不会。 Page Factory 及其 @FindBy 注释已经确保每次调用每个 WebElement 时都会找到它,因此元素的状态似乎与这种情况无关。

【问题讨论】:

    标签: selenium pageobjects page-factory


    【解决方案1】:

    想想他们的例子

    public LoginPage typeUsername(String username) {
        driver.findElement(usernameLocator).sendKeys(username);
        return this;    
    }
    
    public LoginPage typePassword(String password) {
        driver.findElement(passwordLocator).sendKeys(password);
        return this;    
    }
    
    public HomePage submitLogin() {
        driver.findElement(loginButtonLocator).submit();
        return new HomePage(driver);    
    }
    

    现在假设我们已经创建了页面对象 create as page。如果你没有返回任何你的代码想要的东西

    page.typeUsername("tarun");
    page.typePassword("lalwani");
    HomePage newPage = page.submitLogin()
    

    但是当你返回这个时,它允许你做方法链。所以我可以像下面这样使用它

    HomePage newPage = page.typeUsername("tarun").typePassword("lalwani").submitLogin()
    

    如您所见,IDE 智能感知将为您节省一些编码工作,并且更加优雅

    【讨论】:

    • 感谢您的回答和示例。这实际上是有道理的。添加它没有任何后果,它提供了新的选项来在实现/测试端保存一些代码。
    【解决方案2】:

    它允许方法链接,如 Tarun 的回答所示,但它也捕获流。如果从登录页面登录将您路由到主页,那么您的登录方法将返回一个主页页面对象。如果该流程发生变化,您将更新您的登录方法以返回一些其他页面对象,这将在 IDE 中导致流程失败的任何地方出现错误。它可以帮助您更快地找到需要修复的地方。

    话虽如此,我不会在我的方法中返回页面对象。我不是页面对象的方法链接的忠实粉丝。我认为它掩盖了测试流程,因为您可能会因为将太多方法链接在一起而无法跟踪您所在的页面。

    通过返回页面对象,您还必须为错误情况编写额外的方法等。您可以在他们的示例中看到这一点。有一个返回主页的submitLogin() 方法和一个返回登录页面的submitLoginExpectingFailure() 等等。对我来说,我没有发现比额外代码和阅读测试流程的困难更重要的好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多