在页面对象模型(例如SitePrism)中定义单选按钮有什么好处,而不是直接使用Capybara?

时间:2016-12-02 00:48:46

标签: ruby capybara pageobjects site-prism

我当前正在使用cucumber / ruby​​ / capybara / siteprism框架并实现测试页面。我已经达到了几页中每页有很多单选按钮(超过20个)的程度,我在想是否真的有任何好处,试图将所有这些按钮作为静态元素映射到我的页面对象模型?

即,考虑到这一点,在步骤定义中使用单选按钮的文本似乎更方便,并调用水豚'选择'直接的方法,如下所示,所以我不需要为那些20多个单选按钮做任何其他事情,它应该只通过改变我们传递的功能参数来工作:

cucumber feature:
  When I select that "I am over 18"

capybara step:
  When /^I select that "(.*)"$/ |option|
      choose(option)

对于像siteprism这样的页面对象模型,我想实现需要以类似于以下的格式独立定义和维护所有这些元素:

element :over_18_button, :radio_button, "I am over 18"
element :over_12_button, :radio_button, "I am over 12"
etc x50times

要使用它,应该创建页面,调用元素,这对我来说似乎不是直接的吗?

siteprism step:
  When /^I select that "(.*)"$/ |option|
     case option
        when 'I am over 18'
           over_18_button.click
        when 'I am over 12'
           over_12_button.click

我猜一个人可以创造“元素”。或“'部分'有一个数组到所有按钮,但是,然后,我们必须放置额外的逻辑来解析它们并在代码中的任何地方点击相关的一个,同时它将全部完成而不需要任何额外的使用'选择'进行编码或维护来自水豚的方法。

我是否正确地假设在这个例子中使用Capybara是一个更好的选择? 或者,如果能够更好地定义所有'页面对象模型中的Web元素,它的好处是什么?页面目标代码是否可以以不同的方式完成以利用任何可能的好处?

2 个答案:

答案 0 :(得分:0)

这种复杂的案例陈述是不必要的。

  When /^I select that I am over "(\d\d)"$/ |age|
   @page_object.select_age(age)

我不熟悉site_prism。我的watir_drops gem可以让你用相同的模式定义所有东西:

element(:age_button) { |age| browser.radio_button(text: "I am over #{age}")

在页面对象中使用此方法:

def select_age(age)
  age_button(age).set
end

我们也可以进行一场关于使用声明而不是命令性步骤的长篇讨论。此外,最佳实践页面对象使用避免直接调用已定义的元素。调用完成业务逻辑的方法和那些方法执行所有实现,包括元素定义和对它们的操作。

答案 1 :(得分:0)

老问题,但添加了重要的缺失信息

site_prism的工作方式允许您使用在Capybara中可以查询的任何内容来定义选择器。因此,如果您想使用文本定义收音机,则可以这样做。或您要使用的其他任何定位策略。

很显然,传统上我会建议使用CSS定位器( element :my_radio, text: 'foo'),因为它们最容易调试和重复使用。此外,OP建议他有50多个。如果它们相同,则可以将它们抽象到帮助器模块中,或者他甚至可以使用循环和索引对它们进行元编程(如果它们遵循简单的index_naming_pattern)