英文:
NullPointerException when working with selenium-chrome-driver in Maven without ChromeDriver.exe
问题
这是我的LocalTestRunner类,其中包含获取WebDriver的方法以及使用它的Before和After方法。但是我得到了一个错误。这段代码我在GitHub上找到的。我知道这段代码无法找到WebDriver,我应该写路径吗?
类
public abstract class LocalTestRunner {
public String url = "https://example.com";
public String serverUrlLogout = "https://example.com";
public String adminServerUrl = "https://example.com";
public final Long ONE_SECOND_DELAY = 1000L;
public Map<Long, WebDriver> drivers;
protected WebDriver driver;
public SoftAssert softAssert;
public WebDriver getDriver() {
WebDriver currentWebDriver = drivers.get(Thread.currentThread().getId());
if (currentWebDriver == null) {
currentWebDriver = new ChromeDriver();
currentWebDriver.manage().window().maximize();
currentWebDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
drivers.put(Thread.currentThread().getId(), currentWebDriver);
}
return currentWebDriver;
}
@BeforeSuite
public void beforeSuite() {
WebDriverManager.chromedriver().setup();
}
@BeforeClass
public void beforeClass(ITestContext context) {
drivers = new HashMap<>();
for (Map.Entry<String, String> entry : context.getCurrentXmlTest().getAllParameters().entrySet()) {
if (entry.getKey().toLowerCase().equals("url")) {
url = entry.getValue();
}
if (entry.getKey().toLowerCase().equals("serverUrlLogout")) {
serverUrlLogout = entry.getValue();
}
}
}
@AfterClass(alwaysRun = true)
public void afterClass() {
for (Map.Entry<Long, WebDriver> currentWebDriver : drivers.entrySet()) {
if (currentWebDriver.getValue() != null) {
currentWebDriver.getValue().quit();
}
}
}
@BeforeMethod
public void beforeMethod() {
softAssert = new SoftAssert();
getDriver().get(url);
}
@AfterMethod
public void afterMethod(ITestResult result) {
if (!result.isSuccess()) {
System.out.println("***Test " + result.getName() + " ERROR");
// Take Screenshot, save sourceCode, save to log, prepare report, Return to
new ScreenShotHelper(getDriver()).keepPageSourceStatus();
// previous state, logout, etc.
}
getDriver().get(serverUrlLogout);
ApplicationStatus.get().setLogged(false);
}
}
更新
我在我的pom.xml中添加了一些代码,但它仍然不起作用。
<configuration>
<installationDirectory>${project.build.directory}/test-classes</installationDirectory>
<!--<installationDirectory>${project.basedir}/src/test/resources</installationDirectory>-->
<keepDownloadedWebdrivers>true</keepDownloadedWebdrivers>
<drivers>
<driver>
<name>chromedriver</name>
<!--<platform>${os.detected.name}</platform>-->
<!--<platform>windows</platform>-->
<bit>32</bit>
<!--<version>74.0.3729.6</version>-->
<!--<url>https://chromedriver.storage.googleapis.com/74.0.3729.6/chromedriver_win32.zip</url>-->
<!--<version>76.0.3809.126</version>-->
<!--<url>https://chromedriver.storage.googleapis.com/76.0.3809.126/chromedriver_win32.zip</url>-->
<!--<version>79.0.3945.36</version>-->
<!--<url>https://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_win32.zip</url>-->
<url>https://chromedriver.storage.googleapis.com/80.0.3987.106/chromedriver_win32.zip</url>
</driver>
</drivers>
</configuration>
测试类目录应该位于哪里?在我的项目中的src目录下吗?
<installationDirectory>${project.build.directory}/test-classes</installationDirectory>
英文:
Here is my LocalTestRunner class that contains method that getting WebDriver and also After and BeforeMethod which using it. But i am getting an error. This code i found on the github. I know that i this code can't find webdriver, should i write path to it?
> java.lang.NullPointerException
> at dtapi.dtapiBase.LocalTestRunner.getDriver(LocalTestRunner.java:27)
> at dtapi.dtapiBase.LocalAdminTestRunner.loadSignInPage(LocalAdminTestRunner.java:18)
> at dtapiLoginTest.AdminPageTest.addRouter(AdminPageTest.java:47)
Class
public abstract class LocalTestRunner {
public String url = "https://example.com";
public String serverUrlLogout = "https://example.com";
public String adminServerUrl = "https://example.com";
public final Long ONE_SECOND_DELAY = 1000L;
public Map<Long, WebDriver> drivers;
protected WebDriver driver;
public SoftAssert softAssert;
public WebDriver getDriver() {
WebDriver currentWebDriver = drivers.get(Thread.currentThread().getId());
if (currentWebDriver == null) {
currentWebDriver = new ChromeDriver();
currentWebDriver.manage().window().maximize();
currentWebDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
drivers.put(Thread.currentThread().getId(), currentWebDriver);
}
return currentWebDriver;
}
@BeforeSuite
public void beforeSuite() {
WebDriverManager.chromedriver().setup();
}
@BeforeClass
public void beforeClass(ITestContext context) {
drivers = new HashMap<>();
for (Map.Entry<String, String> entry : context.getCurrentXmlTest().getAllParameters().entrySet()) {
if (entry.getKey().toLowerCase().equals("url")) {
url = entry.getValue();
}
if (entry.getKey().toLowerCase().equals("serverUrlLogout")) {
serverUrlLogout = entry.getValue();
}
}
}
@AfterClass(alwaysRun = true)
public void afterClass() {
for (Map.Entry<Long, WebDriver> currentWebDriver : drivers.entrySet()) {
if (currentWebDriver.getValue() != null) {
currentWebDriver.getValue().quit();
}
}
}
@BeforeMethod
public void beforeMethod() {
softAssert = new SoftAssert();
getDriver().get(url);
}
@AfterMethod
public void afterMethod(ITestResult result) {
if (!result.isSuccess()) {
System.out.println("***Test " + result.getName() + " ERROR");
// Take Screenshot, save sourceCode, save to log, prepare report, Return to
new ScreenShotHelper(getDriver()).keepPageSourceStatus();
// previous state, logout, etc.
}
getDriver().get(serverUrlLogout);
ApplicationStatus.get().setLogged(false);
}
UPDATE
I have added some code in my pom.xml but it still isn't working
<configuration>
<installationDirectory>${project.build.directory}/test-classes</installationDirectory>
<!-- <installationDirectory>${project.basedir}/src/test/resources</installationDirectory>-->
<keepDownloadedWebdrivers>true</keepDownloadedWebdrivers>
<drivers>
<driver>
<name>chromedriver</name>
<!--suppress UnresolvedMavenProperty -->
<platform>${os.detected.name}</platform>
<!-- <platform>windows</platform> -->
<bit>32</bit>
<!-- <version>74.0.3729.6</version> -->
<!-- <url>https://chromedriver.storage.googleapis.com/74.0.3729.6/chromedriver_win32.zip</url> -->
<!-- <version>76.0.3809.126</version> -->
<!-- <url>https://chromedriver.storage.googleapis.com/76.0.3809.126/chromedriver_win32.zip</url> -->
<!-- <url>https://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_win32.zip</url> -->
<url>https://chromedriver.storage.googleapis.com/80.0.3987.106/chromedriver_win32.zip</url>
</driver>
</drivers>
</configuration>
Where should test-classes directory be located? under src directory in my project?
installationDirectory>${project.build.directory}/test-classes</installationDirectory>
专注分享java语言的经验与见解,让所有开发者获益!
评论