如何在PageObjects模式中使用WebDriver / Selenium 2 LoadComponents?

时间:2011-06-06 10:07:06

标签: java design-patterns webdriver selenium-webdriver pageobjects

我很难习惯WebDriver PageObject模式。请分享您使用PageObjects模式和loadableComponents的经验和方法。

由于PageObject通常代表一个组件或一部分功能,我起初想到我应该用它来实际执行load()中的一些事情,看看它是否在isLoaded()中做了它应该做的事情。

然后我意识到它应该仅用于“加载”对象(可能是初始化),就像在网站中移动一样,每个对象都有自己的URL。并使用isLoaded()来测试对象是否准备好进行测试。

但是如果你有一个复杂的JavaScript命令提交者来测试,那就是JS文件上传器的复合,JS表单基于2个独立的部分而且有三种Orders,你不会移动到任何地方(关于URL) ,只是元素的状态正在发生变化。

考虑get()方法。您将使用交互式表单进入该页面。当表单存在于页面上时加载它。然后你有form1和form2对象......他们的load()和isLoaded()方法应该是什么样的,他们可以立即采取行动,因为他们不需要任何加载,只需测试他们的服务。

这是一团糟,不知道isLoaded()方法是否用于检查是否加载了对象,或者是否加载了对象并且设置正确。但我想前一种方法是正确的,并且应该在测试中确保设置的有效性。

情景:

Testing first part of html form - test that field client side validation works
Testing the second one that depends on the first one
Testing the following file uploader - upload, canceling, clearing, order, fileIDs
Testing the overall html form submission - ServerSide validation errors, results

文档说:

  • LoadableComponent
  • PageObjects

    1. 公共方法代表网页提供的服务

      验证,上传,上传多个,取消,清除

    2. 尽量不要公开页面的内部

      我唯一想到的是将Driver实例隐藏到UnitTests并使用Only PageObjects来保存所有字段名,在PageObjects中使用css类名并使用输入数据提供PageObjects并断言服务/功能的布尔结果

    3. 方法返回其他PageObjects

      这是最难以习惯的事情。对于一个交互式表单有4个页面对象有点不自然。他们推荐Form1,Form2(Form1),Upload(Form2),Submit(Upload),虽然我发现链接并将前一个对象的引用非常混乱。在测试方法中对所有这些调用get()似乎更好。但我想它背后的想法不是将驱动程序实例暴露给测试,而是仅使用内部使用驱动程序实例的PageObjects

    4. 相同操作的不同结果被建模为不同的方法 我想这意味着不应该在页面对象方面确定该操作的有效性,而是在测试方面

2 个答案:

答案 0 :(得分:0)

编写页面对象时我有一些不同的方法。翻译为您的术语 load()方法以条件等待结束,确保页面包含您想要的内容。然后我不需要任何isLoaded() - 要么我在那里,要么抛出异常。

页面中的组件是包含它们的页面的属性,我在组件和页面之间设置了双向关系。它们不是功能完整的页面对象。也许你的表格也可以用这种方式建模。

答案 1 :(得分:0)

可加载组件是页面对象模式的扩展。 WebDriver库中的LoadableComponent类将帮助测试用例开发人员确保成功加载页面或页面组件。它极大地减少了调试测试用例的工作量。页面对象应扩展此可装配组件抽象类,因此,它必须为以下两种方法提供实现:

protected abstract void load()

protected abstract void isLoaded()抛出java.lang.Error

必须在load()和isLoaded()方法中加载的页面或组件确定页面是否已完全加载。如果未完全加载,则会引发错误。

https://code.google.com/p/selenium/wiki/LoadableComponent