清理大量的PageObject元素

时间:2015-04-29 20:30:45

标签: ruby refactoring page-object-gem

我们的每个页面对象都定义了大约80-100个PageObject元素。这是一个以数据为中心的应用程序的副产品,我不会发现很快就会改变。我们有许多文本字段,选择列表,按钮和菜单。我想以某种方式清理它们并将它们放在某个地方,但我所想过的事情似乎并非如此 clean

想法:

  • 将每个PageObject的元素移动到相应的模块中,并将该模块包含在单个PageObject中
  • 创建一个YAML配置文件,其中包含element_type =>的映射。 element_name => element_id然后使用元编程
  • 调用相应的元素方法
  • 利用即将推出的PageObject部分功能创建不同的"面板"在每个页面中,然后将这些面板包含在页面中。

第一个解决方案存在的问题是,如果某人没有注意,每个模块可以包含在其他类中。它不仅限于单一类

第二个解决方案看起来很慢而且不是非常“#34; rubular"”,同时又为那些刚接触项目的人更新元素而感到困惑

第三种解决方案似乎是最好的解决方案,但与第一种解决方案一样,您可以将章节纳入他们不属于的班级。

我还可以通过其他方式将这些元素的定义移出类,以便我们的类更清晰,更简单,更易于阅读,并定义为Ruby规范(即Ruby样式指南)。他们真的只是配置数据而不是ruby代码,所以我觉得他们不属于这个类。特别是当我们每班有80多个元素时。

1 个答案:

答案 0 :(得分:1)

我不明白为什么你不会在页面对象类中保留元素。这是课堂上的一点,对吧?如果它们在多个页面之间共享,那么我理解将它们放在一个模块中并混合使用。但为什么要将该页面上的独特元素从页面类中抽象出来呢?

但如果你绝对会这样做,我认为这是最好的选择:

  

将每个PageObject的元素移动到相应的模块中,并将该模块包含在单个PageObject中

有些方法可以确保这些模块仅包含在您期望的类中。我记得Module#included。类似的东西:

module MyPageElements
  def self.included cls
    raise "Expected to be included on MyPage, got: #{cls}" unless cls == MyPage
  end

  # ... elements ...
end
  

创建一个YAML配置文件,其中包含element_type =>的映射element_name => element_id然后使用元编程调用相应的元素方法

这样看起来很难让新的,不熟悉的人快速掌握代码。最终,我同意它太像Ruby了。

  

利用即将推出的PageObject部分功能在每个页面中创建不同的“面板”,然后将这些面板包含在页面中。

由于我几乎没有看过这个(感谢我将我与PR联系起来),我觉得我不能说它的功效。