Ruby是否与严格的页面对象模式兼容?

时间:2015-06-26 10:33:30

标签: java ruby testing automation pageobjects

我使用带有Java的页面对象模式(https://code.google.com/p/selenium/wiki/PageObjects)构建了各种测试自动化框架。

我发现的两大好处是:

1)当您有一个页面实例时,您可以看到可用的方法(例如,键入homepage.将显示您可以从主页调用的所有操作/方法)

2)由于导航方法(例如goToHomepage())会返回后续页面的实例(例如主页),因此您只需编写代码并查看它所在的位置即可浏览测试。

e.g。

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser);
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage();

这些好处与Java完美配合,因为IDE知道对象的类型(或本例中的页面)。

但是,对于Ruby,对象类型在任何时候都不固定,并且通常对IDE不明确。因此,我无法看到如何在使用Ruby构建的自动化套件中实现这些优势(例如,使用Cucumber)。

有人能告诉我如何使用Ruby与页面对象模式来获得这些好处吗?

3 个答案:

答案 0 :(得分:9)

通过一些进一步的调查,看起来可以使用实例变量来实现初始要求:

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),就会出现所有后续页面并提供智能感知方法/属性值。

答案 1 :(得分:6)

我使用Spinach而不是Cucumber - 它几乎相同,但步骤被包含在该特征文件所特有的类中 - 因此不会泄漏当前范围之外的对象。

https://github.com/codegram/spinach

答案 2 :(得分:3)

从聊天到同事,我怀疑以下可能是最佳解决方案(但如果存在更好的解决方案,请发布替代答案):

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

因此,在上面的示例中,我们在页面导航时不返回后续页面的实例(因为返回的页面只是一种未知类型的对象)。另外,我们需要创建一个我们所在页面的新实例(使用" .new"),这样至少我们可以获得键入" movie_page的智能感知。"并查看该页面中可用的操作/方法。

有没有人有更好的解决方案?