NullPointerException when working with selenium-chrome-driver in Maven without ChromeDriver.exe

huangapple 未分类评论42阅读模式
英文:

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 = &quot;https://example.com&quot;;
    public String serverUrlLogout = &quot;https://example.com&quot;;
    public String adminServerUrl = &quot;https://example.com&quot;;

    public final Long ONE_SECOND_DELAY = 1000L;
    public Map&lt;Long, WebDriver&gt; 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&lt;&gt;();
        for (Map.Entry&lt;String, String&gt; entry : context.getCurrentXmlTest().getAllParameters().entrySet()) {
            if (entry.getKey().toLowerCase().equals(&quot;url&quot;)) {
                url = entry.getValue();
            }
            if (entry.getKey().toLowerCase().equals(&quot;serverUrlLogout&quot;)) {
                serverUrlLogout = entry.getValue();
            }
        }
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
        for (Map.Entry&lt;Long, WebDriver&gt; 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(&quot;***Test &quot; + result.getName() + &quot; ERROR&quot;);
            // 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

&lt;configuration&gt;
                    &lt;installationDirectory&gt;${project.build.directory}/test-classes&lt;/installationDirectory&gt;
                    &lt;!-- &lt;installationDirectory&gt;${project.basedir}/src/test/resources&lt;/installationDirectory&gt;--&gt;
                    &lt;keepDownloadedWebdrivers&gt;true&lt;/keepDownloadedWebdrivers&gt;
                    &lt;drivers&gt;
                        &lt;driver&gt;
                            &lt;name&gt;chromedriver&lt;/name&gt;
                            &lt;!--suppress UnresolvedMavenProperty --&gt;
                            &lt;platform&gt;${os.detected.name}&lt;/platform&gt;
                            &lt;!-- &lt;platform&gt;windows&lt;/platform&gt; --&gt;
                            &lt;bit&gt;32&lt;/bit&gt;
                            &lt;!-- &lt;version&gt;74.0.3729.6&lt;/version&gt; --&gt;
                            &lt;!-- &lt;url&gt;https://chromedriver.storage.googleapis.com/74.0.3729.6/chromedriver_win32.zip&lt;/url&gt; --&gt;
                            &lt;!-- &lt;version&gt;76.0.3809.126&lt;/version&gt; --&gt;
                            &lt;!-- &lt;url&gt;https://chromedriver.storage.googleapis.com/76.0.3809.126/chromedriver_win32.zip&lt;/url&gt; --&gt;
                            &lt;!-- 							&lt;url&gt;https://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_win32.zip&lt;/url&gt; --&gt;
                            &lt;url&gt;https://chromedriver.storage.googleapis.com/80.0.3987.106/chromedriver_win32.zip&lt;/url&gt;

                        &lt;/driver&gt;
                    &lt;/drivers&gt;
                &lt;/configuration&gt;

Where should test-classes directory be located? under src directory in my project?

installationDirectory&gt;${project.build.directory}/test-classes&lt;/installationDirectory&gt;

huangapple
  • 本文由 发表于 2020年4月9日 23:10:37
  • 转载请务必保留本文链接:https://java.coder-hub.com/61124352.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定