java - HTML 单元登录

标签 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.

最佳答案

抱歉,您的代码是基于对 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 方法的返回值反射(reflect)出来 - 返回值是新页面。只要您没有将此值分配给页面变量并在此新页面上执行后续步骤,您仍然可以使用旧页面。

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

迄今为止最简单的表单/提交处理版本。但今天的想法有点(实际上很多位)更复杂,因为大多数页面都基于 javascript(例如 Ajax)执行(额外的)魔法。

建议: 如果您通过私有(private)邮件向我发送一些凭据,我可以尝试帮助您基于 HtmlUnit 进行此登录。

建议2: 尝试学习和理解所有与网络相关的技术知识,否则你就会迷失方向。

关于java - HTML 单元登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079508/

相关文章:

java - 如何通过注释在spring mvc 3中设置 header 无缓存

java - HtmlUnit - 下载背景图像

java - _jspService 超过了 65535 字节的限制

java - Hibernate 新手在 netbeans 中的帮助

java - 如果我需要从线程的可运行对象返回一个对象怎么办?

java - 如何获取 ImageReader 的 Base64 编码内容?

java - Maven 依赖项大小

java - 请帮助有关 XML 到 JTable 的问题

java - HtmlUnit 无法获取Page

primefaces - 使用 Webdriver 进行 PrimeFaces 文件上传