SeleniumJava-页面对象模型查询

SeleniumJava-页面对象模型查询,java,selenium,selenium-webdriver,webdriver,pageobjects,Java,Selenium,Selenium Webdriver,Webdriver,Pageobjects,假设有一个页面,在这里输入记录的详细信息,然后单击保存。完成此操作后,页面将重定向到 您可以在其中查看用户列表,包括您刚刚输入的新记录 如果我们使用页面对象模型,输入详细信息和保存记录的方法应该存在于AddUser.java上,验证记录是否实际保存和显示的方法应该存在于UserList.java 如果我们考虑AdvUsand和UsRead是这两个类的对应对象,它将类似于下面的内容: addUser.enterDetailsSaveRecord(); userList.validateSave

假设有一个页面,在这里输入记录的详细信息,然后单击保存。完成此操作后,页面将重定向到

您可以在其中查看用户列表,包括您刚刚输入的新记录

如果我们使用页面对象模型,输入详细信息和保存记录的方法应该存在于
AddUser.java
上,验证记录是否实际保存和显示的方法应该存在于
UserList.java

如果我们考虑AdvUsand和UsRead是这两个类的对应对象,它将类似于下面的内容:

addUser.enterDetailsSaveRecord();

userList.validateSavedRecord();
因此,在我的测试用例中,我需要调用两个单独的方法,一个用于操作,另一个用于验证

AddUser.java
UserList.java
都将
BasePage.java
作为超类。 有没有一种方法可以将它们合并成一个单一的方法,或者我有没有用一种错误的方法去做什么,有没有更好的方法


谢谢你

你的方法是正确的。这些方法应该属于不同的页面。 请将方法更新为:

public UserList enterDetailsSaveRecord() {
// your code to save the details
return new UserList();
}
因此,您可以将其用作:

addUser.enterDetailsSaveRecord().validateSavedRecord()

我也不认为您的方法有任何错误,不过,我的方法通常是从逻辑上将与应用程序的功能交互与测试功能分开。所以,我还是会的

addUser.enterDetailsSaveRecord();
但对于userList,我会使用

UserItem foundUser = userList.findUser(targetUser);
其中UserItem是用户表中的一行。然后,我的测试将验证foundUser是否正确


尽管这最终会产生更多的代码行,但它会使对象模型干净、简单地对被测对象建模,并在测试本身中找到测试代码

使用
PageFactory
您将拥有两个页面对象,分别为
AddUser.java
UserList.java
。因此,假设您在调用这些方法时传递了适当的参数,以下方法对您有效:

addUser.enterDetailsSaveRecord();
userList.validateSavedRecord();
但从最佳实践中可以看出,
断言应该在单独的实用程序/包/类中进行,这与@JeffC comment类似:

最佳做法是将验证代码保留在页面对象之外

因此,您应该创建一个单独的公共实用程序/包/类,它将处理所有的
断言。您也可以从
PageObject
类调用包含
断言的


因此,您的整个测试环境将包含3个
。一个包包含
main()/@Test
类,一个包包含
PageObjects
类,例如
AddUser.java
,还有一个
Utility
包,其中类包含
断言,例如
validateSavedRecord()

当前方法有什么问题。您描述的是您的实现,我没有发现任何错误。这也是我创建页面对象的方式。最佳实践是将验证代码保留在页面对象之外。解决这个问题的方法是让页面对象返回所需的数据,并让脚本本身在
Assert
中进行验证。只有在用户列表页面上才能验证保存的记录。上面列出的代码并没有清楚地说明这一点。只要您输入详细信息并单击“保存”,网站就会自动将您重定向到新页面。上面的代码只是显示了,而不是在测试脚本中创建一个新对象,我们可以在方法本身(工厂方法)中创建新对象,并可以在同一行中用作链接是的,但这会变成一团混乱,因为如果你对此发疯,你可能会有
page1.dosomeThingOnPage2().dosomeThingOnPage3().dosomeThingOnPage4().dosomeThingOnPage5()和你结束了一个单一的班轮是通过整个网站导航。这会让你很难理解到底发生了什么。是的,你是对的,你最终只会得到一行代码,你会知道这是内存管理中必要且重要的一步。这肯定会降低它的可读性,为什么你认为它在内存管理中有优势?在链接时,仍然可以像不进行链接一样创建每个页面对象。