2

我正在使用基本的webClient.getPage方法在身份验证后检索页面,但是该网站使用某种彗​​星/流星服务器来发出永无止境的 ajax 请求,因此getPage进入循环,我得到:

2012 年 6 月 22 日下午 3:40:15 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl 通知警告:遇到过时的内容类型:'application/x-javascript'。

如果我一起禁用javascript,那么我会得到源页面并且它停止挂起:

 webClient.setJavaScriptEnabled(false);

但是我不能使用 HtmlUnit 功能,例如单击具有 javascript 事件的按钮。我想我不是第一个遇到这个问题的人,但我似乎找不到一个像样的解决方案。

我要连接的页面是 facebook,这是我的代码:

public static void submittingForm() throws Exception {
      //  final WebClient webClient = new WebClient();
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
        webClient.setJavaScriptEnabled(true);
        webClient.setTimeout(60000);
        webClient.setRedirectEnabled(true);
        webClient.setThrowExceptionOnFailingStatusCode(false);
        webClient.setThrowExceptionOnScriptError(false);
        webClient.setCssEnabled(false);
        webClient.setUseInsecureSSL(true);

        // Get the first page
        final HtmlPage page1 = webClient.getPage("http://www.facebook.com");

        // 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.getHtmlElementById("login_form");

        final HtmlTextInput textFieldUsername = form.getInputByName("email");
        final HtmlPasswordInput textFieldPassword = form.getInputByName("pass");
        final HtmlSubmitInput button = form.getInputByValue("Log In");


        // Change the value of the text field
        textFieldUsername.setValueAttribute("emailhere/username");
        textFieldPassword.setValueAttribute("password here");

        // Now submit the form by clicking the button and get back the second page.
        // And get the cookie set up.
        final HtmlPage page2= button.click();

        //Go to the bob marley fan page
        HtmlPage fanPage = webClient.getPage("http://www.facebook.com/BobMarley");
        webClient.setJavaScriptEnabled(true);

        // Get the label that containes the like button from the fan page
        HtmlLabel likeLabel = fanPage.getHtmlElementById("timelineHeadlineLikeButton");


        try{
            // Get the like button
            HtmlSubmitInput likeButton = (HtmlSubmitInput)likeLabel.getLastChild();
            // Press it
            likeButton.click();
        } catch (Exception e){
            e.printStackTrace();
        }

        webClient.closeAllWindows();
    }
4

1 回答 1

1

假设该线程仍处于打开状态且未解决。为了那些可能遇到此问题的人的利益:

我尝试使用 HtmlUnit 登录到内部网站(未向网络开放)。它挂起给你遇到的同样的信息。

Oct 09, 2013 1:39:59 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.

它进入了一个循环。这只是一个可以关闭的警告。您的脚本挂起的原因之一可能是因为它正在等待加载一些 javascript。

您已设置连接超时。尝试使用以下方法设置 javascript 超时:

webClient.setJavaScriptTimeout(45000);  //Set JavaScript Timeout to 0.75 minute

我做了同样的事情,它对我有用。它超时并继续执行剩余的代码行:

我得到以下输出:

INFO: Caught script timeout error
com.gargoylesoftware.htmlunit.javascript.TimeoutError: Javascript execution takes too long (allowed: 45000, already elapsed: 45001)
................

如果无响应的脚本对您的登录操作并不重要,那么您的代码将可以正常工作。

于 2013-10-09T18:52:03.127 回答