2

我正在使用site_prism在水豚中实现页面对象模型。它看起来很有趣。

如何指定选择器,例如“[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
4

3 回答 3

5

因为 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

不那么漂亮,但它应该工作。

于 2012-06-12T22:49:24.503 回答
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
于 2014-11-02T11:59:24.843 回答
0

我通过执行以下操作解决了它 - 它是一种 hack,并且绝不遵循页面对象模式。但我无法从上面找出答案。

我的特点:

 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
于 2015-07-29T16:12:22.920 回答