我是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是什么类型,因此您无法获得智能感知的任何好处,以显示给定页面可用的方法。
任何人都知道这方面的好方法吗?
答案 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知道。