0

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

即想一想,直接使用step定义中单选按钮的文本,直接调用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

我想可以为所有按钮创建一个带有数组的“元素”或“部分”,但是,我们必须添加额外的逻辑来解析它们并在代码中的某处点击相关的,而它会使用 capybara 的“选择”方法可以整齐地完成所有操作,无需任何额外的代码或维护。

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

4

2 回答 2

0

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

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

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

于 2019-02-22T13:47:19.443 回答
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

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

于 2016-12-02T21:41:44.247 回答