我使用带有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与页面对象模式来获得这些好处吗?
答案 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 - 它几乎相同,但步骤被包含在该特征文件所特有的类中 - 因此不会泄漏当前范围之外的对象。
答案 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的智能感知。"并查看该页面中可用的操作/方法。
有没有人有更好的解决方案?