虚拟Web浏览器使用HtmlUnit + Java提交

时间:2011-04-08 23:06:07

标签: java submit htmlunit

我正在尝试使用HtmlUnit登录yahoo.com。但是当我的程序试图点击“登录”按钮时,它不起作用。我的代码是:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import java.io.IOException;
import java.net.URL;

public class MyBrowser {

    public void homePage() throws Exception {


        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 page = (HtmlPage) webClient.getPage("https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.done=http%3A%2F%2Fwww.yahoo.com%2F");
        HtmlForm form = page.getFormByName("login_form");

        form.getInputByName("login").setValueAttribute("@@@@@@");  // works OK
        form.getInputByName("passwd").setValueAttribute("@@@@@@"); // works OK
        page = (HtmlPage) form.getInputByValue("Sign In").click(); // doesn't work

        webClient.closeAllWindows();
    }

}

错误:

com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[input] attributeName=[value] attributeValue=[Sign In]
        at com.gargoylesoftware.htmlunit.html.HtmlForm.getInputByValue(HtmlForm.java:737)

表格是:

<form method="post" action="https://login.yahoo.com/config/login?" autocomplete="" name="login_form" onsubmit="return hash2(this)">
    ...
    <div id="submit">
        <button type="submit" id=".save" name=".save" class="primaryCta" tabindex="5"> Sign In </button>
    </div>
</form>

2 个答案:

答案 0 :(得分:1)

我对HtmlUnit一无所知,但是从错误消息中看起来它会搜索一些带有value属性的元素,而你的按钮没有这样的属性。也许byName或者这样?它不是<input>元素,而是<button>元素,所以可能类似于getButtonByName(".save")

编辑:我找到了Javadoc,似乎我猜对了方法名称:-p

答案 1 :(得分:0)

Yahoo登录表单提交按钮具有名称规范,而不是值规范。您需要按名称获取输入。我建议你改变:

page = (HtmlPage) form.getInputByValue("Sign In").click();

...到...

page = (HtmlPage) form.getInputByName("Sign In").click();