如果我违反了一些准则的话,第一次发帖很抱歉。
我正在自学Java/Selenium/Chromedriver,我遇到了第一个我自己也无法解决的问题。我会尽我最大的努力在下面代表它,但如果我没有包括我需要的东西,请索取更多的信息!下面是一个测试:
@Test
public void loginAsTomSmith(){
LoginPage loginPage = homePage.clickFormAuthentication();
loginPage.enterUsername("tomsmith");
loginPage.enterPassword("SuperSecretPassword!");
SecureAreaPage secureAreaPage = loginPage.clickLogin();
secureAreaPage.getBannerText();
assertTrue(secureAreaPage.getBannerText()
.contains("You logged into a secure area!"),"Incorrect message displayed");
}正如您所看到的,在我的第一步中,我将驱动程序从主页直接传递到登录页面(我认为)。然后,我最终将其传递给安全区域,在运行断言时,会得到以下错误:
java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebDriver.findElement(org.openqa.selenium.By)" because "this.driver" is null值得注意的是,我一直在学习一门在线课程,但是我要为这个特定的项目做一些我没有被教过的事情。例如,在本课程中,每个页面对象都是一个不同的类,而我已经决定让所有页面都是基页类的扩展,这样它们就可以更容易地共享基本方法。我开始担心那个决定会产生我不明白的后果。
不管怎么说,因为这个项目太小了,所以把它全部贴出来也许是有意义的。提前谢谢你的帮助。你作品的超级粉丝!
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class BasePage{
protected WebDriver driver;
protected BasePage(WebDriver driver){
this.driver = driver;
}
protected void clickLink(By linkTextBy){
driver.findElement(linkTextBy).click();
}
protected void populateTextField(By textFieldBy, String inputText){
driver.findElement(textFieldBy).sendKeys(inputText);
}
protected void clickButton(By buttonBy){
driver.findElement(buttonBy).click();
}
}package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class HomePage extends BasePage{
// private WebDriver driver;
private By formAuthenticationLink = By.linkText("Form Authentication");
public HomePage(WebDriver driver){
super(driver);
}
public LoginPage clickFormAuthentication(){
clickLink(formAuthenticationLink);
return new LoginPage(driver);
}
}package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class LoginPage extends BasePage{
private By usernameTextField= By.id("username");
private By passwordTextField = By.id("password");
private By loginButton = By.className("radius");
public LoginPage(WebDriver driver){
super(driver);
}
public void enterUsername(String username){
populateTextField(usernameTextField, username);
}
public void enterPassword(String password){
populateTextField(passwordTextField, password);
}
public SecureAreaPage clickLogin(){
clickButton(loginButton);
return new SecureAreaPage(driver);
}
}package pages;
import org.openqa.selenium.*;
import org.openqa.selenium.WebDriver;
public class SecureAreaPage extends BasePage {
private WebDriver driver;
private By loginBanner = By.id("flash");
public SecureAreaPage(WebDriver driver){
super(driver);
}
public String getBannerText(){
return driver.findElement(loginBanner).getText();
}
}package base;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import pages.HomePage;
public class BaseTests {
private WebDriver driver;
protected HomePage homePage;
@BeforeClass
public void setUp(){
System.setProperty("webdriver.chrome.driver", "resources/chromedriver.exe");
driver = new ChromeDriver();
driver.get("https://the-internet.herokuapp.com/");
homePage = new HomePage(driver);
}
@AfterClass
public void tearDown(){
driver.quit();
}
}package base;
import static org.testng.Assert.*;
import org.testng.annotations.Test;
import pages.LoginPage;
import pages.SecureAreaPage;
public class LoginTests extends BaseTests {
@Test
public void loginAsTomSmith(){
LoginPage loginPage = homePage.clickFormAuthentication();
loginPage.enterUsername("tomsmith");
loginPage.enterPassword("SuperSecretPassword!");
SecureAreaPage secureAreaPage = loginPage.clickLogin();
secureAreaPage.getBannerText();
assertTrue(secureAreaPage.getBannerText()
.contains("You logged into a secure area!"),"Incorrect message displayed");
}
}发布于 2022-05-05 06:39:23
您的SecureAreaPage包含一个从未初始化的字段private WebDriver driver; (在您称为super(driver);的构造函数中,但从未在SecureAreaPage中初始化该字段)。
在方法getBannerText()中,调用driver.findElement(loginBanner),后者从SecureAreaPage访问字段。
因为BasePage的每个子类都可以访问BasePage中的driver字段,所以不需要hat字段。把它移开一切都会正常的。
这背后的原理是类driver的字段SecureAreaPage“阴影”类BasePage的字段driver。
发布于 2022-05-05 06:19:05
安装的Chrome版本是否使用正确的chromedriver.exe?
不久前,这就是我遇到这个问题时的解决办法。
看一下这一页:
https://chromedriver.chromium.org/downloads
如果您使用ChromeDriver 102,请下载ChromeDriver 102.0.5005.27
如果您正在使用ChromeDriver 101,请下载ChromeDriver 101.0.4951.41
如果您正在使用ChromeDriver 100,请下载ChromeDriver 100.0.4896.60
https://stackoverflow.com/questions/72122624
复制相似问题