HtmlUnit не може да извлече страница след изтегляне на файл

Имам този странен проблем с HtmlUnit в Java. Използвам го, за да изтегля някои данни от уебсайт, процесът е нещо подобно:

1 - Вход

2 - За всеки елемент (коли)

----- 3 Търсене на кола

----- 4 Изтеглете zip файл от връзка

Кодът:

Създаване на уебклиента:

webClient = new WebClient(BrowserVersion.FIREFOX
private void searchCar(String _regNumber) throws IOException
 {
// Open search window
page = page.getElementById("search_gridCampaNoi").click();

webClient.waitForBackgroundJavaScript(3000);

// Write plate number
HtmlInput element = (HtmlInput) page.getElementById("jqg1");
element.setValueAttribute(_regNumber);

webClient.waitForBackgroundJavaScript(3000);

// Click on search
HtmlAnchor anchor = (HtmlAnchor) page.getByXPath("//*[@id=\"fbox_gridCampaNoi_search\"]").get(0);
page = anchor.click();

webClient.waitForBackgroundJavaScript(3000);
System.out.println(page.asText());
}
6); webClient.setJavaScriptEnabled(true); webClient.setThrowExceptionOnScriptError(false); DefaultCredentialsProvider provider = new DefaultCredentialsProvider(); provider.addCredentials(USERNAME, PASSWORD); webClient.setCredentialsProvider(provider); webClient.setRefreshHandler(new ImmediateRefreshHandler());

Влизам:

  public void login() throws IOException
  {
    page = (HtmlPage) webClient.getPage(URL);
    HtmlForm form = page.getFormByName("formLogin");

    String user = USERNAME;
    String password = PASSWORD;

    // Enter login and password
    form.getInputByName("LoginSteps$UserName").setValueAttribute(user);
    form.getInputByName("LoginSteps$Password").setValueAttribute(password);

    // Click Login Button
    page = (HtmlPage) form.getInputByName("LoginSteps$LoginButton").click();

    webClient.waitForBackgroundJavaScript(3000);

    // Click on Campa area
    HtmlAnchor link = (HtmlAnchor) page.getElementById("ctl00_linkCampaNoiH");
    page = (HtmlPage) link.click();

    webClient.waitForBackgroundJavaScript(3000);
    System.out.println(page.asText());
  }

Търсете кола в уебсайта:

private void searchCar(String _regNumber) throws IOException
 {
// Open search window
page = page.getElementById("search_gridCampaNoi").click();

webClient.waitForBackgroundJavaScript(3000);

// Write plate number
HtmlInput element = (HtmlInput) page.getElementById("jqg1");
element.setValueAttribute(_regNumber);

webClient.waitForBackgroundJavaScript(3000);

// Click on search
HtmlAnchor anchor = (HtmlAnchor) page.getByXPath("//*[@id=\"fbox_gridCampaNoi_search\"]").get(0);
page = anchor.click();

webClient.waitForBackgroundJavaScript(3000);
System.out.println(page.asText());
}

Изтегляне на pdf:

    try
    {
      InputStream is = _link.click().getWebResponse().getContentAsStream();
      File path = new File(new File(DOWNLOAD_PATH), _regNumber);
      if (!path.exists())
      {
        path.mkdir();
      }
      writeToFile(is, new File(path, _regNumber + "_pdfs.zip"));
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

Проблемът:

Първата кола работи добре, pdf се изтегля, но веднага щом потърся нова кола, когато стигна до този ред:

page = page.getElementById("search_gridCampaNoi").click();

Получавам това изключение:

Exception in thread "main" java.lang.ClassCastException: com.gargoylesoftware.htmlunit.UnexpectedPage cannot be cast to com.gargoylesoftware.htmlunit.html.HtmlPage

След отстраняване на грешки разбрах, че в момента, в който направя това обаждане:

InputStream is = _link.click().getWebResponse().getContentAsStream();

върнатият тип на page.getElementById("search_gridCampaNoi").click() се променя от HtmlPage на WebResponse, така че вместо да получа нова страница, получавам отново файла, който вече съм изтеглил.

Няколко екранни снимки на дебъгера, показващи тази ситуация:

Първо повикване, тип връщане OK:

въведете описание на изображението тук

Второ повикване, типът на връщане е променен и вече не получавам HtmlPage:

въведете описание на изображението тук

Благодаря предварително!


person oli206    schedule 08.11.2011    source източник


Отговори (1)


Само в случай, че някой срещне същия проблем, намерих заобиколно решение. Промяна на реда:

InputStream is = _link.click().getWebResponse().getContentAsStream();

to

InputStream is = _link.openLinkInNewWindow().getWebResponse().getContentAsStream();

изглежда върши работа. Сега имам проблеми, когато правя няколко итерации, понякога работи, понякога не, но поне имам нещо сега.

person oli206    schedule 10.11.2011