基本脚本中的PhantomJS错误

时间:2016-07-11 11:53:47

标签: javascript jquery selenium phantomjs browser-automation

这是一个假装登录谷歌帐户的脚本(我已经制作好了)。但显然,这不起作用。这里没有特别的目标,但要使其发挥作用。

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 web驱动程序(这是真正的爱)使它工作。但现在时间已经过去了,它必须是javascript(完全是DOM / jQuery ......所以Web兼容)。

你可以帮助我使它成功吗?

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

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

编辑3:我改变了document.get(...)。value =&#39; blabla&#39;到$(&#39;#id&#39;)。val(&#39; blabla&#39;);现在打印

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

但是它应该只打印一个SUCCESS,显然捕获仍然不起作用。

1 个答案:

答案 0 :(得分:0)

对于编辑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
    }
});