Htmlunit跳过页面按钮单击

时间:2013-10-28 20:48:34

标签: java javascript jquery html htmlunit

我有一个用Htmlunit编写的程序,用于从网站上的多个页面返回信息。问题是,当前两页返回正常时,则返回每个其他页面(返回页面1,2,4,6等)。我相信我引用的所有变量都是正确的,所以我不确定问题是服务器与程序通信还是其他问题。我的代码是:

  public static void scrapeWebsite() throws IOException {

    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage(s);
    originalHtml = page.getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";

    //////code below returns page 2 as expected////

    final HtmlForm form = page.getForms().get(0);
    final HtmlSubmitInput button = form.getInputByValue(">");
    final HtmlPage page2 = button.click();
    try {
      synchronized (page2) {
        page2.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page2.refresh().getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";


    /////// code below returns page 4, instead of page 3/////

    final HtmlForm form2 = page2.getForms().get(0);
    final HtmlSubmitInput button2 = form2.getInputByValue(">");
    final HtmlPage page3 = button2.click();
    try {
      synchronized (page3) {
        page3.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page3.refresh().getWebResponse().getContentAsString();
    obtainInformation();
}

我能想到的唯一问题是,当page.refresh()运行时,它基本上双击按钮,但没有page.refresh(),第一页上的信息只返回3次。此外,s指的是网站的字符串。

1 个答案:

答案 0 :(得分:0)

如果不查看您尝试获取的页面,有些内容在您的代码中实际上有些奇怪。

  1. 您有复制/粘贴代码。这是不正确的,导致难以遵循代码并且非常容易出错。确保模块化您的代码,这样您就不必为每个页面重复它。
  2. 目前尚不清楚您使用originalHtml变量做了什么。它似乎是一个静态变量,你只能在该方法中编写。你似乎没有在那里阅读它,所以你可能在obtainInformation()方法中阅读它,在这种情况下它应该只在该方法中使用。更不用说你要为它赋值"",然后是不需要""赋值的页面值。
  3. 我认为没有理由对HtmlUnit返回的原始Html进行操作而不是XML表示。您应该将page.getWebResponse().getContentAsString()替换为page.asXml()。当然,如果你真的需要将页面的原始Html保存到文件中,那么保持原样。
  4. 我认为没有理由在那里执行refresh()。你得到page2并等待5秒钟(盲目地假设该页面作为准备在其上运行的新内容)。然后,不是在page2上操作,而是刷新它并获取新页面的内容。这可能是您正确获取第一页并且其余部分间隔为2的原因。
  5. 这些只是一些可以帮助你的一般性评论。它们不一定能解决问题,但应该大大改善您的代码。