我和我的团队建立了一个规则,即我们的全局页面变量应该始终引用正确的模型。我们没有直接设置模型,而是使用了一些助手。
我们还建立了页面定义和步骤在同一个文件中进行的约定。示例some_page.rb
class SomePage < SitePrism::Page
set_url '/lol'
set_url_matcher /#{@target}\/lol/
element :button, 'button'
element :some_image, 'img'
end
Given /^I have reached SomePage$/ do
load_page SomePage
end
When /^I click a button on Some Page$/ do
@page.button.click
end
Then /^I should be on Some Page$/ do
ensure_page SomePage
end
Then /^Some Page should have an image$/ do
@page.should have_some_image
end
这可能看起来很奇怪,并且与各种最佳实践背道而驰——但这对我的团队来说非常有用。通过将步骤定义与它们各自的页面结合在一起,您始终可以准确地知道 @page 在您的定义中所指的内容,并且查找和查看元素被映射为(或添加更多映射)要容易得多。您还可以获得快速了解您已经为任何特定页面编写的步骤,从而减少重复的步骤定义。
在极少数情况下,一个步骤定义用于多个页面,然后我们有一个单独的帮助文件用于它们所在的位置。
我们有一些帮助程序用于设置和使用全局 @page 变量。使用这些,另一个约定是从不@page = SomePage.new
或@page.should be_displayed
set_page 用于将全局变量设置为所提供页面的实例。它还确保显示预期的页面,并调用 page#set_up。我们所有的页面都继承自一个 masterpage 类,该类有一个空的 set_up 方法。我们可以在页面上定义 set_up 以在特定页面加载时添加任何类型的初始化代码。
def set_page page_model
@page = page_model.new
# Ensure the expected page is actually displayed
ensure_page page_model
# Call the set_up method on the page
@page.set_up
end
每当我们想确保我们在正确的页面上时,都会使用 ensure_page 。它用于确保全局变量引用正确的页面以及当前显示的页面。这是用来代替传统的PageModel.new.should be_displayed
def ensure_page page_model
unless @page.is_a? page_model
raise PageModelIncorrect.new "@page is a #{@page.class} when #{page_model} was expected.\nCurrent URL: #{current_url}"
end
@page.should be_displayed
end
使用 load_page 代替传统的PageModel.new.load args
. 它使用提供的参数自动加载页面,然后使用上述方法设置全局变量,然后确保页面显示。
def load_page(page_model, *args)
page = page_model.new
page.load(*args)
set_page page_model
end