【问题标题】:HtmlUnit wait for ajax responseHtmlUnit 等待 ajax 响应
【发布时间】:2018-06-11 11:51:43
【问题描述】:

我有这个项目,我需要使用一个站点从中获取数据。 所以事情是:使用htmlunit我用我的数据填充文本框,然后我按下使用ajax的锚点下载我需要的内容并动态更改HTML页面,在模式窗口中显示内容。但是在我在锚点上使用 .click() 之后,我得到了相同的页面,没有更新,在四处寻找解决方案后,我在网上找到了这个:

HtmlUnit 将执行 Ajax 调用并更新页面。只是 请注意,与常规页面加载不同,click() 调用不会 等待 Ajax 请求完成。它将进行到 下一行代码。

这是我的代码:

final HtmlPage page = webClient.getPage("myUrl");
System.out.println(page.asXml());
final HtmlForm form =    page.getFirstByXPath("//form[@action='myFormAction']");
final HtmlTextInput input = form.getInputByName("url");
input.setText(vacancyURL);

List<HtmlAnchor> anchors = page.getAnchors();
HtmlAnchor link = null;

    for (HtmlAnchor anchor : anchors) {
        String str = anchor.asText();
        if (anchor.asText().equals("Start"))
            link = anchor;
    }

    HtmlPage page2 = link.click(); //I think this is a problem

任何想法如何单击锚点并等待 ajax 接收响应,并用数据填充页面(在浏览器上一切正常)?我真的需要帮助,有什么想法吗?

【问题讨论】:

    标签: java htmlunit


    【解决方案1】:

    哦,这是一个老问题..我想分享我的解决方案.. 我认为page.wait 很恶心...因为当 ajax 请求完成时您不会立即收到通知,所以会有延迟.. 我的答案是使用方法

    com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManager#waitForJobs

    调用示例:page.getEnclosingWindow().getJobManager().waitForJobs(1000);

    页面是com.gargoylesoftware.htmlunit.html.HtmlPage的类型

    1000 是 timeoutMillis,表示您希望等待的最大时间(以毫秒为单位)

    【讨论】:

      【解决方案2】:

      是的,你必须等待执行,最好是重试一段时间,直到页面没有更新(使用任何条件) 这是代码示例

          int input_length = page.getByXPath("//input").size();
          int tries = 5; 
          while (tries > 0 && input_length < 12) { //you can change number of tries and condition according to your need
              tries--;
              synchronized (page) {
                  page.wait(2000); //wait
              }
              input_length = page.getByXPath("//input").size(); //input length is example of condtion
          }
      

      【讨论】:

        【解决方案3】:

        我同意 Tasawer 的观点,依赖状态/元素通常是一件好事。

        根据远程网站上的 javascript,您还可以询问 webclient 有多少 javscripts 线程仍在进行中。例如:

        int wait = 0;
        int nbProcess = 1;
        while (nbProcess > 0 && wait < 10) {
           nbProcess = client.waitForBackgroundJavaScript(1000);
              if (wait == 9) {
                 System.err.println("** needs more time ** ");
              }
           wait++;
        }
        

        警告:某些站点可能有一个或多个脚本永久运行,因此最小的 nbProcess 可能是 1、2 ...

        链接到javadoc

        【讨论】:

          猜你喜欢
          • 2012-02-22
          • 2013-11-24
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多