HtmlUnit,尝试获取表单但出现错误

问题描述


import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;


public class Main {

    public static void main(String[] args) {
        WebClient webClient = new WebClient();
        webClient.getoptions().setThrowExceptionOnScriptError(false);

        try {
            HtmlPage page = (HtmlPage) webClient
                    .getPage("https://www.reddit.com/login");
            HtmlForm form = page.getFormByName("AnimatedForm");
            form.getInputByName("username").setValueAttribute("myUsername");
            HtmlInput passWordInput = form.getInputByName("password");
            passWordInput.removeAttribute("disabled");
            passWordInput.setValueAttribute("myPassword");

            page = form.getInputByValue("Log In").click(); // works fine

            System.out.println(page.asText());
        } catch (Exception e) {
            e.printstacktrace();
        } finally {
            webClient.close();
        }
    }

}

每次运行此命令时,都会出现一条错误消息,提示“ com.gargoylesoftware.htmlunit.ElementNotFoundException:elementName = [form] attributeName = [name] attributeValue = [AnimatedForm]”。似乎无法识别AnimatedForm。我只是想知道为什么。

解决方法

您使用的page.getFormByName("AnimatedForm")方法将搜索具有属性<form>的{​​{1}}。

页面上没有名称为“ AnimatedForm”的表单,我看到了一个类为“ AnimatedForm”的表单。要按类检索元素,请使用类似name="AnimatedForm"

,

您真的要努力使登录名与Reddit一起使用。这不是一个简单的过程。如果您手动尝试登录,则登录名将提交凭据,并且看起来您是在浏览器中异步获得响应的,而没有立即重定向。实际上,将用户重定向到浏览器中的主登录页面大约需要5秒钟。

我强烈建议您着眼于利用现有的API,而不是尝试实现登录过程(我已经尝试过并与HTTP协议一起使用,每天都在构建Web服务...这并不简单。 )。

有用的资源:您可以在Java项目https://github.com/ViteFalcon/reddit4j中使用的Reddit库(未经测试,但值得一试)

Reddit Api:https://www.reddit.com/dev/api/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...