我正在调查site_prism以在capybara中实现页面对象模型。它看起来很有趣。
如何指定选择器,例如“[data-id ='x']”,其中x是整数?像这样:
class Home < SitePrism::Page
set_url "http://www.example.com"
element :row, "[data-id='@id']"
end
然后在我的测试中:
Then /^the home page should contain a row$/ do
@home.should have_row 1234
end
答案 0 :(得分:4)
由于SitePrism在定义元素时设置了元素定位器,因此您建议的内容不起作用。要实现您的要求,请查看以下内容:
class Home < SitePrism::Page
elements :rows, "tr[data-id]"
def row_ids
rows.map {|row| row['data-id']}
end
end
不是映射单个行,而是映射它们(使用elements
而不是element
)。一个名为row_ids
的单独方法收集所有具有'data-id'值的行,将所有这些值映射到一个新数组中,然后返回该新数组。
测试将包含以下内容:
Then /^the home page should contain a row$/ do
@home.row_ids.should include @id
end
...将检查是否存在ID与@id
匹配的行。
不是很漂亮,但它应该有用。
答案 1 :(得分:3)
或者,如果您更喜欢这种方式,您可以更进一步了解Nat建议并将行元素定义为一个简单的方法,然后可以将id作为参数:
class Home < SitePrism::Page
elements :rows, "tr[data-id]"
def row_with_id(id)
rows.find {|row| row['data-id'] == id.to_s}
end
end
然后在您的步骤定义中
Then /^the home page should contain a row$/ do
@home.row_with_id(1234).should_not be_nil
end
答案 2 :(得分:0)
我通过执行以下操作解决了它 - 它是一个黑客,绝不是跟随页面对象模式。但我无法解决上面的答案。
Then I click on book 3 from the list
...
Then /^I click on book (.*) from the list$/ do |index|
page.method_find(index)
end
def method_find(index)
find(div > div > span.nth-child({index})).click
end