我很难适应 WebDriver PageObject 模式。请分享您使用 PageObjects 模式和 loadableComponents 的经验和方法。
由于 PageObject 通常代表一个组件或功能,一开始我想到我应该用它在 load() 中实际做一些事情,看看它是否在 isLoaded() 中做它应该做的事情。
然后我意识到它应该只用于“加载”对象(可能是初始化),因为它是在网站上移动的情况,每个对象都有自己的 url。并使用 isLoaded() 来测试对象是否准备好进行测试。
但是如果你有一个复杂的 JavaScript 订单提交器来测试,它是 JS 文件 uploader 的复合体,基于 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
-
公共(public)方法表示页面提供的服务
验证、上传、上传多次、取消、清除
尽量不要暴露页面的内部结构
我唯一想到的是将 Driver 实例隐藏到 UnitTests 并使用 Only PageObjects 保留所有字段名称,PageObjects 中的 css 类名称 + 为 PageObjects 提供输入数据并断言服务/功能的 boolean 结果
方法返回其他页面对象
这是最难适应的事情。一个交互式表单有 4 个页面对象有点不自然。他们推荐Form1, Form2(Form1), Upload(Form2), Submit(Upload),虽然我觉得链接和传递对前面对象的引用非常困惑。在测试方法中对所有这些调用 get() 似乎更好。但我猜它背后的想法不是将 Driver 实例暴露给测试,而是仅使用内部使用 Driver 实例的 PageObjects
同一 Action 的不同结果被建模为不同的方法 我想这意味着不应在页面对象端决定该操作的有效性,而应在测试端决定该操作的有效性
最佳答案
我在编写页面对象时有一些不同的方法。翻译成您的术语 load() 方法以有条件的等待结束,以确保页面包含您想要的内容。然后我不需要任何 isLoaded() - 要么我在那里,要么抛出异常。
页面中的组件是包含它们的页面的属性,我在组件和页面之间设置双向关系。它们不是功能齐全的页面对象。也许您的表格也可以这样建模。
关于java - 如何在 PageObjects 模式中使用 WebDriver/Selenium 2 LoadComponents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6250485/