HtmlUnit не выполняет Javascript внутри страницы - PullRequest
0 голосов
/ 25 января 2019

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

Используя мой код, я хочу заполнить форму входа на главной странице, чтобы получить доступ к моему личному профилю. Тем не менее, htmlUnit выдает мне ошибку во время выполнения и возвращает обратно на главную страницу.

Я приложил код, который я пытаюсь выполнить, и ошибки, которые я получаю. Кроме того, я приложил вывод, который я получаю (это не то, что я хочу). (Вот какую ссылку я наконец пытаюсь получить: https://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/PortalMainPage)

public class MistarLogin {

public static void main(String[] args) throws Exception {

    //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);



    final WebClient webClient = new WebClient(BrowserVersion.CHROME);
    int javaScriptLeftNum = webClient.waitForBackgroundJavaScript(3000);



    // Get the first page
    HtmlPage firstPage = (HtmlPage) webClient.getPage("https://mistar.oakland.k12.mi.us/novi/StudentPortal");

    System.out.println(firstPage.asText());
    System.out.println("\n\n\n\n\n\n\n-------------------------------------------------------------------------------\n\n\n\n\n\n");

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

    // Enter login and passwd
    //form.getInputByName("districtid").setValueAttribute("");
    form.getInputByName("Pin").setValueAttribute("email");
    form.getInputByName("Password").setValueAttribute("password");

    // Click "Sign In" button/link
     HtmlInput loginButton = form.getInputByValue("Log In");

     HtmlPage testPage = (HtmlPage) loginButton.click();

    // I added the cookie section but this returns a null pointer exception    
    Set<Cookie> cookie = webClient.getCookieManager().getCookies();

    if(cookie != null){

        Iterator<Cookie> i = cookie.iterator();

        while (i.hasNext()) {

            webClient.getCookieManager().addCookie(i.next());

        }

    }

   // final HtmlPage secondPage = loginButton.click();

Затем просто распечатайте firstPage, testPage (вывод такой же)


Вот что я получаю:

  Student Portal
   District Website

StudentPortal Войти Имя пользователя:
Пароль:
Войти

0

школьный округ Нови 1 * * тысяча двадцать-один

Загрузка информации ...

Загрузка информации ...


Это ошибка, которую я получаю (самая существенная):

com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError SEVERE: runtimeError: message = [Указан недопустимый или недопустимый селектор (селектор: ': input [form = "loginform"]' ошибка: недопустимый селектор: *: input [form = "loginform"]).] SourceName = [https://mistar.oakland.k12.mi.us/novi/StudentPortal/Scripts/jquery-1.11.2.min.js?m=20150316043710] line = [2] lineSource = [null] lineOffset = [0]

P.S. Извините за форматирование, я не знаком с правилами формирования пакетов Stackoverflow. P.P.S. Если есть какие-либо вопросы, пожалуйста, задавайте. Я буду смотреть на этот вопрос постоянно. Спасибо еще раз.

1 Ответ

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

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

    final String url = "https://mistar.oakland.k12.mi.us/novi/StudentPortal";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
        HtmlPage firstPage = webClient.getPage(url);
        // waitForBackgroundJavaScript has to be called after every action
        webClient.waitForBackgroundJavaScript(2000);

        System.out.println(firstPage.asText());
        System.out.println("-------------------------------------------------------------------------------");

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

        // Enter login and passwd
        form.getInputByName("Pin").type(XXXX);
        form.getInputByName("Password").type(YYYY);

        // Click "Sign In" button/link
        HtmlInput loginButton = form.getInputByValue("Log In");
        loginButton.click();
        // wait until the js has done the job
        webClient.waitForBackgroundJavaScript(20000);

        // now get the current page content based on the current window; using
        // HtmlPage homePage = (HtmlPage) loginButton.click();
        // does not work because the page content is async replaced by javascript
        HtmlPage homePage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();

        System.out.println(homePage.asText());
        System.out.println("-------------------------------------------------------------------------------");

        DomElement table = homePage.getElementById("stuBannerTable");
        for (DomElement tableRow : table.getElementsByTagName("tr")) {
            if (tableRow.asText().contains("Dmitry Kustarnikov") && tableRow.asText().contains("Novi High School (HS)")) {
                System.out.println("row found ");
                for (DomElement tableCell : table.getElementsByTagName("tr")) {
                    if (tableCell.asText().contains("Dmitry Kustarnikov")) {
                        System.out.println("cell found ");

                        tableCell.click();
                        webClient.waitForBackgroundJavaScript(20000);
                        HtmlPage detailsPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();

                        System.out.println(detailsPage.asText());
                        System.out.println("-------------------------------------------------------------------------------");
                        break;
                    }
                }
            }
        }
    }
...