无法使用带有 ParameterizedTest 的 selenium 和 junit5 创建驱动程序
Can't create driver using selenium and junit5 with ParameterizedTest
我刚刚开始学习如何编写自动化测试,并且在尝试在尝试创建新驱动程序的步骤中使用 @ParameterizedTest 时出现 NullPointerException (LoginData login = new LoginData(driver);
)。正常的@Test 一切正常。我做错了什么?
我的代码:
public class LoginData {
private WebDriver driver;
@FindBy(how = How.XPATH, using = "//a[@class = 'close-modal-window']/img")
private WebElement close;
@FindBy(how = How.XPATH, using = "//input[@id='email']")
private WebElement emailField;
@FindBy(how = How.XPATH, using = "//input[@id = 'password']")
private WebElement passwordField;
@FindBy(how = How.XPATH, using = "//button[@class = 'primary-global-button']")
private WebElement loginButton;
@FindBy(how = How.XPATH, using = "//app-submit-button/button[@class = 'ubs-primary-global-button']")
private WebElement signInGoogle;
@FindBy(how = How.XPATH, using = "//span[@class = 'show-hide-btn']")
private WebElement showHidePassword;
@FindBy(how = How.XPATH, using = "//div[@class = 'forgot-wrapper']/a[@class = 'ubs-forgot-password']")
private WebElement forgotPassword;
@FindBy(how = How.XPATH, using = "//div[@id = 'email-err-msg']/app-error/div")
private WebElement errorEmail;
@FindBy(how = How.XPATH, using = "//div[@id = 'pass-err-msg']/app-error/div")
private WebElement errorPassword;
@FindBy(how = How.XPATH, using = "//div[@class = 'missing-account']/p/a[@class = 'ubs-sign-up-link']")
private WebElement signUpLink;
public LoginData(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
//("click on 'close' button")
public LoginData clickCloseIcon() {
close.click();
return this;
}
//input email | value = {emailInput}
public LoginData inputEmail(String emailInput) {
emailField.click();
emailField.clear();
emailField.sendKeys(emailInput, Keys.ENTER);
return this;
}
//input password | value = {passwordInput}
public LoginData inputPassword(String passwordInput) {
passwordField.click();
passwordField.clear();
passwordField.sendKeys(passwordInput, Keys.ENTER);
return this;
}
// click on login button
public LoginData clickLoginButton () {
loginButton.click();
return new LoginData(driver);
}
}
并测试 class:
public class LoginDataTest {
private WebDriver driver;
final String BASE_URL = "https://SOME_URL/";
@Before
public void beforeMethod() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.get(BASE_URL);
driver.findElement(By.partialLinkText("Login")).click();
}
@ParameterizedTest
@ValueSource(strings = {"testemail1@gmail.com", "testemail2@gmail.com"})
public void loginTest(String emailInput) {
try {
LoginData login = new LoginData(driver); // here I receive null when using @ParameterizedTest
login.inputEmail(emailInput).inputPassword("password123").clickLoginButton();
String actual = driver.getCurrentUrl();
String expected = "SOME_URL/#/profile/42";
Assertions.assertEquals(actual, expected);
} catch (NullPointerException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
@After
public void AfterMethod() {
driver.quit();
}
}
使用 @BeforeEach
注释代替 @Before
。 @Before
JUnit5 不支持注解
我刚刚开始学习如何编写自动化测试,并且在尝试在尝试创建新驱动程序的步骤中使用 @ParameterizedTest 时出现 NullPointerException (LoginData login = new LoginData(driver);
)。正常的@Test 一切正常。我做错了什么?
我的代码:
public class LoginData {
private WebDriver driver;
@FindBy(how = How.XPATH, using = "//a[@class = 'close-modal-window']/img")
private WebElement close;
@FindBy(how = How.XPATH, using = "//input[@id='email']")
private WebElement emailField;
@FindBy(how = How.XPATH, using = "//input[@id = 'password']")
private WebElement passwordField;
@FindBy(how = How.XPATH, using = "//button[@class = 'primary-global-button']")
private WebElement loginButton;
@FindBy(how = How.XPATH, using = "//app-submit-button/button[@class = 'ubs-primary-global-button']")
private WebElement signInGoogle;
@FindBy(how = How.XPATH, using = "//span[@class = 'show-hide-btn']")
private WebElement showHidePassword;
@FindBy(how = How.XPATH, using = "//div[@class = 'forgot-wrapper']/a[@class = 'ubs-forgot-password']")
private WebElement forgotPassword;
@FindBy(how = How.XPATH, using = "//div[@id = 'email-err-msg']/app-error/div")
private WebElement errorEmail;
@FindBy(how = How.XPATH, using = "//div[@id = 'pass-err-msg']/app-error/div")
private WebElement errorPassword;
@FindBy(how = How.XPATH, using = "//div[@class = 'missing-account']/p/a[@class = 'ubs-sign-up-link']")
private WebElement signUpLink;
public LoginData(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
//("click on 'close' button")
public LoginData clickCloseIcon() {
close.click();
return this;
}
//input email | value = {emailInput}
public LoginData inputEmail(String emailInput) {
emailField.click();
emailField.clear();
emailField.sendKeys(emailInput, Keys.ENTER);
return this;
}
//input password | value = {passwordInput}
public LoginData inputPassword(String passwordInput) {
passwordField.click();
passwordField.clear();
passwordField.sendKeys(passwordInput, Keys.ENTER);
return this;
}
// click on login button
public LoginData clickLoginButton () {
loginButton.click();
return new LoginData(driver);
}
}
并测试 class:
public class LoginDataTest {
private WebDriver driver;
final String BASE_URL = "https://SOME_URL/";
@Before
public void beforeMethod() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.get(BASE_URL);
driver.findElement(By.partialLinkText("Login")).click();
}
@ParameterizedTest
@ValueSource(strings = {"testemail1@gmail.com", "testemail2@gmail.com"})
public void loginTest(String emailInput) {
try {
LoginData login = new LoginData(driver); // here I receive null when using @ParameterizedTest
login.inputEmail(emailInput).inputPassword("password123").clickLoginButton();
String actual = driver.getCurrentUrl();
String expected = "SOME_URL/#/profile/42";
Assertions.assertEquals(actual, expected);
} catch (NullPointerException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
@After
public void AfterMethod() {
driver.quit();
}
}
使用 @BeforeEach
注释代替 @Before
。 @Before
JUnit5 不支持注解