等待使用HtmlUnit的Javascript

等待使用HtmlUnit的Javascript,javascript,htmlunit,Javascript,Htmlunit,前几天我在用HtmlUnit做实验。我编写了一个程序,可以登录到一个站点并收集一些信息。但是,当单击某个特定按钮时,它不会等待结果操作。我试图等到JavascriptJobManager中的所有作业都完成,但它被困在大约15个作业上。在那之后,我尝试等待结果htmlpage发生变化,但这也不起作用。下一步我能试试什么?谢谢你的时间,我会尽快落实你的建议 编辑:我完全知道facebook不喜欢网络画图,但我这样做只是为了学习,所以不会造成伤害。在错误消息之后,程序将抛出 单击infoButton时

前几天我在用HtmlUnit做实验。我编写了一个程序,可以登录到一个站点并收集一些信息。但是,当单击某个特定按钮时,它不会等待结果操作。我试图等到JavascriptJobManager中的所有作业都完成,但它被困在大约15个作业上。在那之后,我尝试等待结果htmlpage发生变化,但这也不起作用。下一步我能试试什么?谢谢你的时间,我会尽快落实你的建议

编辑:我完全知道facebook不喜欢网络画图,但我这样做只是为了学习,所以不会造成伤害。在错误消息之后,程序将抛出

单击infoButton时,会出现一个新窗口,使旧窗口无法访问

对于(在maven中也是如此),有一个错误没有定义window.performance,该错误已修复

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


请重新测试

您正在禁用抛出JavaScript异常,您应该启用该异常以查看失败的原因。另外,请使用V2.16,并提供您的URL和按钮,以便其他人可以检查感谢艾哈迈德的回应。我编辑了这篇文章,以获得一个最小的工作示例。此外,我还链接了程序产生的异常和错误。不幸的是,我不明白如何修复这些。嘿,艾哈迈德,谢谢你的快速帮助,但不幸的是更新到2.17并没有解决问题。程序仍然抛出相同的异常和错误。我想访问的按钮应该可以在Facebook中全局使用。我添加了一张图片,简要地解释了想要的结果。到目前为止,我的日志记录是通过单击元素“u_0_n”来实现的,有一个例外,但需要调试JS的本地副本,并与真实浏览器进行比较,正如Hi中所暗示的那样,您在5月10日之后重试了吗?哦,我没有注意到您又写了一次。使用新的快照,我的程序没有异常,但有一些错误。(使用新的错误日志更新了pastebin链接)。遗憾的是,它仍然不能按预期工作。对我来说没有错误(可能是位置/广告差异)。我唯一更改的是loginPage.getElementById(“u_0_n”);无论如何,重复i参数的错误是有效的,因为存在函数(a、b、c、d、e、f、g、h、i、j、i、k),您可以通过
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);
    }
}