HTMLUnit重定向和按钮单击

时间:2012-05-31 01:20:32

标签: java htmlunit

我有HTMLUnit的问题。我正在做的很简单,我正在填写表格并登录网页,然后按下该页面上的按钮。实际上,我不能做这个过程,但我正在努力。这是我的HTML表单源代码和Java源代码:

这是来自登录屏幕:

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

此表单中有一些隐藏的输入。我知道这听起来很有趣,但是当我不对隐藏的输入做任何事情时,我的Java代码就可以工作了。

这是我使用此表单登录的Java代码:

此代码来自stackoverflow问题。我只是在测试它,仅此而已。

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

直到下一部分,事情才会好起来。我可以登录,查看新页面的内容。

然而,当我尝试按下新页面中的按钮时,我什么都没得到。实际上,我猜我甚至都不能按它。

以下是我的“搞定”和新网页的HTML源代码:

<form action="auth" method="post">
 <input type="submit" name="allow" value="Allow"/>
</form>

还有一些隐藏的输入。

这是用于 - 管理的Java代码 - 按下名为'allow'的按钮:

HtmlButton button = newPage.getElementByName("allow");
HtmlPage page = button.click() ;

为了最后一次检查,我使用了另一段代码:

System.out.println(page.asText());

但我得到像这样的错误

错误开始

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

错误结束

只要我能登录,这些错误对我来说都没问题。

我可以登录,并查看该页面。它说“欢迎用户名密码......”之类的东西 但是,我不能按下按钮也不能做任何其他事情。

我希望你们可以帮我解决这个问题。

非常感谢你。

小心,谢谢。

修改

现在我收到了这个错误:

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)

但是,有一个名为“允许”的按钮。我正在查看 第二个 页面的来源,我看到了这一点:

<input type="submit" name="allow" value="Allow"/>
<input type="submit" name="deny" value="Deny"/>

所以,有一个名为allow和deny的按钮。但是,此代码失败。 这可能是因为JS还是其他什么? 我尝试从firstPage找到提交按钮并使用它提交表单。没有假按钮,它再次失败。 我为此使用了HTMLSubmitInput,它再次失败。

再次感谢。

1 个答案:

答案 0 :(得分:2)

抱歉,我还不能评论......

newPage.getWebResponse().getContentAsString()内容是什么? 我猜你的页面可能包含许多名为“allow”的html元素

最好确保你获得一个独特而正确的元素,有很多方法可以做到:

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

依此类推......目标是确保使用你需要的元素。

在玩输入时,总是一种很好的方式来获取操作输入的形式。例如:

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

BTW,一些提示:使用如下的FF设置初始化webclient: client = new WebClient(BrowserVersion.FIREFOX_3_6); 它获得了最好的HTML代码覆盖率(http://build.canoo.com/htmlunit/artifacts/

总是尝试使用JS开启/关闭:client.setJavaScriptEnabled(false);client.setThrowExceptionOnScriptError(false);