Веб-сайт Phantom JS требует нажатия клавиш для аутентификации - PullRequest
0 голосов
/ 05 февраля 2020

Веб-сайт, который я использую Phantom JS для входа в систему и очистки таблицы, был недавно обновлен, и новая версия, похоже, требует, чтобы нажатия клавиш фактически выполнялись в полях имени пользователя и пароля для входа в систему сейчас.

Мой старый код выглядит следующим образом:

var page = require('webpage').create();
phantom.cookiesEnabled = true;
page.open("https://website.location.com/log", function(status) {
    if (status === "success") {
        page.evaluate(function() {
            document.getElementsByName("username")[0].value = "uname";
            document.getElementsByName("password")[0].value = "pass12";
            document.getElementsByTagName("button")[0].click();
        });
        window.setTimeout(function() {
           page.render("page.png");
           page.open("https://website.location.com/log/#!/activity/search", function(status) {

                window.setTimeout(function() {
                   page.render("profil.png");
                   console.log(page.content);
                   phantom.exit();
                }, 5000);
            });
        }, 5000);
    }
});

Старый код прекрасно работал со старым логином на странице и выводом console.log правильно в сценарий, который вызывал этот фантомный js код, но теперь я Я не уверен, где go отсюда. Я пытался использовать page.sendEvent ('keypress', page.event.key.U) несколькими различными способами, но каждый раз, когда я вставляю этот бит, кажется, он зависает. Когда я загружаю страницу, курсор автоматически попадает в правильное поле, но в противном случае я решил, что с помощью табуляции следует переключиться на следующее поле, и команда ввода сможет ввести мои данные.

Пример того, что я пробовал

var page = require('webpage').create();
phantom.cookiesEnabled = true;
page.open("https://website.location.com/log", function(status) {
    if (status === "success") {
        page.evaluate(function() {
            page.sendEvent('keypress', page.event.key.U);
            page.sendEvent('keypress', page.event.key.N);
            page.sendEvent('keypress', page.event.key.A);
            page.sendEvent('keypress', page.event.key.M);
            page.sendEvent('keypress', page.event.key.E);
            page.sendEvent('keypress', page.event.key.Tab);
            page.sendEvent('keypress', page.event.key.P);
            page.sendEvent('keypress', page.event.key.A);
            page.sendEvent('keypress', page.event.key.S);
            page.sendEvent('keypress', page.event.key.S);
            page.sendEvent('keypress', page.event.key.1);
            page.sendEvent('keypress', page.event.key.2);
            document.getElementsByTagName("button")[0].click();
        });
        window.setTimeout(function() {
           page.render("page.png");
           page.open("https://website.location.com/log/#!/activity/search", function(status) {

                window.setTimeout(function() {
                   page.render("search.png");
                   console.log(page.content);
                   phantom.exit();
                }, 5000);
            });
        }, 5000);
    }
});

Я также пробовал некоторые варианты, подобные этой, которые не кажутся лучше:

            page.sendEvent('keypress', "uname");
            page.sendEvent('keypress', page.event.key.Tab);
            page.sendEvent('keypress', "pass12");
            page.sendEvent('keypress', page.event.key.Enter);

1 Ответ

1 голос
/ 05 февраля 2020

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

var page = require('webpage').create();
phantom.cookiesEnabled = true;
page.open("https://webpage.location.com/log", function(status) {
    if (status === "success") {
        page.render("pretyped.png");
        window.setTimeout(function() {
           page.sendEvent("keypress", "uname");
           page.sendEvent("keypress", page.event.key.Tab);
           page.sendEvent("keypress", "*****");
           page.sendEvent("keypress", page.event.key.Enter);

           page.render("page.png");
           window.setTimeout(function(){
               page.open("https://webpage.location.com/log/api/v1/overview/?endDate=2020-02-05T21:57:13Z&startDate=2020-01-04T21:57:13Z", function(status) {
                    window.setTimeout(function() {
                       page.render("profil.png");
                       console.log(page.content);
                       phantom.exit();
                    }, 5000);
                });
           }, 5000);
        }, 5000);
    }
});
...