PhantomJS 网站需要按键进行身份验证

PhantomJS website requires keypresses for authentication

我使用 PhantomJS 登录并从中抓取 table 的一个网站最近更新了,新版本似乎需要在用户名和密码字段上实际按下按键才能登录。

我的旧代码如下所示:

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 正确输出到调用此 phantomjs 代码的脚本,但现在我不确定从这里去哪里。我试过以几种不同的方式使用 page.sendEvent('keypress',page.event.key.U),但每次我插入那个位时它似乎都冻结了。当我加载页面时,光标自动位于正确的字段中,但除此之外,我认为使用 tab 应该切换到下一个字段,然后输入就可以输入我的数据。

我尝试过的示例

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

我最终解决了这个问题。关键事件似乎在起作用,但我在它们加载之前就在字段中输入了。我通过执行一系列控制台写入和页面呈现来查看页面在特定阶段的样子,从而发现了这一点。 Tab did work 切换字段,enter worked 提交字段。我认为要求按键而不仅仅是将字符串分配给值是网站现在使用 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);
    }
});