4 Stimmen

HtmlUnit kann die Seite nach dem Herunterladen einer Datei nicht abrufen

Ich habe dieses seltsame Problem mit HtmlUnit in Java. Ich verwende es, um einige Daten von einer Website herunterzuladen, der Prozess ist etwa so:

1 - Anmeldung

2 - Für jedes Element (Autos)

----- 3 Suche nach Auto

----- 4 Zip-Datei von einem Link herunterladen

Der Code:

Erstellung des Webclients:

webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setJavaScriptEnabled(true);
webClient.setThrowExceptionOnScriptError(false);
DefaultCredentialsProvider provider = new DefaultCredentialsProvider();
provider.addCredentials(USERNAME, PASSWORD);
webClient.setCredentialsProvider(provider);
webClient.setRefreshHandler(new ImmediateRefreshHandler());

Anmeldung:

  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());
  }

Suchen Sie auf der Website nach einem Auto:

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 herunterladen:

    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();
    }
  }

Das Problem:

Das erste Auto funktioniert gut, pdf wird heruntergeladen, aber sobald ich nach einem neuen Auto suche, komme ich zu dieser Zeile:

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

Ich erhalte diese Ausnahme:

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

Nach der Fehlersuche habe ich festgestellt, dass in dem Moment, in dem ich diesen Aufruf tätige:

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

der Rückgabetyp von page.getElementById("search_gridCampaNoi").click() ändert sich von HtmlPage zu WebResponse, so dass ich statt einer neuen Seite wieder die Datei erhalte, die ich bereits heruntergeladen habe.

Ein paar Bildschirmfotos des Debuggers zeigen diese Situation:

Erster Aufruf, Rückgabetyp OK:

enter image description here

Zweiter Aufruf, Rückgabetyp geändert und ich erhalte nicht mehr eine HtmlPage:

enter image description here

Vielen Dank im Voraus!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X