我是一名相对较新的 QA 工程师,正在学习 Selenium(使用 Java),我想使用页面对象来为我的页面建模。
目前,我的做法是,我的页面对象类是静态变量(用于定位页面元素的对象)和静态方法(用于获取对象和执行页面功能)的集合。这对我来说似乎是最简单的方法,因为我的方法不需要依赖任何实例变量,只需要定位器。
我只是在我的测试代码中需要它们时调用这些方法。
但是,我读到的关于页面对象的所有内容都谈到了实例化它们以及让方法返回页面对象。这似乎使一切变得更加复杂。例如,我需要两种登录方法,而不是一种登录方法,一种用于登录成功,一种用于登录失败。
我知道这似乎是公认的最佳做法,但我想了解原因。谢谢。
这是我的 pageObject 代码,我的测试调用方法为 LoginPage.login(username, password);
package pageObjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class LogInPage {
private static By emailTxtB = By.id("user_email");
private static By passwordTxtB = By.id("user_password");
private static By logInButton =
By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/button");
private static By signUpButton = By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/a");
private static By valErrorMessage = By.id("flash_alert");
public static void logIn(WebDriver driver, String email, String password){
//Fill out form
driver.findElement(emailTxtB).sendKeys(email);
driver.findElement(passwordTxtB).sendKeys(password);
//Submit form
driver.findElement(logInButton).click();
}
public static void goToSignUp(WebDriver driver){
driver.findElement(signUpButton).click();
}
public static String getValErrorMessage(WebDriver driver){
return driver.findElement(valErrorMessage).getText();
}
public By getEmailTxtB(){
return emailTxtB;
}
public By getPasswordTxtB(){
return passwordTxtB;
}
public By getLogInButton(){
return logInButton;
}
public By getSignUpButton(){
return signUpButton;
}
}
最佳答案
我 2 个月前开始使用 Selenium 和页面对象。我也很好奇这个话题。大约 1 个月前,我决定使用类和静态方法。但是随着代码库的成长,我开始考虑切换到对象实例。 主要原因 - 对象可以有状态。在对象中,我可以检查我是否真的在使用正确的页面。对于类,我只能假设当前的 html 与该类匹配(或者在页面对象的每个静态方法中使用断言来膨胀我的代码)。 另一个原因 - 自动完成。静态方法鼓励测试人员使用类,而不是类变量。所以越来越难找到正确的类来调用方法。对于对象,如果你想调用任何方法,你必须声明一个变量。因此,您可以调用的内容有限。使用类和静态方法,您可以随时调用任何方法(并且由于预期的 html 不可用而导致测试失败,例如)。当你试图教你的团队成员使用你的代码时,它就开始成为一个问题。只要您是唯一的测试编写者,就没问题。
关于java - 为什么我应该使我的页面对象实例化而不是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870858/