根据我所见过的大多数网站,最佳实践是将断言保留在页面对象之外。以下是Selenium文档中的一个示例。
http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-
design-
pattern
页面对象的设计方式具有很大的灵活性,但是有一些基本规则可以使测试代码具有理想的可维护性。
页面对象本身绝不应进行验证或断言。
这是测试的一部分,应始终在测试的代码内,而不是在页面对象中。页面对象将包含页面的表示形式,以及页面通过方法提供的服务,但是与对象测试无关的代码都不应包含在页面对象内。可以并且应该在页面对象中进行一次单一验证,即验证页面以及页面上可能的关键元素是否已正确加载。实例化页面对象时应进行此验证。在上面的示例中,SignInPage和HomePage构造函数均检查预期的页面是否可用并准备接受测试请求。
页面对象应返回诸如产品名称,产品价格,当前选择的数量等信息。然后,测试代码将断言返回的字符串与期望的字符串匹配。
assert_message()将成为
getMessage()并以形式返回该消息
String。见下文。
public String getMessage(){ return driver.findElement(messageLocator).getText();}(注意:请继续阅读为什么我在
PageFactory这里将元素更改为定位符。)
然后在测试代码中,
Assert.assertEquals(editPost.getMessage(), "Post published. View post");
现在,您将断言代码保留在测试脚本中,并保留在页面对象之外。
查看您的代码,我将提出一些进一步的建议。
- 我建议您阅读一些Java命名约定。有很多网站都提出了建议,我认为它们之间有很多相似之处,但这是从oracle开始的建议。您的方法名称应为
动词,首字母小写混合,每个内部单词的首字母大写。
所以
assert_message()会变成
assertMessage()等等。_s使它看起来更像python。
- 定位器的优先顺序:ID,CSS选择器,在极少数情况下为XPath。ID应该始终是您的首选,因为ID(根据W3C定义)在页面上应该是唯一的。接下来是CSS选择器,因为它是最快的(在我的测试中,它比ID更快),具有最佳的浏览器支持,并且在各个浏览器中实现的一致性最高。XPath仅应保留给CSS筛选器无法完成的事情,例如通过包含的文本查找元素。与CSS选择器相比,XPath定位器的性能较差,并且与CSS选择器的支持程度不同。例如,您的XPath定位器可以轻松转换为CSS选择器“ #message> p”。
以下是一些CSS选择器参考,可帮助您入门。
CSS选择器参考
CSS选择器提示
- 放下
PageFactory
。是的,这似乎使事情变得容易,但我认为在许多情况下,它会导致更多问题,例如陈旧的元素异常等。而是根据需要刮取页面。将所有定位符声明在类的顶部,并在需要时在方法中使用它们。public class EditPost {WebDriver driver;By messageLocator = By.cssSelector("#message > p")public EditPost(WebDriver editPostDriver){ this.driver = editPostDriver;}public String getMessage(){ return driver.findElement(messageLocator).getText();}}
我知道这超出了您的要求,但希望对您有所帮助。


![Selenium [Java] PageFactory设计:我应在何处根据页面对象模型编写断言 Selenium [Java] PageFactory设计:我应在何处根据页面对象模型编写断言](http://www.mshxw.com/aiimages/31/447847.png)
