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

5

我很难适应WebDriver PageObject模式。请分享你使用PageObjects模式和loadableComponents的经验和方法。

由于PageObject通常表示组件或功能的一部分,起初我认为应该在load()中实际执行某些操作,并查看在isLoaded()中是否执行了应该执行的操作。

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

但是,如果您要测试复杂的JavaScript订单提交器,其中包括JS文件上传器、基于2个独立部分的JS表单,以及三种类型的订单,则不会移动任何地方(关于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实例隐藏到单元测试中,只使用PageObjects来保留所有字段名、CSS类名,并为PageObjects提供输入数据和断言服务/功能的布尔结果

    3. 方法返回其他的PageObjects

      这是最难适应的。为一个交互式表单准备4个页面对象似乎不太自然。虽然他们推荐使用Form1、Form2(Form1)、Upload(Form2)、Submit(Upload)的链接方式,但我发现链接和引用前面的对象非常混乱。在测试方法中对它们全部调用get()似乎更好。但我想背后的思想并不是将Driver实例暴露给测试,而是仅使用内部使用Driver实例的PageObjects。

    4. 相同操作的不同结果被建模成不同的方法 我想这意味着在页面对象方面不能决定该操作的有效性,而是在测试方面进行决策。

2个回答

0
我在编写页面对象时采用了有所不同的方法。翻译成你们的术语, load()方法以条件等待结束,确保页面包含所需内容。然后我就不需要任何isLoaded()- 要么我到那里了,要么就抛出异常。 页面中的组件是页面的属性,并且我在组件和页面之间建立了双向关系。它们不是完全功能的页面对象。 也许您的表单也可以这样建模。

0

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

protected abstract void load()

protected abstract void isLoaded() throws java.lang.Error

在load()和isLoaded()方法中必须加载的页面或组件决定页面是否完全加载。如果没有完全加载,则会抛出错误。

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


你知道isLoaded会先被调用吗?这样就可以避免重复加载页面,如果我们已经在该页面上了。 - CodyK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接