我目前正在试用 HtmlUnit。我想填写一个表格,然后提交。但这会导致错误,这似乎是由无法访问的文件引起的,从而导致连接重置被抛出。我怎样才能抑制这一点,因为考虑到整个网站的加载过程,这并不重要?不过,它似乎不会影响程序,我只是想让它静音。
Apr 05, 2012 12:25:13 PM com.gargoylesoftware.htmlunit.html.HtmlPage loadExternalJavaScriptFile
Schwerwiegend(severe): Error loading JavaScript from [*link*].
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:264)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:98)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:252)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:247)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:298)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadJavaScriptFromUrl(HtmlPage.java:1008)
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:950)
at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349)
at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:230)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:642)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$400(JavaScriptEngine.java:79)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:590)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:474) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 HtmlUnit 来屏幕抓取一些数据的应用程序。哪些字段来自页面的哪些部分以及检索它们的 XPath 的逻辑变得有点复杂,因此在重构之前我想编写一些简单的单元测试。我已使用“page.asXml()”方法获取页面 XML 并将其保存为测试资源文件夹中的文件,但如何将其作为 HtmlPage 重新加载?
例如
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXml());
Run Code Online (Sandbox Code Playgroud)
现在在我的单元测试中我想做相当于:
HtmlPage page = new HtmlPage(myXmlTestFile);
Run Code Online (Sandbox Code Playgroud)
但我似乎找不到任何可以做到这一点的东西。有任何想法吗?
我用 Selenium 编写了几个项目,它完美地满足了我的所有需求,然后我需要一个无头浏览器,并使用 PhantomJS 编写了一个小测试,它工作得很好。然而,PhantomJS 使用了太多内存来启动数百个实例,而这正是我在下一个项目中需要的。
在阅读并重新阅读这个问题和许多其他问题之后: 无头浏览器和抓取 - 解决方案
并进行了大量的在线搜索,我仍然不确定哪种无头浏览器可以满足我的需求。
我需要的:
我的希望是:
目前,ZombieJs 和 HTMLUnit 是我想要测试的两个解决方案,但在我投入大量时间之前,我希望有人已经完成了类似的项目,并且可以为我指明正确的方向。
我正在尝试访问由某些 Javascript 创建的网页上的某些内容。但是,我希望访问的内容是在页面加载后由 javascript 创建的,因此当我尝试使用 Jsoup 解析它时,找不到这块 Html 源代码。
我使用HtmlUnit获取Html源代码的代码如下:
public static void main(String[] args) throws IOException {
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
String url = "myUrl.com";
out.println("accessing " + url);
HtmlPage page = webClient.getPage(url);
out.println("waiting for js");
webClient.waitForBackgroundJavaScriptStartingBefore(200);
webClient.waitForBackgroundJavaScript(20000);
out.println(page.asXml());
webClient.close();
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,没有打印应该创建的Html。我想知道如何使用 HtmlUnit 获取由 Javascript 创建的这个 Html 源代码,然后获取所述结果并将其传递给 Jsoup 进行解析?
我正在尝试在 Android 上运行 HtmlUnit。我认为这个答案曾经适用于较旧的库,但不再适用。与此问题相关的其他线程与 Android 上的 Kotlin 无关或已过时。
考虑下面的代码:
https://github.com/JimClermonts/HtmlUnit-for-Android
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
doAsync {
val webClient = WebClient()
var page: HtmlPage = webClient.getPage<HtmlPage>("http://www.google.com")
val searchBox = page.getElementByName<HtmlInput>("q")
searchBox.valueAttribute = "htmlunit"
val googleSearchSubmitButton: HtmlSubmitInput = page.getElementByName("btnG") // sometimes it's "btnK"
page = googleSearchSubmitButton.click()
val resultStatsDiv: HtmlDivision = page.getFirstByXPath("//div[@id='resultStats']")
System.out.println(resultStatsDiv.asText()) // About 309,000 results
webClient.close()
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的项目依赖项:
dependencies {
implementation group: 'commons-io', name: 'commons-io', version: '2.6'
// implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' …Run Code Online (Sandbox Code Playgroud) 我有个问题。
是什么使得 FirefoxDriver 能够找到 WebElements 并在 java 代码中单击它们,但是当使用 HtmlUnitDriver 运行相同的代码时,却找不到相同的 WebElements。此外,当在 HtmlUnit 上运行相同的代码(应用 HtmlUnit 原理)时,找不到 WebElements,实际上代码返回 NullPointerException。有什么特别的原因吗?
如何访问此元素:
<input type="submit" value="Save as XML" onclick="some code goes here">
Run Code Online (Sandbox Code Playgroud)
更多信息:我必须以编程方式访问网页并模拟单击其上的按钮,然后生成一个xml文件,我希望能够保存在本地计算机上.
我试图通过使用HtmlUnit库来实现,但我可以找到的所有示例都使用getElementById()或getElementByName()方法.不幸的是,这个确切的元素没有名称或Id,所以我失败了.我当时认为我要做的就是使用getByXPath()方法,但我完全迷失在XPath文档中(这件事对我来说都是新的).
我被困在这几个小时,所以我真的需要我能得到的所有帮助.
提前致谢.
我正在使用htmlunit自动浏览网站。这是问题所在:
我想单击一个锚点以显示给定表的新页面。
这是锚点:
<a href="javascript:__doPostBack('GridView1','Page$7')">7</a>
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
final HtmlAnchor a = page2.getAnchorByText("7");
HtmlPage page3 = a.click();
System.out.println(page2.getWebResponse().getContentAsString())
System.out.println(page3.getWebResponse().getContentAsString());
Run Code Online (Sandbox Code Playgroud)
我没有任何错误信息。当我比较打印输出时,它们是相同的,但是不应该如此,因为我只是单击了锚点。第一个打印输出应显示表格的特定页面,第二个打印输出另一页。
试图单击htmlunit中的链接的stackoverflow帖子提出了一个非常相似的问题,但是在我看来,他的解决方案(将浏览器版本设置为webclient)似乎不起作用。
我一直坚持使用HtmlUnit获取基于JavaScript的动态内容.我期待从页面获得(Signin,注册html内容).使用以下代码,我只获取静态内容.
我是HtmlUnit的新手.任何帮助将受到高度赞赏.
String strURL = "https://www.checkmytrip.com" ;
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF);
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_31);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.waitForBackgroundJavaScript(60 * 1000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage myPage = ((HtmlPage) webClient.getPage(strURL));
String theContent = myPage.getWebResponse().getContentAsString();
System.out.println(theContent);
Run Code Online (Sandbox Code Playgroud)