我正在用TestNG编写一个简单的Selenium代码。我已经在基类中初始化了驱动程序,页面类和测试类都在扩展基类,但是驱动程序没有在页面类中继承。但是,相同的驱动程序在测试类中继承。有人能解释一下为什么会发生这种情况吗?编辑:从页面类中删除了WebDriver驱动程序,但它给出了相同的错误:java.lang.NullPointerException:无法调用“org.openqa.selenium.WebDriver.get(字符串)”,因为“此.driver”为空
基类
public class BaseClass {
protected WebDriver driver;
protected String username;
protected String password;
protected String browserName;
protected String url;
@BeforeSuite
public void setUp() throws IOException, InterruptedException {
username = "admin";
password = "admin";
browserName = "chrome";
url = "https://practice-cybertekschool.herokuapp.com/";
// get the driver setp and type and the browser
if (browserName.equalsIgnoreCase("Chrome")) {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
} else if (browserName.equalsIgnoreCase("FireFox")) {
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
} else if (browserName.equalsIgnoreCase("Edge")) {
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
}
driver.manage().deleteAllCookies();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
driver.get(url);
}
@AfterSuite
public void tearDown() {
driver.quit();
}
}
页面类
public class BasicAuthPages extends BaseClass {
By congratulationMessage = By.xpath("//p[contains(text(),'Congratulations')]");
// for authentication
public boolean authentication() {
driver.get("https://"+username+":"+password+"@practice-cybertekschool.herokuapp.com/basic_auth");
return authenticationMessage();
}
// to get authentication message
private boolean authenticationMessage() {
String message = driver.findElement(congratulationMessage).getText();
//System.out.println(message);
if (message.equals("Congratulations! You must have the proper credentials.")) {
return true;
}
else {
return false;
}
}
}
测试类别
public class Tests extends BaseClass {
BasicAuthPages basicAuthPages;
@Test
public void authTest() {
basicAuthPages = new BasicAuthPages();
Boolean success = basicAuthPages.authentication();
// System.out.println(username+" :"+password);
Assert.assertTrue(success);
}
}
在运行这个函数时,它会给出java.lang.NullPointerException异常:无法调用“org.openqa.selenium.WebDriver.get(String)”,因为“this.driver”是空异常。但是,驱动程序在Test类中初始化,如果我进行以下更改,它将运行。
基类
public class BaseClass {
protected WebDriver driver;
protected String username;
protected String password;
protected String browserName;
protected String url;
@BeforeSuite
public void setUp() throws IOException, InterruptedException {
username = "admin";
password = "admin";
browserName = "chrome";
url = "https://practice-cybertekschool.herokuapp.com/";
// get the driver setp and type and the browser
if (browserName.equalsIgnoreCase("Chrome")) {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
} else if (browserName.equalsIgnoreCase("FireFox")) {
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
} else if (browserName.equalsIgnoreCase("Edge")) {
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
}
driver.manage().deleteAllCookies();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
driver.get(url);
}
@AfterSuite
public void tearDown() {
driver.quit();
}
}
页面类
public class BasicAuthPages extends BaseClass {
WebDriver driver;
By congratulationMessage = By.xpath("//p[contains(text(),'Congratulations')]");
public BasicAuthPages(WebDriver driver) {
this.driver = driver;
}
// for authentication
public boolean authentication(String username, String password) {
driver.get("https://"+username+":"+password+"@practice-cybertekschool.herokuapp.com/basic_auth");
return authenticationMessage();
}
// to get authentication message
private boolean authenticationMessage() {
String message = driver.findElement(congratulationMessage).getText();
//System.out.println(message);
if (message.equals("Congratulations! You must have the proper credentials.")) {
return true;
}
else {
return false;
}
}
}
测试类别
public class Tests extends BaseClass {
BasicAuthPages basicAuthPages;
CheckBoxPages checkBoxPages;
@Test
public void authTest() {
basicAuthPages = new BasicAuthPages(driver);
Boolean success = basicAuthPages.authentication(username, password);
// System.out.println(username+" :"+password);
Assert.assertTrue(success);
}
}
请有人解释一下为什么驱动程序在第一种情况下没有被继承?驱动程序在第二种情况下被继承,在测试类中被继承,为什么不在页面类的第一种情况下被继承?提前感谢
3条答案
按热度按时间zujrkrfu1#
您会得到这个 java.lang.NullPointerException,因为在您的第一个“BasicAuthPages”类中,您已经声明了
Webdriver driver
,但是这个驱动程序没有初始化。然而,在第二个“BasicAuthPages”类中,“driver”是在“BasicAuthPages”类的构造函数下初始化的,因此它工作正常。
在第一种情况下,由于您正在扩展基类,因此无需在页面类'BasicAuthPages'中再次声明
Webdriver driver
。由于您只声明了驱动程序但未初始化,因此在尝试访问驱动程序时会收到NullPOinterException。wljmcqd82#
如果你想并行运行测试(需要一个大的测试套件尽可能快地运行),那么驱动程序最好在测试类中初始化
如果Page Object类继承自Base类,则在初始化期间传入驱动程序
ymzxtsji3#
尝试在
BaseAuthPages
构造函数中使用super()
关键字,如下所示:super
关键字用于引用父类对象。在您的示例中,引用BaseClass
对象。