Java 在Selenium中执行两个测试类时出现NullPointer异常
我创建了两个测试类。登录测试类取决于设置测试类。所以,我在登录测试中使用了Java 在Selenium中执行两个测试类时出现NullPointer异常,java,selenium-webdriver,testng,Java,Selenium Webdriver,Testng,我创建了两个测试类。登录测试类取决于设置测试类。所以,我在登录测试中使用了dependsOnMethodsannotation并扩展了设置类。但是,当通过TestNG执行两个测试类时,设置测试成功执行,但在第二个测试类执行时,它会给出null指针异常 测试类可以单独执行 第1类:设置代码 package com.selenium.tests; import java.io.IOException; import org.apache.logging.log4j.LogManager; imp
dependsOnMethods
annotation并扩展了设置类。但是,当通过TestNG执行两个测试类时,设置测试成功执行,但在第二个测试类执行时,它会给出null指针异常
测试类可以单独执行
第1类:设置代码
package com.selenium.tests;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.selenium.pageObjects.SignIn;
import com.selenium.pageObjects.DashBoard;
import com.selenium.pageObjects.Setting;
import com.selenium.resources.base;
import junit.framework.Assert;
public class SettingTest extends base {
public WebDriver driver;
SignIn signIn;
String getTitle;
public static Logger log = LogManager.getLogger(SettingTest.class.getName());
@BeforeTest
public void intializeDriver() throws IOException {
System.out.println("before Test");
driver = browserIntilization();
driver.get(prop.getProperty("Application_url"));
log.info("Application is opened");
}
@Test
public void Dealer_to_set_the_app_configuration() throws IOException, InterruptedException {
System.out.println("1st Test");
Setting sourceLogin = new Setting(driver);
Select market = selectFunction(sourceLogin.getMarket());
market.selectByVisibleText("USA");
log.info("market is selected");
Select language = selectFunction(sourceLogin.getlanguage());
language.selectByVisibleText("English");
log.info("Language is Selected");
signIn = sourceLogin.getSignIn();
Thread.sleep(5000);
getTitle = signIn.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Login Page Successfully.");
}
@AfterTest
public void tearDown() {
System.out.println("After Test Executed");
driver.quit();
}
}
package com.selenium.tests;
import org.testng.annotations.Test;
import com.selenium.pageObjects.DashBoard;
import junit.framework.Assert;
public class LoginTest extends SettingTest{
@Test (dependsOnMethods = ("Dealer_to_set_the_app_configuration"))
public void Dealer_enters_valid_credential_to_login_inside_the_app() throws InterruptedException {
System.out.println("2nd test");
signIn.getDealerID("70052");
log.info("DealerID is entered successfully");
signIn.getUserID("x579303");
log.info("userID is entered successfully");
signIn.getPassword("Nissan#2020");
log.info("password is entered successfully");
DashBoard dashboard = signIn.getDashBoard();
Thread.sleep(5000);
dashboard.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Dashboard Page Successfully.");
}
}
package com.selenium.resources;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class base {
public WebDriver driver;
public Properties prop;
public WebDriver browserIntilization() throws IOException {
prop = new Properties();
FileInputStream fis = new FileInputStream(
System.getProperty("user.dir") + "\\src\\test\\java\\com\\selenium\\resources\\properties.Properties");
prop.load(fis);
String browsername = prop.getProperty("browser");
if (browsername.equals("safari")) {
driver = new SafariDriver();
} else if (browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "\\browser_Servers\\chromedriver.exe");
driver = new ChromeDriver();
} else if (browsername.equals("firefox")) {
System.setProperty("webdriver.gecko.driver",
System.getProperty("user.dir") + "\\browser_Servers\\geckodriver.exe");
driver = new FirefoxDriver();
} else {
System.setProperty("webdriver.ie.driver",
System.getProperty("user.dir") + "\\browser_Servers\\IEDriverServer.exe");
driver = new FirefoxDriver();
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
return driver;
}
public Select selectFunction(WebElement element) {
Select select = new Select(element);
return select;
}
public String getScreenShotPath(String testCaseName, WebDriver driver) throws IOException
{
TakesScreenshot ts=(TakesScreenshot) driver;
File source =ts.getScreenshotAs(OutputType.FILE);
String destinationFile = System.getProperty("user.dir")+"\\screenShots\\"+testCaseName+".png";
FileUtils.copyFile(source,new File(destinationFile));
return destinationFile;
}
}
第2类:登录代码
package com.selenium.tests;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.selenium.pageObjects.SignIn;
import com.selenium.pageObjects.DashBoard;
import com.selenium.pageObjects.Setting;
import com.selenium.resources.base;
import junit.framework.Assert;
public class SettingTest extends base {
public WebDriver driver;
SignIn signIn;
String getTitle;
public static Logger log = LogManager.getLogger(SettingTest.class.getName());
@BeforeTest
public void intializeDriver() throws IOException {
System.out.println("before Test");
driver = browserIntilization();
driver.get(prop.getProperty("Application_url"));
log.info("Application is opened");
}
@Test
public void Dealer_to_set_the_app_configuration() throws IOException, InterruptedException {
System.out.println("1st Test");
Setting sourceLogin = new Setting(driver);
Select market = selectFunction(sourceLogin.getMarket());
market.selectByVisibleText("USA");
log.info("market is selected");
Select language = selectFunction(sourceLogin.getlanguage());
language.selectByVisibleText("English");
log.info("Language is Selected");
signIn = sourceLogin.getSignIn();
Thread.sleep(5000);
getTitle = signIn.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Login Page Successfully.");
}
@AfterTest
public void tearDown() {
System.out.println("After Test Executed");
driver.quit();
}
}
package com.selenium.tests;
import org.testng.annotations.Test;
import com.selenium.pageObjects.DashBoard;
import junit.framework.Assert;
public class LoginTest extends SettingTest{
@Test (dependsOnMethods = ("Dealer_to_set_the_app_configuration"))
public void Dealer_enters_valid_credential_to_login_inside_the_app() throws InterruptedException {
System.out.println("2nd test");
signIn.getDealerID("70052");
log.info("DealerID is entered successfully");
signIn.getUserID("x579303");
log.info("userID is entered successfully");
signIn.getPassword("Nissan#2020");
log.info("password is entered successfully");
DashBoard dashboard = signIn.getDashBoard();
Thread.sleep(5000);
dashboard.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Dashboard Page Successfully.");
}
}
package com.selenium.resources;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class base {
public WebDriver driver;
public Properties prop;
public WebDriver browserIntilization() throws IOException {
prop = new Properties();
FileInputStream fis = new FileInputStream(
System.getProperty("user.dir") + "\\src\\test\\java\\com\\selenium\\resources\\properties.Properties");
prop.load(fis);
String browsername = prop.getProperty("browser");
if (browsername.equals("safari")) {
driver = new SafariDriver();
} else if (browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "\\browser_Servers\\chromedriver.exe");
driver = new ChromeDriver();
} else if (browsername.equals("firefox")) {
System.setProperty("webdriver.gecko.driver",
System.getProperty("user.dir") + "\\browser_Servers\\geckodriver.exe");
driver = new FirefoxDriver();
} else {
System.setProperty("webdriver.ie.driver",
System.getProperty("user.dir") + "\\browser_Servers\\IEDriverServer.exe");
driver = new FirefoxDriver();
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
return driver;
}
public Select selectFunction(WebElement element) {
Select select = new Select(element);
return select;
}
public String getScreenShotPath(String testCaseName, WebDriver driver) throws IOException
{
TakesScreenshot ts=(TakesScreenshot) driver;
File source =ts.getScreenshotAs(OutputType.FILE);
String destinationFile = System.getProperty("user.dir")+"\\screenShots\\"+testCaseName+".png";
FileUtils.copyFile(source,new File(destinationFile));
return destinationFile;
}
}
错误
[RemoteTestNG] detected TestNG version 7.3.0
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
before Test
Starting ChromeDriver 85.0.4183.87 (cd6713ebf92fa1cacc0f1a598df280093af0c5d7-refs/branch-heads/4183@{#1689}) on port 40014
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
[1602609611.367][WARNING]: This version of ChromeDriver has not been tested with Chrome version 86.
Oct 13, 2020 10:50:13 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
1st Test
1st Test
After Test Executed
java.lang.NullPointerException
at com.selenium.resources.base.getScreenShotPath(base.java:78)
at com.selenium.listeners.Listeners.onTestFailure(Listeners.java:53)
at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:96)
at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:220)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:832)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(Unknown Source)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
基类代码
package com.selenium.tests;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.selenium.pageObjects.SignIn;
import com.selenium.pageObjects.DashBoard;
import com.selenium.pageObjects.Setting;
import com.selenium.resources.base;
import junit.framework.Assert;
public class SettingTest extends base {
public WebDriver driver;
SignIn signIn;
String getTitle;
public static Logger log = LogManager.getLogger(SettingTest.class.getName());
@BeforeTest
public void intializeDriver() throws IOException {
System.out.println("before Test");
driver = browserIntilization();
driver.get(prop.getProperty("Application_url"));
log.info("Application is opened");
}
@Test
public void Dealer_to_set_the_app_configuration() throws IOException, InterruptedException {
System.out.println("1st Test");
Setting sourceLogin = new Setting(driver);
Select market = selectFunction(sourceLogin.getMarket());
market.selectByVisibleText("USA");
log.info("market is selected");
Select language = selectFunction(sourceLogin.getlanguage());
language.selectByVisibleText("English");
log.info("Language is Selected");
signIn = sourceLogin.getSignIn();
Thread.sleep(5000);
getTitle = signIn.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Login Page Successfully.");
}
@AfterTest
public void tearDown() {
System.out.println("After Test Executed");
driver.quit();
}
}
package com.selenium.tests;
import org.testng.annotations.Test;
import com.selenium.pageObjects.DashBoard;
import junit.framework.Assert;
public class LoginTest extends SettingTest{
@Test (dependsOnMethods = ("Dealer_to_set_the_app_configuration"))
public void Dealer_enters_valid_credential_to_login_inside_the_app() throws InterruptedException {
System.out.println("2nd test");
signIn.getDealerID("70052");
log.info("DealerID is entered successfully");
signIn.getUserID("x579303");
log.info("userID is entered successfully");
signIn.getPassword("Nissan#2020");
log.info("password is entered successfully");
DashBoard dashboard = signIn.getDashBoard();
Thread.sleep(5000);
dashboard.getPageTitle();
Assert.assertEquals("ICAR-X", getTitle);
log.info("User redirected to Dashboard Page Successfully.");
}
}
package com.selenium.resources;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class base {
public WebDriver driver;
public Properties prop;
public WebDriver browserIntilization() throws IOException {
prop = new Properties();
FileInputStream fis = new FileInputStream(
System.getProperty("user.dir") + "\\src\\test\\java\\com\\selenium\\resources\\properties.Properties");
prop.load(fis);
String browsername = prop.getProperty("browser");
if (browsername.equals("safari")) {
driver = new SafariDriver();
} else if (browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "\\browser_Servers\\chromedriver.exe");
driver = new ChromeDriver();
} else if (browsername.equals("firefox")) {
System.setProperty("webdriver.gecko.driver",
System.getProperty("user.dir") + "\\browser_Servers\\geckodriver.exe");
driver = new FirefoxDriver();
} else {
System.setProperty("webdriver.ie.driver",
System.getProperty("user.dir") + "\\browser_Servers\\IEDriverServer.exe");
driver = new FirefoxDriver();
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
return driver;
}
public Select selectFunction(WebElement element) {
Select select = new Select(element);
return select;
}
public String getScreenShotPath(String testCaseName, WebDriver driver) throws IOException
{
TakesScreenshot ts=(TakesScreenshot) driver;
File source =ts.getScreenshotAs(OutputType.FILE);
String destinationFile = System.getProperty("user.dir")+"\\screenShots\\"+testCaseName+".png";
FileUtils.copyFile(source,new File(destinationFile));
return destinationFile;
}
}
请在此处发布testng.xml,您的测试用例:设置代码似乎运行了2次,这是因为根据您共享的控制台输出,它显示了syso消息“first test”2次,并且您使用了driver.quit()在@AfterTest注释中,然后第二次测试:登录代码不会作为驱动程序运行。quit()将终止浏览器的所有运行会话 快速解决方案:Testng.xml
你能展示你的基类代码吗?看起来null指针位于基类的getScreenshotPatch方法上。我已经添加了基类代码。它单独运行很好,但在一起执行时会遇到问题。为什么要将驱动程序对象传递给screenshot方法?驱动程序是从这个基类初始化的,它是公共的。尝试将空检查添加到此方法的驱动程序对象。我认为,浏览器可能已经关闭,但您正在尝试截图,在这种情况下,驱动程序将为空。