【发布时间】:2020-05-31 12:29:23
【问题描述】:
我正在制作一个 maven 项目,在打开 chrome 浏览器时显示 java.lang.NullPointerException 异常,我无法找到这里缺少的内容以及浏览器无法打开的原因。
我的基类是这样的
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterMethod;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import pages.LandingPage;
import pages.LoginPage;
import utils.ExtentReportManager;
import utils.DateUtils;
public class Base {
public WebDriver driver;
public Properties prop;
public ExtentReports report = ExtentReportManager.getReportInstance();
public ExtentTest logger;
public void invokeBrowser(String browsername) {
try {
if (browsername.equalsIgnoreCase("Chrome")) {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "\\src\\resourc\\driver\\chromedriver.exe");
driver = new ChromeDriver();//This is line 39 in Base
} else if (browsername.equalsIgnoreCase("Firefox")) {
System.setProperty("webdriver.gecko.driver",
System.getProperty("user.dir") + "\\src\\resourc\\driver\\geckodriver.exe");
driver = new FirefoxDriver();
} else {
System.setProperty("webdriver.IEDriverServer.driver",
System.getProperty("user.dir") + "\\src\\resourc\\driver\\IEDriverServer.exe");
driver = new InternetExplorerDriver();
}
} catch (Exception e) {
e.printStackTrace();
}
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);//**This is line 53**
driver.manage().window().maximize();
driver.manage().timeouts().pageLoadTimeout(180, TimeUnit.SECONDS);
prop = new Properties();
try {
FileInputStream file = new FileInputStream(
System.getProperty("user.dir") + "\\src\\resourc\\ObjectRepository\\projectConfig.properties");
prop.load(file);
} catch (Exception e) {
e.printStackTrace();
}
}
public LandingPage OpenApplication(String websiteURLKey ) {
driver.get(prop.getProperty(websiteURLKey));
return PageFactory.initElements(driver, LandingPage.class);
}
public void closebrowser() {
driver.close();
}
@AfterMethod
public void reportFlush() {
report.flush();
}
/****************** Capture Screen Shot ***********************/
public void takeScreenShotOnFailure() {
TakesScreenshot takeScreenShot = (TakesScreenshot) driver;
File sourceFile = takeScreenShot.getScreenshotAs(OutputType.FILE);
File destFile = new File(System.getProperty("user.dir") + "/ScreenShots/" + DateUtils.getTimeStamp() + ".png");
try {
FileUtils.copyFile(sourceFile, destFile);
// logger.addScreenCaptureFromPath(
// System.getProperty("user.dir") + "/ScreenShots/" + DateUtils.getTimeStamp() + ".png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的测试类是这样的,我从那里一个一个地运行项目的所有文件
package test;
import org.apache.http.client.utils.DateUtils;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Test;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import base.Base;
import pages.DisplayDetails;
import pages.HomePage;
import pages.LandingPage;
import pages.LoginPage;
import pages.UpcomingBikesPage;
import utils.ExtentReportManager;
public class ProjectTest extends Base{
LandingPage landingpage;
LoginPage loginpage;
HomePage homepage;
UpcomingBikesPage upcomingbikespage;
DisplayDetails displaydetails;
@Test
public void openBrowser() throws Exception {
logger = report.createTest("Zigwheels Website Automation");
Base base = new Base();
logger.log(Status.INFO, "Initializing the Browser");
base.invokeBrowser("chrome");//**This is line 32 in test file**
logger.log(Status.INFO, "Opening the Website");
landingpage = base.OpenApplication("websiteURL");
logger.log(Status.INFO, " Login initated Successfully");
loginpage = landingpage.initiatelogin();
logger.log(Status.INFO, "Entered Credentials Successfully");
homepage = loginpage.login();
logger.log(Status.INFO, "Login Successfull");
upcomingbikespage = homepage.home();
logger.log(Status.INFO, "Got Upcoming Honda Bikes Successfully");
displaydetails=upcomingbikespage.hondamanufacturer();
displaydetails.finaly();
//logger.addScreenCaptureFromPath(System.getProperty("user.dir") + "/ScreenShots/" + DateUtils.getTimeStamp() + ".png");
}
}
并且在控制台报错如下--
[RemoteTestNG] detected TestNG version 6.14.3
Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 36324
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
FAILED: openBrowser
java.lang.NullPointerException
at base.Base.invokeBrowser(Base.java:53)
at test.ProjectTest.openBrowser(ProjectTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
第 53 行通过隐式等待行的注释显示 测试中的第 32 行也通过注释显示,即 base.invokeBrowser("chrome");行。
org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 80
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'PRANJAL', ip: '192.168.225.26', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_241'
Driver info: driver.version: ChromeDriver
remote stacktrace: Backtrace:
Ordinal0 [0x00F80C83+1707139]
Ordinal0 [0x00EE68F1+1075441]
Ordinal0 [0x00E5DFC9+516041]
Ordinal0 [0x00DF0554+66900]
Ordinal0 [0x00DECCE2+52450]
Ordinal0 [0x00E0BFD7+180183]
Ordinal0 [0x00E0BDDD+179677]
Ordinal0 [0x00E09D4B+171339]
Ordinal0 [0x00DF1D4A+73034]
Ordinal0 [0x00DF2DC0+77248]
Ordinal0 [0x00DF2D59+77145]
Ordinal0 [0x00EFBB67+1162087]
GetHandleVerifier [0x0101A966+508998]
GetHandleVerifier [0x0101A6A4+508292]
GetHandleVerifier [0x0102F7B7+594583]
GetHandleVerifier [0x0101B1D6+511158]
Ordinal0 [0x00EF402C+1130540]
Ordinal0 [0x00EFD4CB+1168587]
Ordinal0 [0x00EFD633+1168947]
Ordinal0 [0x00F15B35+1268533]
BaseThreadInitThunk [0x75F9343D+18]
RtlInitializeExceptionChain [0x77209812+99]
RtlInitializeExceptionChain [0x772097E5+54]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$errorHandler$0(W3CHandshakeResponse.java:62)
at org.openqa.selenium.remote.HandshakeResponse.lambda$getResponseFunction$0(HandshakeResponse.java:30)
at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:126)
at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
【问题讨论】:
-
在
Base课程中默默地吃异常是不好的。至少将e.printStackTrace()放在你的catch 块中。看到你得到的异常打印了行号at base.Base.invokeBrowser(Base.java:53)- 我们不知道哪一行是第 53 行,你需要把它指向我们。 -
在
System.setProperty(),尝试绝对路径而不是System.getProperty("user.dir") + "\\src\\resourc\\driver\\chromedriver.exe"); -
@SUPREMESOUL 请指出哪一行是代码中的第 53 行。另外请做一些检查,首先看看代码是否能够访问驱动程序路径,其次为什么你需要implicitwait和pageLoadTimeout等待?
-
@Tony 给出的解决方案“绝对路径”不起作用
-
@SUPREMESOUL 您的 webdriver 会话未创建。因此,如果是这种情况,驱动程序将被分配空值,这最终会引发空指针异常。
标签: java maven selenium-webdriver nullpointerexception testng