I have a problem with HTMLUnit. Shortly what I’m doing is, I’m filling a form and I log-in to a webpage, then I press a button on that page. Actually, I can’t do this process, but I’m trying. Here’s my HTML form source codes and Java source code:
This is from the login screen:
<form action="/login" method="post">
...
<input type="text" name="login_email" id="login_email" value="" />
<input type="password" name="login_password" id="login_password" />
<input type="submit" id="login_submit" name="login_submit" value="Sign in" />
</form>
There are some hidden inputs in this form. I know it sounds funny, but my Java code works when I don’t do anything about hidden inputs.
Here’s my Java code for logging in using this form:
This code is from a stackoverflow question. I’m just testing it, nothing more.
WebClient webClient = new WebClient();
webClient.setThrowExceptionOnScriptError(false);
HtmlPage currentPage = webClient.getPage("https://www.blablabla.com:1234");
final HtmlForm form = currentPage.getFirstByXPath("//form[@action='/login']");
HtmlTextInput username = (HtmlTextInput) currentPage.getElementById("login_email");
HtmlPasswordInput password = (HtmlPasswordInput) currentPage.getElementById("login_password");
username.setText("username@blablabla.com");
password.setText("passW0rd");
HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
submitButton.setAttribute("type", "submit");
form.appendChild(submitButton);
HtmlPage newPage = submitButton.click();
System.out.println(newPage.asText());
Things are good until the next part. I can login, see the contents of the new page.
However, when I try to press the button in the new page, I get nothing. Actually, I can’t even press it I guess.
Here’s the HTML source of my “buttony” and new webpage:
<form action="auth" method="post">
<input type="submit" name="allow" value="Allow"/>
</form>
There are some hidden inputs as well.
Here’s the Java code for -trying- to press the button with the name ‘allow’:
HtmlButton button = newPage.getElementByName("allow");
HtmlPage page = button.click() ;
And to check things for the last time, I use another piece of code:
System.out.println(page.asText());
But I get errors like these
errors start
WARNING: getElementById(script1338426904717) did a getElementByName for Internet Explorer
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.host.ActiveXObject jsConstructor
WARNING: Automation server can't create object for 'ShockwaveFlash.ShockwaveFlash'.
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
SEVERE: runtimeError: message=[Automation server can't create object for 'ShockwaveFlash.ShockwaveFlash'.] sourceName=[https://www.jdkahsjkda/dksajda.js] line=[12] lineSource=[null] lineOffset=[0]
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.host.ActiveXObject jsConstructor
end of errors
These errors are OK for me as long as I can login.
I can login, and see the page. It says things like “Welcome username password…”
But, I can’t press the button nor do anything else.
I hope you guys can help me with this problem.
Thank you very much.
Take care, and thank you.
Edit:
Now I get this error:
Exception in thread "main" com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[*] attributeName=[name] attributeValue=[allow]
at com.gargoylesoftware.htmlunit.html.HtmlPage.getElementByName(HtmlPage.java:1565)
at cza.main(cza.java:54)
However, there’s a button called ‘allow’. I’m looking at the source of the second page, and I see this:
<input type="submit" name="allow" value="Allow"/>
<input type="submit" name="deny" value="Deny"/>
So, there’s a button named as allow and deny. However, this code fails.
Can this be because of JS or anything?
I tried finding the submit button from firstPage and submit the form using it. Not with the fake button, it fails again.
I used HTMLSubmitInput for this, it fails again.
Thanks again.
Sorry I can’t comment yet…
What’s the
newPage.getWebResponse().getContentAsString()content ?I guess your page may contains many html elements with name “allow”
It’s best to be sure that you get an unique and right element, there’s many ways to do it :
and so on … the goal is really to be sure to use the element you need.
When playing with inputs, it’s always a good way to get as variable the form to manipulate the inputs. eg :
BTW, some tips : initialize the webclient with FF settings like this :
client = new WebClient(BrowserVersion.FIREFOX_3_6);
it got the best html code coverage ( http://build.canoo.com/htmlunit/artifacts/ )
always try with JS on/off :
client.setJavaScriptEnabled(false);client.setThrowExceptionOnScriptError(false);