Java Ruby与严格的页面对象模式兼容吗?

Java Ruby与严格的页面对象模式兼容吗?,java,ruby,testing,automation,pageobjects,Java,Ruby,Testing,Automation,Pageobjects,我使用Java()的页面对象模式构建了各种测试自动化框架 我发现的两大好处是: 1) 当您有一个页面实例时,您可以看到可用的方法(例如键入主页。将显示您可以从主页调用的所有操作/方法) 2) 因为导航方法(例如goToHomepage())返回后续页面(例如主页)的实例,所以您只需编写代码并查看代码的位置,就可以在测试中导航 e、 g 这些好处在Java中非常有效,因为IDE知道对象(或本例中的页面)的类型 然而,对于Ruby,对象类型在任何时候都是不固定的,并且对于IDE来说常常是不明确的。因

我使用Java()的页面对象模式构建了各种测试自动化框架

我发现的两大好处是:

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

2) 因为导航方法(例如
goToHomepage()
)返回后续页面(例如主页)的实例,所以您只需编写代码并查看代码的位置,就可以在测试中导航

e、 g

这些好处在Java中非常有效,因为IDE知道对象(或本例中的页面)的类型

然而,对于Ruby,对象类型在任何时候都是不固定的,并且对于IDE来说常常是不明确的。因此,我看不出如何在使用Ruby构建的自动化套件上实现这些好处(例如,使用Cucumber)


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

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

因此,在上面的示例中,在页面周围导航时,我们不会返回后续页面的实例(因为返回的页面只是未知类型的对象)。此外,我们需要为我们所处的任何页面创建一个新实例(使用“.new”),这样我们至少可以通过键入“movie_page.”并查看该页面中有哪些可用的操作/方法来获得intellisense的好处


有谁有更好的解决方案吗?

通过进一步调查,似乎可以使用实例变量满足初始要求:

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方法/属性值

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


这是我在ruby中使用的方法。我认为这是最清晰的工作方式。但是,我确实定义了“@movie_page | |=MoviePage.new”,这样我就可以在其他步骤中重用页面对象实例,而无需创建比我需要的更多的对象。这也使您能够在该页面实例中的步骤之间存储变量。一般来说,我会避免这种情况,因为从维护角度来看,设置位置并不总是很清楚,但在某些情况下,它确实比在cucumber步骤中使用许多@变量更易于使用。请添加指向您提到的资源的链接,以尽可能提供帮助。使用链接编辑:-)
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
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