HtmlUnit выдает много исключений при нажатии одной кнопки - PullRequest
0 голосов
/ 12 апреля 2011

Я пытаюсь создать программу для входа в учетную запись Yahoo .Я использую HtmlUnit в Java, но когда программа пытается нажать кнопку Вход , возникает большое количество различных исключений.

Форма кнопки:

<form method="post" action="https://login.yahoo.com/config/login?" autocomplete="" name="login_form" onsubmit="return hash2(this)">
    <input type="hidden" name=".tries" value="1"/>
    <input type="hidden" name=".src" value=""/>
    <input type="hidden" name=".md5" value=""/>
    <input type="hidden" name=".hash" value=""/>
    <input type="hidden" name=".js" value=""/>
    <input type="hidden" name=".last" value=""/>
    <input type="hidden" name="promo" value=""/>
    <input type="hidden" name=".intl" value="us"/>
    <input type="hidden" name=".bypass" value=""/>
    <input type="hidden" name=".partner" value=""/>
    <input type="hidden" name=".u" value="eqn7kn96q7irv"/>
    <input type="hidden" name=".v" value="0"/>
    <input type="hidden" name=".challenge" value="rTRqt.vaVyBEJgxmMpkh0sqYx5Mz"/>
    <input type="hidden" name=".yplus" value=""/>
    <input type="hidden" name=".emailCode" value=""/>
    <input type="hidden" name="pkg" value=""/>
    <input type="hidden" name="stepid" value=""/>
    <input type="hidden" name=".ev" value=""/>
    <input type="hidden" name="hasMsgr" value="0"/>
    <input type="hidden" name=".chkP" value="Y"/>
    <input type="hidden" name=".done" value="http://my.yahoo.com"/>
    <input type="hidden" name=".pd" value="_ver=0&c=&ivt=&sg="/>
    <input type="hidden" name="pad" id="pad" value="3"/>
    <input type="hidden" name="aad" id="aad" value="3"/>
    <div id="inputs">
    <div id="fun"/>
    <div id="persistency">
    <div id="submit">
        <button type="submit" id=".save" name=".save" class="primaryCta" tabindex="5"> Sign In </button>
    </div>
</form>

и мой код java:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import java.io.IOException;
import java.net.URL;

public class VirtualWebBrowser {

    public static void clickAuthorizeButton(String url, String login, String password) throws Exception {

        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
        webClient.setThrowExceptionOnScriptError(false);

        webClient.setRefreshHandler(new RefreshHandler() {
            public void handleRefresh(Page page, URL url, int arg) throws IOException {
                System.out.println("handleRefresh");
            }
        });

        HtmlPage loginPage = (HtmlPage) webClient.getPage(url);
        HtmlForm liginForm = loginPage.getFormByName("login_form");

        liginForm.getInputByName("login").setValueAttribute(login);
        liginForm.getInputByName("passwd").setValueAttribute(password);

        HtmlButton signInButton = liginForm.getButtonByName(".save");
        HtmlPage nextPage = (HtmlPage) signInButton.click();

        webClient.closeAllWindows();
    }
}

Все исключения находятся в строке HtmlPage nextPage = (HtmlPage) signInButton.click();

После того, как эта строка программы зарегистрирована в учетной записи Yahoo, новсе исключения как-то влияют на всю работу программы, что она работает нестабильно.Что я должен сделать, чтобы избежать этой ситуации или хотя бы перехватить все исключения?

1 Ответ

1 голос
/ 12 апреля 2011

Из вставленных вами ошибок это выглядит как один из тех случаев, когда реализация HTMLUnit Javascript отличается от реализации в браузере.Я также не удивлюсь, если Yahoo не захочет, чтобы люди выполняли автоматический вход в свои свойства.

Вместо того, чтобы бороться с Javascript здесь, я бы попробовал следующие вещи:

  1. Посмотрите на HTTP-коммуникацию, используя сниффер (например, HttpFox), и попробуйте отправить запрос на вход в систему, используя HTTPURLConnection или HTTPClient.
  2. Проверьте, можете ли вы войти в систему с помощью API.Я знаю, что Yahoo предоставляет OpenID, они также могут предоставлять аутентификацию OAuth, см. http://developer.yahoo.com/oauth/
  3. Использование Selenium для входа в систему с использованием реального браузера.
...