我是否应该为您可以在测试框架中使用页面对象模型在页面上执行的每个操作添加一个方法?

Should I add a method for each action you can do on a page using Page Object Model in test framework?

我有一个页面对象框架,想减少每个 class 中的代码量。每个 class 都有一个函数,可以接收测试数据并确定如何处理它(在页面上输入数据,单击某些内容等)。我有 @FindBy 用于我将使用的 Web 元素。我的问题是,我是否还应该为每个 Web 元素上的每个操作设置一个方法?

比如我有一个输入用户名的web元素,我是否应该有一个对应的方法叫enterUsername(String username)?

目前我觉得这会导致膨胀,并且没有理由测试不能在 WebElements 本身上运行,但我正在寻找可以以某种方式推动我的决定的例子。

N/A

public class Page1
@FindBy
WebElement userName;

public void enterUsername(String s) {
    username.sendKeys(s);
}

@Test
public void someTest() {
    //go to page1
    page1.userName.sendKeys("username123");
}

两种方式的结果应该是一样的。我感兴趣的是代码的可维护性和清洁度。

你应该选择选项 1(为了以防万一,我会在输入之前添加 clear() 函数调用)

关于 "each action" - 您应该为访问您要自动化的这个或那个页面的用户的每个用户场景创建一个方法。

被测应用Page Object Model design pattern is to provide an abstraction layer between your test logic and the DOM的主要思想

所以你的测试看起来像:

@Test
public void loginUsingCorrectCredentials() {
    page1.enterCredentials("admin", "secret");
    Assert.assertTrue(page1.isUserLoggedIn(),"Failed to login");
}

@Test
public void loginUsingInCorrectCredentials() {
    page1.enterCredentials("admin", "badpassword");
    Assert.assertFalse(page1.isUserLoggedIn(),"Failed to login");
}

所以请记住 2 个主要原则:

  1. 您的测试应该完全代表现实生活business use cases并且您在页面上创建的函数应该匹配您将要涵盖的所有场景
  2. 在页面对象中保留 UI 相关内容,在测试代码中保留测试逻辑,即在测试用例中没有 WebElements,在页面对象中没有断言