【问题标题】:NicelyResynchronizingAjaxController does not work as expectedNicelyResynchronizingAjaxController 无法按预期工作
【发布时间】:2013-12-02 02:17:46
【问题描述】:

我需要从此Web site 获取数据。由于它有 AJAX 调用,我决定使用 HtmlUnit 进行解析。

这是我的代码:

public class MainPage {
final static String baseURI = "http://web1.seattle.gov/courts/cpi/CaseList.aspx";
final static WebClient webClient = new WebClient(BrowserVersion.CHROME);    

static HtmlPage currentPage = null;

public static void main(String[] args) {                
    try {                       

        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);

        final HtmlPage mainPage = webClient.getPage(baseURI);
        final HtmlForm searchForm = mainPage.getFormByName("form1");

        searchForm.getInputByName("rtbCaseNo").setValueAttribute("203123729");                      
        HtmlPage resultPage = searchForm.getInputByName("btnSrchByCaseNo").click();

        webClient.waitForBackgroundJavaScript(50000);                               
        System.out.println(resultPage.asText());    

    } catch (FailingHttpStatusCodeException | IOException e) {
        e.printStackTrace();
    } 
    finally {
        webClient.closeAllWindows();
    }
}

}

首先,当我点击提交按钮时,似乎根本没有 AJAX 调用,我没有看到类似的东西:

INFO: Re-synchronized call to http://web1.seattle.gov/courts/cpi/CastList.aspx

其次,我有一些来自 HtmlUnit 的例外情况:

    INFO: Caught script exception
======= EXCEPTION START ========
EcmaError: lineNumber=[729] column=[0] lineSource=[null] name=[TypeError] sourceName=[http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43] message=[TypeError: Cannot read property "disabled" from undefined (http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43#729)]
com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "disabled" from undefined (http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43#729)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:684)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventListeners(EventListenersContainer.java:177)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:237)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738)
    at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1160)
    at MainPage.main(MainPage.java:29)
Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "disabled" from undefined (http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43#729)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3608)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3624)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3634)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getObjectPropNoWarn(ScriptRuntime.java:1488)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1233)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405)
    at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:309)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:103)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$4.doRun(JavaScriptEngine.java:609)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669)
    ... 18 more
Enclosed exception: 
net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "disabled" from undefined (http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43#729)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3608)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3624)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3634)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getObjectPropNoWarn(ScriptRuntime.java:1488)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1233)
    at script.Sys$WebForms$PageRequestManager$_onFormElementActive(http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43:729)
    at script.Sys$WebForms$PageRequestManager$_onFormElementClick(http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=wAKJQuapfi2h0tvgddshu6GwSBoo0uJ-Q4zq1fpZG1ZOiNZgZZNomCn_OChvdWzXkxwIbSpMmitsYmDHmDpi-_Muj2-QmYqFjgrU54gChUB4h0YeDFGq7JyV0GIClurbdmC9pRNWwqRbk5gkFzybU7XnF9F4YUtiRPHHsC0TgYUJHhHR0&t=ffffffffdca80a43:751)
    at script(http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=GzSW1c3NKsncPwlvGy3qGT-vozDnuoTbJRITSlPr6OEXzpdb1saFCmLwjRyqYfH5pta6HhEtCCU0x1VKNwmwJGlYwl2L_LdE-PxNHQjfNmEnmdhuyKvS5W28hsds4a5GmaIHjebqkMQ1yQVwZheqwC9K9wwuMr2kLfxJsg2&t=ffffffffdca80a43:47)
    at script(http://web1.seattle.gov/courts/CPI/ScriptResource.axd?d=GzSW1c3NKsncPwlvGy3qGT-vozDnuoTbJRITSlPr6OEXzpdb1saFCmLwjRyqYfH5pta6HhEtCCU0x1VKNwmwJGlYwl2L_LdE-PxNHQjfNmEnmdhuyKvS5W28hsds4a5GmaIHjebqkMQ1yQVwZheqwC9K9wwuMr2kLfxJsg2&t=ffffffffdca80a43:2948)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405)
    at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:309)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:103)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$4.doRun(JavaScriptEngine.java:609)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventListeners(EventListenersContainer.java:177)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:237)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738)
    at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1160)
    at MainPage.main(MainPage.java:29)
== CALLING JAVASCRIPT ==

  function (e) {
      return handler.call(element, new Sys.UI.DomEvent(e));
  }

======= EXCEPTION END ========

所以我猜,因为加载 JS 时的这些异常导致 JS 在客户端站点上运行时出现问题。

有什么想法吗?

【问题讨论】:

  • 这个question 可能会有所帮助
  • 谢谢!实际上,在发布此问题之前,我已经查看了您的答案。

标签: java html-parsing web-scraping htmlunit


【解决方案1】:

只需将 BrowserVersio 设置为 firefox 并删除 NicelyResynchronizingAjaxController。 让 webClient.waitForBackgroundJavaScript(50000);获取新 HtmlPage 之前和之后。

http://htmlunit.sourceforge.net/faq.html

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    • 2020-09-21
    • 2011-08-17
    • 2012-04-29
    • 2021-08-12
    • 2019-02-04
    • 2014-12-02
    相关资源
    最近更新 更多