【问题标题】:Waiting for Javascript with HtmlUnit等待带有 HtmlUnit 的 Javascript
【发布时间】:2015-05-23 05:58:15
【问题描述】:

前几天我在试验 HtmlUnit。我编写了一个程序,该程序执行登录站点并收集一些信息。但是当单击特定按钮时,htmlUnit 不会等待结果操作。我试图等到 JavascriptJobManager 中的所有工作都完成,但它被困在大约 15 个工作上。之后,我尝试等到生成的 htmlpage 更改,但这也不起作用。接下来我可以尝试什么?感谢您抽出宝贵时间,我会尽快落实任何建议。

编辑:我完全知道 facebook 不喜欢网络爬虫,但我这样做只是为了学习目的,所以没有伤害。在错误消息之后,程序抛出。 http://www.pastebin.ca/3007578

点击 infoButton 时,会出现一个新窗口,使旧窗口无法访问。 http://imgur.com/aiF7nJR

final static WebClient webClient = new WebClient(BrowserVersion.FIREFOX_31); 
public static void main(String [] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException{
    //init webclient
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());
    webClient.getOptions().setRedirectEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getCookieManager().setCookiesEnabled(true);
    webClient.getOptions().setThrowExceptionOnScriptError(true);
    webClient.getOptions().setCssEnabled(true);
    webClient.getOptions().setUseInsecureSSL(true);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.waitForBackgroundJavaScript(12000);
    webClient.setAlertHandler(new AlertHandler() {

        @Override
        public void handleAlert(Page arg0, String arg1) {
            System.out.println("ALERT ON "+arg0.getUrl()+"  :"+ arg1);
        }
    });

    // perform the login
    final HtmlPage loginPage = webClient.getPage("https://facebook.com"); 
    final HtmlForm form = loginPage.getForms().get(0);
    final HtmlTextInput username = form.getInputByName("email");
    final HtmlPasswordInput password = form.getInputByName("pass");
    final HtmlElement button = (HtmlElement) loginPage.getElementById("u_0_l");
    username.setText("Your email");
    password.setText("Your password");
    final HtmlPage frontPage = (HtmlPage) button.click();

    // The actual problem
    final HtmlPage testPage = webClient.getPage("https://www.facebook.com/pages/Stackoverflow/1462865420609264");
    HtmlElement infoButton = testPage.getFirstByXPath("//*[@class='share_action_link']"); // First share button.

    HtmlPage testPage2 = infoButton.click();

    JavaScriptJobManager manager = testPage2.getEnclosingWindow().getJobManager();
    while (manager.getJobCount() > 0) {
        Thread.sleep(1000);
        webClient.waitForBackgroundJavaScript(100);
        System.out.println(manager.getEarliestJob());
    }

    while(testPage == testPage2){
        System.out.println("failed");
        webClient.waitForBackgroundJavaScript(100);
        Thread.sleep(5 * 1000);
    }
}

【问题讨论】:

  • 您正在禁用抛出 JavaScript 异常,您应该启用它以查看它失败的原因。也请使用 v 2.16,并提供您的 URL 和按钮,以便其他人可以查看
  • 感谢艾哈迈德的回复。我编辑了这篇文章以获得一个最小的工作示例。此外,我链接了程序产生的异常和错误。不幸的是,我不明白,如何解决这些问题。

标签: javascript htmlunit


【解决方案1】:

使用latest snapshot(也在maven中),出现window.performance未定义的错误,已修复。

编辑:检测到另一个错误,已修复并部署了快照。

请重新测试

【讨论】:

  • 嘿艾哈迈德,感谢您的快速帮助,但不幸的是更新到 2.17 并没有解决问题。该程序仍然抛出相同的异常和错误。我要访问的按钮应该在 Facebook 中全局可用。我添加了一张图片,简要说明了想要的结果。
  • 到目前为止,我的日志记录是通过单击元素“u_0_n”来工作的,但有一个例外,但需要调试 JS 的本地副本并与真实浏览器进行比较,如 htmlunit.sourceforge.net/submittingJSBugs.html 中所暗示的那样跨度>
  • 您好,您在 5 月 10 日之后重试了吗?
  • 哦,我没注意到你又写了。使用新快照,我的程序没有异常,但有一些错误。 (用新的错误日志更新了 pastebin 链接)。可悲的是,它仍然无法按预期工作。
  • 对我来说没有错误(可能是位置/广告差异)。我唯一改变的是 loginPage.getElementById("u_0_n");无论如何,重复i参数的错误是有效的,因为有函数(a,b,c,d,e,f,g,h,i,j,i,k),你可以通过htmlunit.sourceforge.net/faq.html#HowToModifyRequestOrResponse
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多