遵循 Ruby 中 "Methods return other PageObjects" 的测试自动化最佳实践

Following Test Automation best practise of "Methods return other PageObjects" in Ruby

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

在将 Appium 与 Java 一起使用时,我一直遵循他们的一个关键观点是: "Methods return other PageObjects"

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

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

e.g. @login_page = @home_page.goto_login_page

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

有人知道解决这个问题的好方法吗?

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

  • 您测试表单验证。单击工作流中后续的提交按钮 returns 页面对象,但在这种情况下,您仍停留在验证错误的页面上。您的页面对象不会知道它,并且会 return 另一个页面。
  • 单击按钮后到达的页面可能因上下文而异(例如,从其他页面到达当前页面)。它可能导致实际相同方法的多个版本,这将 return 不同的页面对象取决于上下文。这不好,而且把简单的事情复杂化了。

如果您想 return 当前页面对象,您可以从中受益,例如在 Java 中,当您 return this 方法结束时。然后,只要您在同一页面上,就可以链接执行的所有方法。但是当涉及到问题 'how to implement returning different page objects' - 答案很简单 - '就是不要'。请注意,您引用的 wiki 条目已经有一段时间没有更新了,最佳实践自最初发布以来已经有所发展。

经过大量研究并将众所周知的 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

只要在步骤定义的某个地方class明确创建一个新的页面对象(在上面的例子中:LaunchPage.new),那么所有后续页面都会提供智能感知method/property值,因为返回的结果页面类型将被 RubyMine.

知道

看来您已经有了解决方案。但是,对于其他人,也许对于您来说,calabash 的 x 平台方法使用页面对象,因此您可以查看该实现 https://github.com/calabash/x-platform-example

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

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