我正在遵循页面对象模型来自动化一个应用程序中的流程。在模块之一中,我必须声明页面标题和更多消息。截至目前,我将我的断言代码放在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”软件包和Testcase的“
Testcase”软件包。
我的目标是向前发展,我想重用为所有不同实用程序编写的代码。
我的问题是:
根据PageFactory&Page Object Model的概念,我的方法正确吗?还是我需要将断言移到“ Helper”包中?还是应该为断言创建一个单独的库/程序包?(在未来的日子里,我可能需要在一个页面上执行多个断言)
在下一个冲刺中,我可能需要执行其他一些活动,例如对所有/失败的测试用例进行屏幕截图。那么,如何保持设计的结构化和组织性,以便以最佳方式重用代码/库/利用它们?
根据我所见过的大多数网站,最佳实践是将断言保留在页面对象之外。以下是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");
现在,您将断言代码保留在测试脚本中,并保留在页面对象之外。
查看您的代码,我将提出一些进一步的建议。
动词,首字母小写混合,每个内部单词的首字母大写。
所以assert_message()
会变成assertMessage()
等等。_s使它看起来更像python。
以下是一些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();
}
}
我知道这超出了您的要求,但希望对您有所帮助。
希望我不是第一个遇到这个问题的人。 问题是我还需要检查该元素在页面上是否可见,并且在执行checked之前它会出错(例如,使用WebDriverWait,将ExpectedConditions.ElementisVisible(by)传递给.Until方法)。 我如何将IWebElement和By locator清晰地分开,并允许在需要的地方进行这种明确的等待/检查? TLDR-如何维护页面对象模
我下面的页面对象模型中,我已经放置了所有的WebElement地址和方法,即id,xpath等在页面中。示例:在登录页面上,我们有用户名字段、密码字段和登录按钮。因此,所有这些都将在LoginPage.java.本页还包括使用Webelements的方法。所以从实际的测试用例中,我只是调用页面上定义的方法。这就是我的困境。我有几个测试步骤需要我点击一个元素。所以说我需要点击链接1,链接2和链接3。
可以在页面对象模型中处理动态元素吗? 例子: 我想从测试方法中传递输入的name属性值。
我正在进行UI自动化测试,使用POM与Python和Selenium。我想知道如何处理重复的测试用例。 例如,您有两个网页:登录页和主页。我想测试三个测试用例。 未登录的主页功能:登录前测试主页。py (1和3有很多共同点。3有额外的功能。1是3的子集) 每个测试用例有三个文件,我已经实现了1和2。但是对于第三个模块,我只是从1和2模块中导入了相关函数。 问题是验证登录是否重复。在这种情况下,您是
问题内容: 我知道您无法在中初始化对象。我一直在互联网上搜索,但只找到了一个可能的答案,可以使用但在实现方面没有太多细节。我要问他们是成功实施它还是有实现它的想法的人,可以通过以外的其他方式来确定。 目前,我仅使用以下内容: 我正在寻找实现的东西是这样的。 PS。我是selenium的新手,也是回来的Java开发人员,所以请好好对待我:) 问题答案: 由于没有人分享某些东西,因此我将分享我的做法。
第一次海报。我已经在UI自动化领域工作了很多年,但直到最近才被介绍/指示使用页面对象模型。其中大部分是常识,包括我已经使用过的技术,但是有一个特别好的点我还没有能够在我自己的头脑中证明,尽管我广泛地寻找一个合理的解释。我希望这里有人能启发我,因为当我试图将POM与我自己的最佳实践相结合时,这个问题已经引起了一些恐慌。 从http://code.google.com/p/selenium/wiki/