在页面对象模型(例如SitePrism)中定义无线电按钮而不是直接使用Capybara有任何好处



我正在使用cucumber/ruby/capybara/siteprism框架并目前实现测试页面。我达到了几页中每个页面有很多广播按钮(超过20)的地步,我在想尝试将所有这些按钮映射为我的页面对象模型中的所有静态元素是否有任何好处?p> ie,考虑到它,只使用"步骤定义"中的"无线电"按钮的文本并直接称为"选择"方法,这似乎更方便对于那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的"选择"方法进行任何额外的代码或维护。

我是否可以假设在此示例中,使用Capybara是一个更好的选择?或者,如果在页面对象模型中定义所有"所有"网络元素更好,那将是什么好处?可以以不同的方式完成页面对象代码来利用任何可能的好处?

不必要复杂的案例语句。

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

我不熟悉site_prism。我的watir_drops宝石会让您以相同的模式定义所有内容:

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

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

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

我们还可以就使用声明性而不是命令步骤进行整个漫长的讨论。此外,最佳实践页面对象使用避免了直接调用定义的元素。调用完成业务逻辑的方法,这些方法可以执行所有实现,包括元素定义及其动作。

旧问题,但添加重要的丢失信息

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

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

最新更新