Site Prism,Capybara:变量选择器

时间:2012-05-30 23:52:03

标签: ruby ruby-on-rails-3 capybara pageobjects site-prism

我正在调查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

3 个答案:

答案 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