HTMLUnit 不会等待 Javascript

2022-09-02 00:59:41

我有一个基于GWT的页面,我想使用HtmlUnit为其创建一个HTML快照。该页面使用产品上的Ajax / JavaScript信息加载,因此大约1秒钟有一个加载...消息,然后显示内容。

问题是HtmlUnit似乎没有捕获信息,我得到的只是“加载...”跨度。

下面是一个使用HtmlUnit的实验性代码,我试图给它足够的时间来等待数据的加载,但它似乎没有改变任何东西,我仍然无法捕获GWT javascript加载的数据。

        WebClient webClient = new WebClient();
        webClient.setJavaScriptEnabled(true);
        webClient.setThrowExceptionOnScriptError(false);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

        WebRequest request = new WebRequest(new URL("<my_url>"));
        HtmlPage page = webClient.getPage(request);

        int i = webClient.waitForBackgroundJavaScript(1000);

        while (i > 0)
        {
            i = webClient.waitForBackgroundJavaScript(1000);

            if (i == 0)
            {
                break;
            }
            synchronized (page) 
            {
                System.out.println("wait");
                page.wait(500);
            }
        }

        webClient.getAjaxController().processSynchron(page, request, false);

        System.out.println(page.asXml());

任何想法...?


答案 1

感谢您的回复。实际上,我应该更早地报告这一点,因为我自己找到了解决方案。显然,当使用FF初始化WebClient时:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);

它似乎正在起作用。当使用默认构造函数初始化WebClient时,它默认使用IE7,我想FF对Ajax有更好的支持,并且是推荐使用的模拟器。


答案 2

我相信默认情况下,通过跟踪由用户操作源自哪个线程,只会重新同步由用户操作引起的 AJAX 调用。也许GWT生成的JavaScript正在被其他不想等待的线程调用。NicelyResynchronizingAjaxControllerNicelyResynchronizingAjaxController

尝试声明您自己的 AjaxController 以与所有内容同步,而不考虑原始线程:

webClient.setAjaxController(new AjaxController(){
    @Override
    public boolean processSynchron(HtmlPage page, WebRequest request, boolean async)
    {
        return true;
    }
});

推荐