【发布时间】:2015-01-08 08:29:44
【问题描述】:
我是一名相对较新的 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;
}
}
【问题讨论】:
-
这更像是一个一般性的编程问题,实际上与 Selenium 无关。更多的是“如果我可以在所有地方都使用静态变量,那么 OO 的意义何在?”.....programmers.stackexchange.com/questions/98083/… ....考虑屏幕上是否有两个对话框。两者有何不同?
-
我想我的问题实际上是关于页面对象的情况。在此应用程序中,如果您可以访问给定页面,它看起来几乎相同,定位器不会改变。如果您不是管理员,即使没有显示按钮,我也希望能够使用定位器检查并确保它不存在。如果我的方法不依赖于任何实例特定的变量,我总是被告知要使我的方法成为静态的。你会让你的定位器实例变量而不是静态变量吗?
-
我认为将页面对象设为静态会在您与不同浏览器并行运行测试时产生问题,因为在多线程操作中静态不会在两个/多个线程之间共享。只需尝试使用不同的浏览器(驱动程序)并行运行相同的测试并检查。例如:当您使用静态 WebDriver 驱动程序并稍后更改它时 driver = chrome in one thread and driver = firefox 可能会产生问题。
标签: java selenium selenium-webdriver pageobjects