Bohemian的答案并不灵活- 您不能执行返回到同一页面的页面操作(例如输入错误的密码),也不能拥有多个页面操作导致不同的页面(如果您想弄乱了,登录页面还有另一项操作,导致结果不同)。最后,您还会堆满更多PageObjects,以迎合不同的结果。
private <T> T login(String user, String pw, Class<T> expectedPage){
username.sendKeys(user);
password.sendKeys(pw);
submitButton.click();
return PageFactory.initElements(driver, expectedPage);
}
public AdminWelcome loginAsAdmin(String user, String pw){
return login(user, pw, AdminWelcome.class);
}
public CustomerWelcome loginAsCustomer(String user, String pw){
return login(user, pw, CustomerWelcome.class);
}
public Login loginWithBadCredentials(String user, String pw){
return login(user, pw, Login.class);
}
这意味着您可以重用登录逻辑,但是可以防止测试类通过预期的页面,这意味着该测试类具有很高的可读性:
Login login = PageFactory.initElements(driver, Login.class);
login = login.loginWithBadCredentials("bad", "credentials");
// TODO assert login failure message
CustomerWelcome customerWelcome = login.loginAsCustomer("joe", "smith");
// TODO do customer things
在每种情况下都有单独的方法也可以使Login
PageObject的API非常清晰- 而且很容易分辨出所有登录结果。使用接口限制使用该login()
方法的页面时,我没有看到任何价值。
我同意汤姆·安德森(Tom Anderson)的观点,应将可重用的WebDriver代码重构为细粒度的方法。是否对它们进行细粒度的暴露(以便测试类可以选择相关的操作),或者将它们作为单个粗粒度的方法组合并暴露给测试类,可能是个人喜好问题。