# HTMLUNIT Formularfüll Versuch



## tommey (13. Apr 2012)

Hi, ich möchte das folgende Formular mittels HTMLUNIT 2.9 auführen/absenden:
(Es generiert einen Link zu einer Datei.Beim Klicken auf den Downloadbutton, ließt er den von mir eingegeben DateiLink, läd die Datei auf den Server der Seite und öffnet mir direkt ein Downloadfenster
wo ich die Datei auf der Platte speichern kann)


```
</form>
         <script type="text/javascript">
	function dl_direct()
	{
							document.getElementById('peppeeppeeppepppe_more_p_and_e_and_so_on').action = '/';
		document.getElementById('peppeeppeeppepppe_more_p_and_e_and_so_on').submit();
	}
	function default_download()
	{
					document.getElementById('peppeeppeeppepppe_more_p_and_e_and_so_on').action = '/?type=tp';
		document.getElementById('peppeeppeeppepppe_more_p_and_e_and_so_on').submit();
	}
    </script>
        <div align="center" style="">
    <input type="hidden" name="freedisk" value="19630088192" />
    <form action="/" id="peppeeppeeppepppe_more_p_and_e_and_so_on" name="transload" method="post">
   <div style="display:block;margin:0 auto;text-align:center"> <input type="text" name="link" style="width: 300px" /></div>
    <input name="sessid" value="hutnu5ocbfe340ub9l1ep4djb2" type="hidden"  />
    <div style="display:block;margin:0 auto;text-align:center"><input value="Direct download" type="button" onclick="dl_direct();" /><input value="Download through server"disabled="disabled" type="button" onclick="default_download();" style="margin-left:20px;" /></div>

	<input type="checkbox" name="premium_acc" checked="checked" style="display:none" />

    </form>
```

Dazu habe ich folgenden JAV Code geschrieben:


```
// Create and initialize WebClient object
	    WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3.6);
	    webClient.setThrowExceptionOnScriptError(false);
	    webClient.setRefreshHandler(new RefreshHandler() {
			public void handleRefresh(Page page, URL url, int arg) throws IOException {
				System.out.println("handleRefresh");
			}

	    });
	    
	    
	    HtmlPage currentPage = 
		    	webClient.getPage(dieSeite);
	    
	    //Enable JavaScript
	    currentPage.getWebClient().setJavaScriptEnabled(true);
	    // Execute JavaScript
	    //ScriptResult result = currentPage.executeJavaScript(JavaScriptCode);
	    	    
	    //Cookies
	    Set cookies = webClient.getCookieManager().getCookies();
	    for (Cookie cookie : cookies) {
	    	System.out.println(cookie.getName() + " = " + cookie.getValue());
	    }
	    
	    //Response HEaders
	    List headers = 
	    	currentPage.getWebResponse().getResponseHeaders();
	    for (NameValuePair header : headers) {
	    	System.out.println(header.getName() + " = " + header.getValue());
	    }

	    //Request parameters
	    List headers = 
	    	currentPage.getWebResponse().getResponseHeaders();
	    for (NameValuePair header : headers) {
	    	System.out.println(header.getName() + " = " + header.getValue());
	    }
	    	    	    
	    HtmlForm form = currentPage.getFormByName("transload");

	    // Enter Link
	    form.getInputByName("link").setValueAttribute(derLinkDerÜbergebenWerdenSoll);
	    //form.getInputByName("sessid").setValueAttribute("on");
	    //form.getInputByName("premium_acc").setValueAttribute("checked");
	    
	    // Click button/link
	    currentPage = (HtmlPage) form.getInputByValue("Direct download").click();
	    
	    System.out.println(page.asXml());
```



Meiner Meinung nach müsste ich alle "inputs" des Formulars füllen oder?
Also die 3 hier:

input type="text" name="link"
input name="sessid" value="hutnu5ocbfe340ub9l1ep4djb2"
input type="checkbox" name="premium_acc"         Wie wird ein CheckboxValue gesetzt?

Wenn ich die Inputparameter gesetzt habe, muss ich den Button des Formulars input value="Direct download" betätigen oder?
Allerdings bekomme ich dann die nächste Seite zurück und nicht die Datei. Das liegt wahrscheinlich daran, dass die Datei direkt zum Speichern angeboten wird. Weiß jemand wie ich dieses Fenster abfangen kann?


----------



## irgendjemand (13. Apr 2012)

tja ... da ist der hoster etwas schlauer und geht erfolgreich gegen "download-programme" vor ...

1) du müsstest ALLE inputs RICHTIG setzen ... also auch das hidden "freedisk" ... und die sessionid bekommst du meist via cookie oder iwie anders
2) CheckBox value : entweder TRUE *für haken drin* oder FALSE *für kein haken drin* ... radiobuttons/groups funktionieren ähnlich
3) ich kenne HTMLUNIT zwar nicht ... aber was meinst du mit "dl fenster abfangen" ? ums dir mal zu erklären : diesen dialog macht der browser auf wenn er daten bekommt mit denen er nichts anfangen kann *meist application/octet-stream* und darauf hin auf platte speichern will ... und genau diese daten kannst du auch mit java lesen


ums dir mal einfach zu machen : zieh dir wireshark und guck was dein browser an den server sendet um das file dierekt zu laden ... und genau das sendest du dann auch *z.b. über raw-sockets ... URL ... apache commons ... etc* und speicherst dann die daten die als antwort kommen OHNE http-header in ein file


----------



## tommey (13. Apr 2012)

Hmm, du meinst also per z.B. apache http client aufmachen und ganz easy über POST bzw GET die Sachen holen und senden?
Ich dachte das geht nicht, weil die Seite alles über JavaScript macht. Deshlab wollte ich auch nen Browser nachbilden und mir so die Sachen holen.

Ich werds mal probieren, wenn nicht, meld ich mich hier nochmal 
Danke erstmal


----------



## irgendjemand (13. Apr 2012)

tommey hat gesagt.:


> Hmm, du meinst also per z.B. apache http client aufmachen und ganz easy über POST bzw GET die Sachen holen und senden?
> Ich dachte das geht nicht, weil die Seite alles über JavaScript macht. Deshlab wollte ich auch nen Browser nachbilden und mir so die Sachen holen.
> 
> Ich werds mal probieren, wenn nicht, meld ich mich hier nochmal
> Danke erstmal



so dachte ich das zumindest ...

aber wie ich sagte : der hoster wird wohl etwas schlauer sein als das man es so einfach umgehen könnte *eben da die seite via JS läuft*

und ob HTMLUNIT in der lage ist z.b. FF3.6 100% nachzubilden wage ich alleine wegen den limitierungen der JVM zu bezweifeln ...
zwar hat java eine JS runtime *auch für einige andere script-sprachen* ... aber ob diese dann so funktionieren wie in einem browser ist fraglich ... da man zumindest die calls neu binden und auch sonst eventuelle resourcen und "system"-calls nachbauen müsste ...

das mag man zwar für eine bestimmte website mal schaffen ... aber ein framework was dann mit allen seiten umgehen kann ... das wird schwer bis vermutlich nicht möglich sein ...

ergo : selber schreiben ... wobei dir z.b. apache commons für den datenaustausch mit dem http-server ein stück weit abnehmen kann ...

[EDIT]ich hab mir mal schnell HtmlUnit gegoogled ... und ich denke das es weit von dem entfernt ist was du dir darunter vorstellst ... denn HtmlUnit ist KEIN framework um einen "GUI-less" browser in java zu implementieren ... sondern sollte vielmehr als bestandteil von z.b. JUnit gesehen werden ...

demnach wird dir vermutlich nicht viel übrig bleiben als genau für die seite mit der du arbeiten willst einen großteil des code selbst zu schreiben ...[/EDIT]


----------

