java - 需要帮助在 java 中使用 Htmlunit 登录我的雅虎邮件帐户

标签 java authentication htmlunit

我需要帮助尝试使用 java 中的 Htmlunit 登录我的雅虎电子邮件。我收到错误,我对 Htmlunit 真的很陌生。我听说这是用于屏幕抓取的最佳工具,为了让我进行屏幕抓取,我需要登录到我的内部网,但我正在练习使用我的雅虎邮箱。请帮忙!!

import java.net.*;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class HtmlDelete {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    HtmlDelete main = new HtmlDelete();
    try {
        main.submittingForm();
    } catch (Exception ex) {
        Logger.getLogger(HtmlDelete.class.getName()).log(Level.SEVERE, null, ex);       }
    }

    public void submittingForm() throws Exception {
    final WebClient webClient = new WebClient();
    //webClient.setJavaScriptEnabled(false);
    // Get the first page
    final HtmlPage page1 = webClient.getPage("https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym");

    // Get the form that we are dealing with and within that form,
    // find the submit button and the field that we want to change.
    final HtmlForm form = page1.getFormByName("login_form");

    //final HtmlSubmitInput button = form.getInputByName("subbtn");
    final HtmlSubmitInput button = page1.getHtmlElementById(".save");
    final HtmlTextInput loginName = form.getInputByName("login");
    final HtmlPasswordInput loginPs = form.getInputByName("passwd");

    // Change the value of the text field
    loginName.setValueAttribute("xxxx@yahoo.com");
    loginPs.setValueAttribute("exxxxx5");

    // Now submit the form by clicking the button and get back the second page.
    final HtmlPage page2 = button.click();
    final String pageAsXml = page2.asText();
    System.out.println(pageAsXml);
    //webClient.closeAllWindows();
    }
}

输出

    Jun 19, 2013 9:31:47 AM com.att.temp.HtmlDelete main
    SEVERE: null
    ======= EXCEPTION START ========
    Exception class=[net.sourceforge.htmlunit.corejs.javascript.WrappedException]
    com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot call method "one" of null (https://s.yimg.com/lq/lib/yui-ssl/3.4.1/build/yui/yui-min.js#8)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:601)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:576)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1005)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:208)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:228)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:813)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:737)
        at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:867)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:872)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeEventHandlersIfNeeded(HtmlPage.java:1268)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:237)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:441)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:309)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:374)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
        at com.att.temp.HtmlDelete.submittingForm(HtmlDelete.java:34)
        at com.att.temp.HtmlDelete.main(HtmlDelete.java:24)

    Inside wrapped exception:
    ======= EXCEPTION START ========
    Exception class=[net.sourceforge.htmlunit.corejs.javascript.WrappedException]
    com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot call method "one" of null (https://s.yimg.com/lq/lib/yui-ssl/3.4.1/build/yui/yui-min.js#8)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:601)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:576)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1005)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:208)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeListeners(EventListenersContainer.java:293)
        at com.gargoylesoftware.htmlunit.javascript.host.Window.executeEvent(Window.java:1975)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.executeEvent(Node.java:725)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.setAndExecuteReadyState(HtmlScript.java:535)
        at com.gargoylesoftware.htmlunit.html.HtmlScript$3.execute(HtmlScript.java:261)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:714)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$500(JavaScriptEngine.java:91)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:664)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:601)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:576)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1005)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:208)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:228)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:813)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:737)
        at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:867)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:872)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeEventHandlersIfNeeded(HtmlPage.java:1268)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:237)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:441)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:309)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:374)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
        at com.att.temp.HtmlDelete.submittingForm(HtmlDelete.java:34)
        at com.att.temp.HtmlDelete.main(HtmlDelete.java:24)

    ======= EXCEPTION START ========
    Exception class=[net.sourceforge.htmlunit.corejs.javascript.JavaScriptException]
    com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot call method "one" of null (https://s.yimg.com/lq/lib/yui-ssl/3.4.1/build/yui/yui-min.js#8)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:555)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:1082)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:399)
        at com.gargoylesoftware.htmlunit.html.HtmlScript$3.execute(HtmlScript.java:260)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:714)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$500(JavaScriptEngine.java:91)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:664)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:601)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:576)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1005)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:208)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeListeners(EventListenersContainer.java:293)
        at com.gargoylesoftware.htmlunit.javascript.host.Window.executeEvent(Window.java:1975)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.executeEvent(Node.java:725)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.setAndExecuteReadyState(HtmlScript.java:535)
        at com.gargoylesoftware.htmlunit.html.HtmlScript$3.execute(HtmlScript.java:261)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:714)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$500(JavaScriptEngine.java:91)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:664)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:601)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:576)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:1005)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:208)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:228)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:813)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:737)
        at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:867)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:872)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeEventHandlersIfNeeded(HtmlPage.java:1268)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:237)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:441)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:309)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:374)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
        at com.att.temp.HtmlDelete.submittingForm(HtmlDelete.java:34)
        at com.att.temp.HtmlDelete.main(HtmlDelete.java:24)
    Caused by: net.sourceforge.htmlunit.corejs.javascript.JavaScriptException: TypeError: Cannot call method "one" of null (https://s.yimg.com/lq/lib/yui-ssl/3.4.1/build/yui/yui-min.js#8)
        at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1006)
        at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798)
        at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405)
        at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:275)
        at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031)
        at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:115)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:546)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:654)
        ... 44 more
    JavaScriptException value = TypeError: Cannot call method "one" of null
    ======= EXCEPTION END ========
    == CALLING JAVASCRIPT ==

      function () {
          if (this.readyState == "loaded" || this.readyState == "complete") {
          loadUHJS();
          }
      }

    ======= EXCEPTION END ========
    == CALLING JAVASCRIPT ==

      function () {
          var seedfile = "https://s.yimg.com/lq/lib/yui-ssl/3.4.1/build/yui/yui-min.js";
          var yui3 = document.createElement("script");
          yui3.type = "text/javascript";
          yui3.id = "seedfile";
          yui3.src = seedfile;
          var head = document.getElementsByTagName("head")[0];
          head.appendChild(yui3);
          yui3.onload = function () {
          loadUHJS();
          };
          yui3.onreadystatechange = function () {
          if (this.readyState == "loaded" || this.readyState == "complete") {
              loadUHJS();
          }
          };
          loadUHJS = function () {
          YUI({combine: true, comboBase: "https://s.yimg.com/lq/combo?", root: "yui-ssl/3.4.1/build/"}).use("node", "event", "event-mouseenter", "substitute", "oop", "node-focusmanager", function (Y) {
          });
          var hdJS = document.createElement("script");
          hdJS.type = "text/javascript";
          hdJS.src = "https://s.yimg.com/zz/combo?kx/ucs/sts/js/442/skip-min.js&kx/ucs/uh/js/279/timestamp_library-min.js&kx/ucs/menu_utils/js/164/menu_utils_v2-min.js&kx/ucs/uh/js/267/aria_toolbar-min.js&kx/ucs/username/js/43/user_menu-min.js&kx/ucs/help/js/41/help_menu-min.js&kx/ucs/utility_link/js/20/utility_menu-min.js&kx/ucs/uh/js/262/logo_debug-min.js";
          head.appendChild(hdJS);
          };
      }

    ======= EXCEPTION END ========

最佳答案

有点奇怪,但是默认的 DOM 解析器对页面上运行的 JS 不满意。使用 htmlunit-2.12,我只是添加了一个特定的浏览器版本 (WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17)) 并让它运行。查看示例代码:

添加以下内容(注意,我关闭了多余的WARNINGS):

import com.gargoylesoftware.htmlunit.BrowserVersion;
----
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF);

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);

// Get the first page
HtmlPage page1 = webClient.getPage("https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym");

System.out.println(page1.getTitleText());

输出:

Yahoo! Mail: The best web-based email!


编辑:列出了一些错误(未在原始问题中列出)。问题中的错误是转移注意力。消除所有噪音后,您将获得以下内容:

SEVERE: runtimeError: message=[innerHTML is read-only for tag table]

Cannot find function attachEvent in object [object Window]

关于java - 需要帮助在 java 中使用 Htmlunit 登录我的雅虎邮件帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17194489/

相关文章:

java - 编码密码看起来不像 BCrypt

java - 按特定顺序替换字符串中的字符

正则表达式和 POST 在同一连接中

PHP SESSION 数据在本地主机上的 WAMPserver 2.0 页面加载之间丢失

java - 如何使用Httpclient的GET方法访问flashplayer

java - Java 中的轻量级 XLSX 阅读器

java - 使用 Mockito 注入(inject) Autowiring 的 bean 并在模拟上设置一些属性

PHP 登录表单不起作用,我该怎么解决它?

Java htmlUnit获取xml页面ClassCastException问题

JavaScript 未在 HtmlUnit 中正确执行