为具有许多元素的页面实现页面对象模型的最佳实践

时间:2015-06-24 23:38:54

标签: testing selenium-webdriver webdriver ui-automation pageobjects

我正在使用Page Object工厂实现Page Object模型,并努力找出处理包含许多元素的页面的最佳方法。如果您有多个复选框并且想要为每个复选框创建多个方法,那么Page Object会变得很丑陋。我们说我有一个带checkbox1 ... checkboxN的页面。对于每个元素,我想要有像isEnabled,isDisplayed,isChecked这样的方法。如果按照它的建议实现它,我最终会得到像isCheckbox1Enabled等3xN方法。

这里的最佳做法是什么?我应该为这些元素提供简单的get方法吗?我应该创建每个方法的地图和单个实例,如isCheckboxEnabled(String checkboxName)?

我不喜欢地图,因为我必须知道我的测试中的复选框名称......

谢谢!

1 个答案:

答案 0 :(得分:0)

最好的方法是创建一个继承(或混合等)的基类,它为您提供了一种在页面对象中声明元素时动态定义元素方法的方法。

我在calabash + ruby​​中使用这种方法并且在我的页面对象中继承了一个基类,它定义了一个名为' element'的方法。为我声明的所有元素创建get_text,is_enabled?,enter_text等方法。我在页面对象的开头声明了这些,之后我可以使用页面对象或步骤定义中的方法。

语法可能与您使用的语言不同,但该方法仍然有效。在这种情况下,locator是用于查找我想要与之交互的元素的calabash查询语法。

e.g。在我的页面对象中,我继承了方法

def self.element(element_name, locator)
  define_method("get_text_#{element_name}") do
  query("#{locator}", :text)[0]
end

然后在页面对象的开头我定义

element(:username_textbox, "* id:'username'")

并且将能够使用它创建的方法,例如

get_text_username_textbox

Web自动化的一个更成熟的等价物是页面对象gem https://github.com/cheezy/page-object,它执行相同的操作,但根据元素类型定义了不同的方法集。