Я могу войти с помощью имени пользователя и пароля вручную (в браузере), но не могу войти через мое пакетное задание с помощью HtmlUnit - PullRequest
0 голосов
/ 28 января 2019
HtmlPage signinPage = (HtmlPage)webClient.getPage("https://imeidb.gsma.com/imei/index");
System.out.println("signinPage -----------------------------------" + signinPage.getUrl());
HtmlForm form = signinPage.getFormByName("signIn");
HtmlTextInput loginField = (HtmlTextInput)form.getInputByName("username");

loginField.setValueAttribute(userName);

System.out.println("Username :"+loginField.toString());
HtmlPasswordInput pwdField = (HtmlPasswordInput)form.getInputByName("password");

pwdField.setValueAttribute(password);
System.out.println("Username :"+pwdField.toString());

HtmlButtonInput loginBtn = (HtmlButtonInput)signinPage.getHtmlElementById("loginImg");

System.out.println("HtmlButtonInput loginBtn -----------------------------------" + loginBtn.toString());
System.out.println("HtmlButtonInput loginBtn getHtmlElementById -----------------------------------" + signinPage.getHtmlElementById("loginImg"));
System.out.println("HtmlButtonInput signinPage getStatusCode -----------------------------------" + signinPage.getWebResponse().getStatusCode());
System.out.println("HtmlButtonInput signinPage getStatusMessage -----------------------------------" + signinPage.getWebResponse().getStatusMessage());

resultPage = (HtmlPage) loginBtn.click();

1 Ответ

0 голосов
/ 28 января 2019

Здесь уже есть ответы на похожие вопросы.

Не имея аккаунта на этой странице, я не могу предоставить какие-либо подробности или проверенные решения.Но в любом случае некоторые советы:

  • автоматизация веб-страниц требует реальных знаний об основных веб-технологиях
  • убедитесь, что для вашего веб-клиента включен javascript
  • обычностраницы по крайней мере частично выполняют инициализацию на основе JavaScript;из-за этого рекомендуется дождаться js после получения страницы или принудительного действия

    HtmlPage signinPage = (HtmlPage)webClient.getPage("https://imeidb.gsma.com/imei/index");
    webClient.waitForBackgroundJavaScript(2000);
    
  • использовать метод type для заполнения полей ввода

    pwdField.type(password);
    
  • метод click () возвращает страницу результатов синхронизации;в вашем случае кнопка не является кнопкой отправки;обычно это означает, что страница обновляется с помощью javascript (async).Замените

    resultPage = (HtmlPage) loginBtn.click();
    

    на

    (HtmlPage) loginBtn.click();
    webClient.waitForBackgroundJavaScript(20000);
    
    resultPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
    

Если это не поможет, вы можете отправить мне учетные данные для страницы, и я постараюсь помочь вам с более подробной информацией.

И наконец - это работает здесь.В результате я попадаю на страницу «Вопрос безопасности учетной записи», как в реальных браузерах.

    String url = "https://imeidb.gsma.com/imei/index";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
        HtmlPage signinPage = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(10000);

        // System.out.println("----------------");
        // System.out.println(signinPage.asXml());

        HtmlForm form = signinPage.getFormByName("signIn");
        HtmlTextInput loginField = (HtmlTextInput)form.getInputByName("username");
        loginField.type("xxxx");

        HtmlPasswordInput pwdField = (HtmlPasswordInput)form.getInputByName("password");
        pwdField.type("yyyy");

        HtmlButtonInput loginBtn = (HtmlButtonInput)signinPage.getHtmlElementById("loginImg");
        loginBtn.click();
        webClient.waitForBackgroundJavaScript(10000);

        HtmlPage resultPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        System.out.println("----------------");
        System.out.println(resultPage.asXml());
    }
...