Search code examples
javaseleniumhtmlunit-driver

Selenium with HTMLUnitDriver ScriptException (tmp-file not found) on second .get(url)


I run selenium tests with testng and htmlUnitDriver. I use one webDriver-instance for all tests. I just logout and clear cookies driver.manage().deleteAllCookies() after every test class (the delete-cookies itself is not responsible I tested for that)

So what basically happens is:

driver.get(url1);
... login to Single Page App ...
driver ... pseudo ... find logout-element and click logout
driver.manage().deleteAllCokies();
driver.get(url1);
... input credentials ...
loginForm.submit();

And this leads to the following exception:

    com.gargoylesoftware.htmlunit.ScriptException: java.io.FileNotFoundException: C:\tmp\selenium\htmlunit5619416597224576810.tmp (Das System kann die angegebene Datei nicht finden)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:705)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:620)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:513)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:637)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:612)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1001)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventListeners(EventListenersContainer.java:179)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:239)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:814)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:748)
        at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:920)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:620)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:513)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:925)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeEventHandlersIfNeeded(HtmlPage.java:1298)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:256)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:475)
        at com.gargoylesoftware.htmlunit.WebClient.loadDownloadedResponses(WebClient.java:2074)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:733)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.processPostponedActions(JavaScriptEngine.java:820)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1325)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1268)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1216)
        at org.openqa.selenium.htmlunit.HtmlUnitWebElement.submit(HtmlUnitWebElement.java:177)
        ... <snip> ...
        at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
    Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: C:\tmp\selenium\htmlunit5619416597224576810.tmp (Das System kann die angegebene Datei nicht finden)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:739)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$500(JavaScriptEngine.java:93)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:700)
        ... 56 more
    Caused by: java.io.FileNotFoundException: C:\tmp\selenium\htmlunit5619416597224576810.tmp (Das System kann die angegebene Datei nicht finden)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at com.gargoylesoftware.htmlunit.DownloadedContent$OnFile.getInputStream(DownloadedContent.java:81)
        at com.gargoylesoftware.htmlunit.WebResponseData.getStream(WebResponseData.java:91)
        at com.gargoylesoftware.htmlunit.WebResponseData.getInputStream(WebResponseData.java:156)
        at com.gargoylesoftware.htmlunit.WebResponse.getContentAsStream(WebResponse.java:241)
        at com.gargoylesoftware.htmlunit.util.WebResponseWrapper.getContentAsStream(WebResponseWrapper.java:58)
        at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:150)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:468)
        at com.gargoylesoftware.htmlunit.WebClient.loadDownloadedResponses(WebClient.java:2074)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:733)
        ... 58 more

The deletion of that file happens on the second get-call. I would be happy for suggestions about what could cause that.

This is the selenium maven-dependency I use:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.45.0</version>
    </dependency>

Solution

  • This bug is because the WebResponse is cached, and the old page is cleaned on getting the new page and its local file is deleted (the content is bigger than 500 KB by default).

    You can use the below till this is fixed.

        WebDriver driver = new HtmlUnitDriver() {
            @Override
            protected WebClient getWebClient() {
                WebClient c = super.getWebClient();
                c.getCache().setMaxSize(0);
                return c;
            }
        };