遵循测试自动化的最佳实践"方法返回其他PageObjects"在Ruby中

时间:2015-07-20 09:24:34

标签: ruby testing automation calabash pageobjects

我是Selenium专家定义的页面对象模式(POP)的主要倡导者: https://code.google.com/p/selenium/wiki/PageObjects

在使用Appium和Java时我一直遵循的关键视图是: "方法返回其他PageObjects"

e.g. LoginPage loginPage = homePage.gotoLoginPage();

我现在正在尝试使用Ruby使用Calabash跟踪POP,所以一直在编写这样的代码:

e.g. @login_page = @home_page.goto_login_page

但是,由于Ruby不知道@login_page是什么类型的对象,或者@home_page是什么类型,因此您无法获得智能感知的任何好处,以显示给定页面可用的方法。

任何人都知道这方面的好方法吗?

4 个答案:

答案 0 :(得分:3)

尽管我欣赏并应用PO设计模式,但我不同意页面对象返回页面对象。页面对象应该是独立的,不需要知道其他页面对象。看两个例子:

  • 您测试表单验证。单击“提交”按钮可返回工作流程中后续的页面对象,但在这种情况下,您将保留在页面上并显示验证错误。您的页面对象不知道它并将返回另一页。
  • 点击按钮后可以看到的页面可能因上下文而异(例如,从您到达当前页面的其他页面)。它可能导致实际上具有相同方法的多个版本,这将根据上下文返回不同的页面对象。这并不好,而且过于简单。

如果您想要返回当前页面对象,您可以从中受益,例如在Java中,当您在方法结束时返回this时。然后,只要您在同一页面上,就可以链接所有执行的方法。但是当谈到问题时如何实现返回不同的页面对象' - 答案很简单 - '只是“不要”。请注意,您引用的wiki条目尚未及时更新,最佳实践自最初发布以来已经发生变化。

答案 1 :(得分:0)

好像你已经有了解决方案。但是对于其他人而且也许对你来说,x-platform的calabash方法使用了页面对象,所以你可以检查一下这个实现https://github.com/calabash/x-platform-example

答案 2 :(得分:0)

另一种方法如下。不像我想的那样整洁(考虑到需要手动创建后续页面的新实例),但作为替代选项提供:

When(/^I buy a movie from the movie page$/) do
  movie_page = MoviePage.new
  movie_page.buyMovie("Test Movie")
  purchase_page = PurchasePage.new
  purchase_page.confirmPurchase
end

答案 3 :(得分:-1)

经过大量研究并将众所周知的Java / C#/ Obj-c原则应用于Ruby后,找到了一种方法:

Given(/^I am on the launch page$/) do
  @launch_page ||= LaunchPage.new
end

When(/^I open the set alarm time page$/) do
  @set_alarm_page = @launch_page.goto_set_alarm_page
end

When(/^I open our apps from the home page$/) do
  @launch_page.navigation_toolbar.open_our_apps
end

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time|
  alarm_time_actual = @launch_page.get_alarm_time
  assert_equal(alarm_time, alarm_time_actual)
end

只要在步骤定义类的某个地方你显式创建一个新的页面对象(在上面的例子中:LaunchPage.new),那么所有后续页面都将提供intellisense方法/属性值,因为返回的结果页面类型将是由RubyMine知道。