Selenium 在第二个 .get(url) 上出现 HTMLUnitDriver ScriptException(未找到 tmp 文件)
Selenium with HTMLUnitDriver ScriptException (tmp-file not found) on second .get(url)
我 运行 使用 testng 和 htmlUnitDriver 进行 selenium 测试。我对所有测试使用一个 webDriver 实例。我只是在每次测试后注销并清除 cookies driver.manage().deleteAllCookies()
class(删除 cookies 本身不负责我测试过)
所以基本上发生的是:
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();
这会导致以下异常:
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.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.access0(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
该文件的删除发生在第二次调用时。我很乐意就可能导致这种情况的原因提出建议。
这是我使用的 selenium maven 依赖项:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.45.0</version>
</dependency>
这个bug是因为WebResponse
被缓存了,在获取新页面时清理了旧页面,并删除了本地文件(内容默认大于500KB)
在解决此问题之前,您可以使用以下方法。
WebDriver driver = new HtmlUnitDriver() {
@Override
protected WebClient getWebClient() {
WebClient c = super.getWebClient();
c.getCache().setMaxSize(0);
return c;
}
};
我 运行 使用 testng 和 htmlUnitDriver 进行 selenium 测试。我对所有测试使用一个 webDriver 实例。我只是在每次测试后注销并清除 cookies driver.manage().deleteAllCookies()
class(删除 cookies 本身不负责我测试过)
所以基本上发生的是:
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();
这会导致以下异常:
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.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.access0(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
该文件的删除发生在第二次调用时。我很乐意就可能导致这种情况的原因提出建议。
这是我使用的 selenium maven 依赖项:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.45.0</version>
</dependency>
这个bug是因为WebResponse
被缓存了,在获取新页面时清理了旧页面,并删除了本地文件(内容默认大于500KB)
在解决此问题之前,您可以使用以下方法。
WebDriver driver = new HtmlUnitDriver() {
@Override
protected WebClient getWebClient() {
WebClient c = super.getWebClient();
c.getCache().setMaxSize(0);
return c;
}
};