Selenium中的页面对象模型最佳实践

Ami*_*rai 23 java selenium webdriver object pageobjects

在对页面对象进行建模时,如何处理具有表单和大约50个输入字段的页面?这里的最佳做法是什么?

您是否会为每个输入操作创建一个页面对象并编写一个单独的函数?或者你会写一个函数,哪些参数传递给它并输入文本?

例如

public void enterFirstName(String firstName) {
    driver.type("firstNameField", firstName);
}

public void enterSecondName(String secondName) {
    driver.type("secondNameField", secondName);
}
Run Code Online (Sandbox Code Playgroud)

要么

public void fillInForm(String inputFieldName, String text) {
    driver.type(inputFieldName, text);
}
Run Code Online (Sandbox Code Playgroud)

我可以在第一个模型中看到,在编写测试时,测试更具描述性,但如果页面包含太多输入字段,则创建页面对象会变得很麻烦.

使用Selenium WebDriver的页面对象功能自动化测试最佳实践中构建硒测试时,这篇文章也非常有趣

dig*_*oel 10

页面对象模型背后的想法是它将实现从呼叫者抽象出来.在第一种机制中,您成功地执行了此操作,因为调用者不需要知道html输入字段名称是否从"firstName"更改为"user_first_name",而在第二种实现中,对实际页面的任何更改都必须是传递给页面对象的所有调用者.

虽然创建页面对象可能需要更多的工作,但如果你保持封装,那么当真正的html页面不可避免地发生变化时,它将长期保存工作.

  • 最好的"谢谢"是向某些答案进行投票.在您的问题的14个答案中,您只得到了4个答案,并且没有接受任何答案.我不是在谈论我的答案,但是你发现有帮助的任何答案(比如Sam Woods在这个问题上的答案)都可以/应该进行投票. (2认同)

Sam*_*ods 9

我总是喜欢把事情分解成一组相关的信息.例如,如果我有一个用户类,我可能会将其分解为几个较小的类:LoginCredentials,ProfileInfo,Settings等,但我通常仍然会有一个包含这些子类的顶级User类.

我肯定会建议的一件事是将一个对象传递给一个FillForm函数而不是所有这些函数.使用这种方法有一些很大的优势.一,您可以使用一些"常见"预配置对象,用于许多测试用例.例如:

public class FormInfo
{
   string Domain;
   string Name;
   string Category;
   // etc...

  public FormInfo(string domain, string name, string category)
  {
     Domain = domain;
     Name = name;
     Category = category;
     // etc...
  }
}


// Somewhere in your initialization code
public static FormInfo Info1 = new FormInfo("myDomain1", "myName1", "myCategory1");
public static FormInfo Info2 = new FormInfo("myDomain2", "myName2", "myCategory2");

You can still update one of your common merchants if you need to do something one-off:

// In your test case:
Info1.Category = "blah";
FormPage.FillForm(Info1);
Run Code Online (Sandbox Code Playgroud)

或者,您可以根据需要为特定测试用例创建全新的商家对象.你也可以使用这些对象进行字段验证,或者我通常做的是打破特定字段验证的页面对象模式,所以如果我验证商家域字段,我可能会这样做:

Info1.Domain = null; //This should make the FillForm function skip doing anything with this field.
FormPage.FillForm(Info1);
FormPage.DomainTextBox.Text = "field validation string";
Run Code Online (Sandbox Code Playgroud)

这种方法的另一个重要优点是,如果页面被更新以添加,删除或修改字段,您只需要更新FormInfo对象和FillForm函数,并且不需要修改调用FillForm函数的特定测试用例 - 假设他们正在使用您常用的FormInfo对象之一.获得更多覆盖的另一种可能性是设置一个常见的FormInfo对象,为每个符合最小/最大长度的字段生成随机字符串,并在所有不同的允许字符之间循环.这允许您从同一组测试中获得一些额外的测试,尽管如果您仅从特定字符串开始获得失败结果,它也可能会增加一些噪音,所以要小心.