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

问题描述 投票:0回答:2

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

即,考虑一下,在步骤定义中使用单选按钮的文本并直接调用capybara'choose'方法似乎更方便,如下所示,这样我就不需要做任何其他事情了对于那些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

我想可以创建一个带有数组的'elements'或'section'到所有按钮,但是,我们将不得不放置额外的逻辑来解析它们并在代码中的任何地方点击相关的那个,同时它会所有这一切都做得很干净,不需要任何额外的代码或维护与capybara的'选择'方法。

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

ruby capybara pageobjects site-prism
2个回答
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

我们还可以讨论使用声明性而非强制性步骤。此外,最佳实践页面对象使用避免直接调用已定义的元素。调用完成业务逻辑的方法和那些方法执行所有实现,包括元素定义和对它们的操作。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.