HTML单元登录

时间:2019-05-10 14:17:25

标签: java htmlunit

基本上,我正在尝试使用HTML单元执行登录。

但是,以登录名形式输入的用户名旁边带有一个按钮,然后它将激活该表单并应输入密码。当我执行button.click()页面时,会出现我的问题,该页面获得第一种形式而不是第二种形式,应该在第二种形式输入密码

public void search() throws Exception {
    WebClient wb = new WebClient();

    HtmlPage p = wb.getPage(
            "https://account.booking.com/sign-in?op_token=EgVvYXV0aCJHChQ2Wjcyb0hPZDM2Tm43emszcGlyaBIJYXV0aG9yaXplGhpodHRwczovL2FkbWluLmJvb2tpbmcuY29tLyoCe31CBGNvZGUqDDCgqZHe5rMjOgBCAA");
    // HtmlPage p = (HtmlPage) wb.getPage(this.bUrl);

    List<HtmlForm> form = p.getForms();

    form.get(0).getInputByName("loginname").setValueAttribute("1234567");
    HtmlForm fm = form.get(0);
    System.out.println(form.get(0).getInputByName("loginname").getValueAttribute().toString());

    List<Object> button = fm.getByXPath("//button[@type='submit']");

    HtmlButton bt = (HtmlButton) button.get(0);

    System.out.println(p.asText() + "\n+_________________");
    bt.click();
    System.out.println(p.asText());

}

bt.click()之前和之后的输出显示相同

1234567
Booking.com Account
This website uses cookies. Click here for more information.
Close
Sign In to Manage Your Property
Username
1234567
Next
Having trouble signing in?
Questions about your property or the Extranet? Visit the Partner Help Center or ask another partner on the Partner Forum.
Add your property to Booking.com
Create a partner account to list and manage your property.
Register
By clicking "Allow access" you authorize Extranet to use your Booking.com account info according to Extranet Terms of service.
+_________________
Booking.com Account
This website uses cookies. Click here for more information.
Close
Sign In to Manage Your Property
Username
Enter your username
Next
Having trouble signing in?
Questions about your property or the Extranet? Visit the Partner Help Center or ask another partner on the Partner Forum.
Add your property to Booking.com
Create a partner account to list and manage your property.
Register
By clicking "Allow access" you authorize Extranet to use your Booking.com account info according to Extranet Terms of service.

1 个答案:

答案 0 :(得分:1)

对不起,但是您的代码基于对Html和HtmlUnit的基本误解。

HtmlPage p = wb.getPage(.....

检索一个(html)页面。此页面显示在浏览器窗口内(与HtmlUnit相同)。如果您与此页面上的元素进行交互,例如

form.get(0).getInputByName("loginname").setValueAttribute("1234567");

或更佳

form.get(0).getInputByName("loginname").type("1234567");

这些元素在此更改状态,结果整个页面都在更改。 但: 单击提交按钮是一个完全不同的故事。在这种情况下,浏览器(和HtmlUnit也)将Http请求发送到服务器并获取新的HtmlPage。通常,此页面显示在同一窗口内。

在HtmlUnit中,这由click方法的返回值反映出来-返回值是新页面。只要您没有将此值分配给页面变量,并且在此新页面上执行下一步,您仍在使用旧页面。

顺便说一句:Getting Started HtmlUnit页面上有一个注释示例。

到目前为止,是表单/提交处理的最简单版本。但是今天,这种想法稍微复杂了许多(实际上很多),因为那里的大多数页面都在基于JavaScript(例如Ajax)进行(附加)魔术操作。

建议: 如果您通过私人邮件向我发送了一些凭据,我可以尝试帮助您使该登录基于HtmlUnit进行工作。

建议2: 尝试学习和理解与Web相关的所有技术知识,否则您将迷路。