Deb*_*anB 1 java selenium design-patterns pageobjects
我正在遵循页面对象模型来自动化一个应用程序中的流程。在其中一个模块中,我必须声明页面标题和更多消息。到目前为止,我将我的断言代码放在 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");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在从实现 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();
}
Run Code Online (Sandbox Code Playgroud)
目前,我正在通过 3 个包运行执行。浏览器工厂的“Helper”包,PageFactories 的“Pages”包和测试用例的“Testcase”包。
我的目标是向前迈进,我想重用为所有不同实用程序编写的代码。
我的问题是:
根据 PageFactory & Page Object Model 的概念,我的方法是否正确?或者我是否需要将断言移动到“Helper”包?或者我应该为断言创建一个单独的库/包?(在接下来的日子里,我可能需要在一个页面上执行多个断言)
在下一个冲刺中,我可能需要做一些其他的活动,比如对所有/失败的测试用例进行屏幕截图。那么我如何保持我的设计结构和组织,以便我可以以最佳方式重用代码/库/利用它们?
根据我见过的大多数站点,最佳实践是将断言保留在页面对象之外。下面是 Selenium 文档中的一个示例。
http://www.seleniumhq.org/docs/06_test_design_thinkations.jsp#page-object-design-pattern
页面对象的设计方式有很大的灵活性,但有一些基本规则可以让您的测试代码获得所需的可维护性。
页面对象本身不应该进行验证或断言。这是测试的一部分,应该始终在测试代码中,而不是在页面对象中。页面对象将包含页面的表示,以及页面通过方法提供的服务,但页面对象中不应包含与正在测试的内容相关的代码。
有一个单一的验证可以并且应该在页面对象中,即验证页面以及页面上可能的关键元素是否正确加载。这个验证应该在实例化页面对象时完成。在上面的示例中,SignInPage 和 HomePage 构造函数都检查预期页面是否可用并准备好接受来自测试的请求。
页面对象应该返回诸如产品名称、产品价格、当前选择的数量等内容。然后测试代码会断言返回的字符串与预期的匹配。
assert_message()将成为getMessage()并将消息作为String. 见下文。
public String getMessage()
{
return driver.findElement(messageLocator).getText();
}
Run Code Online (Sandbox Code Playgroud)
(注意:请继续阅读我在PageFactory这里将元素更改为定位器的原因。)
然后在你的测试代码中,你会有
Assert.assertEquals(editPost.getMessage(), "Post published. View post");
Run Code Online (Sandbox Code Playgroud)
现在,您已将断言代码保留在测试脚本中并保留在页面对象之外。
看看你的代码,我会提出一些进一步的建议。
我建议您阅读一些 Java 命名约定。有很多网站都有推荐,我认为它们之间有很多相似之处,但这里是oracle 推荐的开始。你的方法名称应该是
动词,大小写混合,第一个字母小写,每个内部单词的第一个字母大写。
所以assert_message()会变成assertMessage()等等。_s 使它看起来更像 python。
定位器的优先顺序:ID、CSS 选择器,在极少数情况下,XPath。ID 应该始终是您的首选,因为它(根据 W3C 定义)在页面上应该是唯一的。CSS 选择器应该是下一个,因为它是最快的(在我的测试中比 ID 更快),具有最好的浏览器支持,并且在浏览器中最一致地实现。XPath 应该只保留用于 CSS 选择器无法完成的事情,例如通过包含的文本查找元素。与 CSS 选择器相比,XPath 定位器的性能较差,并且没有与 CSS 选择器相同的支持水平。例如,您的 XPath 定位器可以轻松转换为 CSS 选择器“#message > p”。
这里有一些 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();
}
}
Run Code Online (Sandbox Code Playgroud)我知道这比你问的要多,但希望它有帮助。
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |