Selenium PageFactory设计:在页面对象模型之后我在哪里编写断言

我正在关注Page Object Model以在一个应用程序中自动化流程。 在其中一个模块中,我必须断言页面标题和更多消息。 截至目前,我将我的Assertion代码放在​​PageFactory本身中,如下所示:

public class EditPost { WebDriver driver; public EditPost(WebDriver editPostDriver) { this.driver=editPostDriver; } @FindBy(how=How.XPATH,using="//*[@id='message']/p") WebElement post_published; public void assert_message() { String actual_message_title=post_published.getText(); Assert.assertEquals(actual_message_title, "Post published. View post"); System.out.println("Message: Post published, Successfully Verified"); } } 

我从实现TestNG的主文件调用assert方法如下:

 @Test (priority=5) public void assert_message() { //Created Page Object using Page Factory EditPost edit_post = PageFactory.initElements(driver, EditPost.class); edit_post.assert_message(); } 

目前,我通过3个包运行执行。 浏览器工厂的“Helper”包,PageFactories的“Pages”包和Testcases的“Testcase”包。

我的目标是继续前进我想重用为所有不同实用程序编写的代码。

我的问题是:

  1. 根据PageFactory和Page Object Model的概念,我的方法是否正确? 或者我是否需要将断言移动到“助手”包中? 或者我应该为断言创建单独的库/包吗? (在新的日子里,我可能需要在一个页面上执行多个断言)

  2. 在下一个冲刺中,我可能需要做一些其他活动,比如拍摄所有/失败的测试用例的屏幕截图。 那么我如何保持设计的结构和组织,以便我可以重用代码/库/以最佳方式利用它们?

根据我见过的大多数网站,最佳做法是将断言保留在页面对象之外。 下面是Selenium文档的一个例子。

http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern

在如何设计页面对象方面有很多灵活性,但是有一些基本规则可以获得测试代码所需的可维护性。

页面对象本身不应该进行validation或断言。 这是测试的一部分,应该始终在测试代码中,而不是在页面对象中。 页面对象将包含页面的表示,以及页面通过方法提供的服务,但是没有与测试内容相关的代码应该在页面对象中。

有一个单一的validation可以而且应该在页面对象中,即validation页面以及页面上可能的关键元素是否已正确加载。 应在实例化页面对象时完成此validation。 在上面的示例中,SignInPage和HomePage构造函数都检查预期页面是否可用并准备好来自测试的请求。

页面对象应返回产品名称,产品价格,当前选定数量等内容。 然后测试代码断言返回的字符串与预期的匹配。

assert_message()将成为getMessage()并以String返回消息。 见下文。

 public String getMessage() { return driver.findElement(messageLocator).getText(); } 

(注意:请继续阅读为什么我在这里将PageFactory元素更改为定位器。)

然后在你的测试代码中,你会有

 Assert.assertEquals(editPost.getMessage(), "Post published. View post"); 

现在,您已将断言代码保留在测试脚本中,并保留在页面对象之外。

看看你的代码,我会提出一些进一步的建议。

  1. 我建议你阅读一些Java命名约定。 有很多站点都有建议,我认为它们之间有很多相似之处,但这里是oracle建议的开头。 你的方法名称应该是

    动词,大小写混合,第一个字母小写,每个内部单词的首字母大写。

    所以assert_message()会变成assertMessage()等等。 _s使它看起来更像python。

  2. 定位器的首选项顺序:ID,CSS选择器,在极少数情况下,XPath。 ID应始终是您的首选,因为它(通过W3C定义)在页面上应该是唯一的。 CSS选择器应该是下一个,因为它是最快的(在我的测试中比ID更快),具有最佳的浏览器支持,并且在浏览器中最一致地实现。 XPath应仅保留给CSS seletors无法完成的事情,例如通过包含文本查找元素。 与CSS选择器相比,XPath定位器的性能较差,并且与CSS选择器的支持级别不同。 例如,您的XPath定位器可以很容易地转换为CSS选择器“#message> p”。

    这里有一些CSS选择器引用可以帮助您入门。

    CSS选择器参考

    CSS选择器提示

  3. 删除PageFactory 。 是的,它似乎使事情变得更容易,但我认为在许多情况下它会导致更多问题,例如过时的元素exception等。 而是根据需要刮取页面。 声明类顶部的所有定位器,并在需要时在方法中使用它们。

     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(); } } 

我知道这比你问的要多,但希望它有用。