基本脚本中的 PhantomJS 错误

PhantomJS bug in basic script

这是一个假装登录您的 google 帐户的脚本(我制作的)。但显然,那是行不通的。这里没有特别的objective,但要让它起作用。

var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
    console.log('CONSOLE: ' + msg);
};
page.open('https://google.com/', function() {
    page.injectJs('jquery-2.2.1.min.js');
    page.evaluate(function() {
        function include(arr,obj) { // those functions are not part of scraping
            return (arr.indexOf(obj) != -1);
        }
        function add(a, b) {
            return a + b;
        }
        Array.min = function( array ){
            return Math.min.apply( Math, array );
        };
        function dofirst() {
            $('#gb_70').click();
            main(1, 0);
        }
        function dosecond() {
            document.getElementById('Email').value = 'myemail@gmail.com';
            $('#next').click();
            main(2, 0);
        }
        function dothird() {
            document.getElementById('Passwd').value = 'P4SSW0RD';
            $('#signIn').click();
            main(3, 0);
        }
        function dofourth() {
            L1 = ['test', 'test2', 'google'];
            for (var i = 0; i < 1; i++) {
                if (L1, 'google') {
                    console.log('SUCCESS!');
                }
            }
            main(4, 0);
        }   
        function dofifth() {
            $('.gb_b.gb_8a.gb_R').click()
            setTimeout(function(){$('#gb_71').click()}, 500);
            main(0, 5000);
        }
        function main(i, j) {
            if (i === 0) {
                console.log('launching 0');
                setTimeout(dofirst(), j); // connections
            }
            else if (i === 1) {
                console.log('launching 1');
                setTimeout(dosecond(), 5000);
            }
            else if (i === 2) {
                console.log('launching 2');
                setTimeout(dothird(), 5000);
            }
            else if (i === 3) {
                console.log('launching 3');
                setTimeout(dofourth(), 5000);
            } else if (i === 4) {
                console.log('launching 4');
                setTimeout(dofifth(), 5000);
            }
        }
        main(0, 5000);
    });
    console('super end');
    page.render('google.png');
});

最后我得到了这些错误:

CONSOLE: launching 0
CONSOLE: launching 1
TypeError: null is not an object (evaluating 'document.getElementById('Email').value = 'myemail@gmail.com'')

  undefined:7 in dosecond
  :22 in main
  :4 in dofirst
  :18 in main
  :29
  :30

我试了很多方法都没有用。我可以使用 Python 和 selenium 网络驱动程序(这是真爱)让它工作。但是现在时间已经过去了,它必须在 javascript 中(完全 DOM/jQuery... 所以 Web 兼容)。

你能帮我让它工作吗!

编辑 1:通过尝试捕获屏幕截图,它确实保存了一个空的 PNG。

编辑 2:我认为这可能是一个提示,当我执行 phantomjs test.js 时,需要很长时间才能最终加载并快速记录所有内容...

编辑 3:我将 document.get(...).value = 'blabla' 更改为 $('#id').val('blabla');现在它打印

CONSOLE: launching 0
CONSOLE: launching 1
CONSOLE: launching 2
CONSOLE: launching 3
CONSOLE: SUCCESS!
CONSOLE: SUCCESS!
CONSOLE: SUCCESS!
CONSOLE: SUCCESS!
CONSOLE: SUCCESS!

然而它应该只打印一次 SUCCESS,显然捕获仍然不起作用。

对于编辑 1:尝试捕获屏幕

检查状态以确保页面已加载。

page.open(url, function(status) {
    if (status !== 'success') {
        // exit if it fails to load the page
        console.log(status);
        phantom.exit(1);
    }
    else{
        // your code here
    }
});