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

文档说:

  • 可加载组件
  • 页面对象

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

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

    2. 尽量不要暴露页面的内部

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

    3. 方法返回其他 PageObjects

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

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

4

2 回答 2

0

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

受保护的抽象无效负载()

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

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

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

于 2014-06-17T09:46:54.747 回答
0

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

页面中的组件是包含它们的页面的属性,我在组件和页面之间设置了双向关系。它们不是功能齐全的页面对象。也许您的表单也可以这样建模。

于 2011-06-29T08:45:07.690 回答