Search code examples
javahtmlunit

HTMLUnit Redirection and Button Click


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("[email protected]");
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.


Solution

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

    element.getElementById("id")
    page.getFirstByXPath("xpathExpr") || page.getByXPath("xpathExpr")
    

    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 :

    HtmlForm form = page.getforms(0); 
    form.getInputByName("name");
    form.getInputByValue("value");
    

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