为什么setInterval函数中的语句没有在Phantomjs中执行?

时间:2015-07-23 06:42:08

标签: javascript phantomjs setinterval

我正在尝试使用Phantomjs登录网站。当我在填充表单元素后单击loginButton时,我试图在setInterval函数中找到一些元素id,因为我希望首先加载页面(给出2秒)然后只搜索元素但这里的问题是:我的setInterval中的语句没有被执行。这是phantomjs代码:

var url = "http://www.someUrl.com";
var page = require('webpage').create();

page.onConsoleMessage = function(msg, lineNo, sourceId){
    console.log('console: ' + msg);
};

page.onLoadFinished = function(status){
    console.log("Loading finished");
    page.render('webpage.png');
};

page.open(url, function(status){
    page.evaluate(function(){
        arr = document.getElementsByClassName('formLabel');
        if (typeof arr !== 'undefined'){
            arr[0].value = 'Login-id';
            arr[1].value = 'Password';
        }
        document.getElementById('loginButton').click();
        setInterval(function(){
            console.log("Downloading the file");
            document.getElementById('downloadButton').click();
        }, 2000);
    });
});

当我执行上面的代码时,我得到的输出为: -

Loading finished
Loading finished

出于调试目的,我在setInterval函数中写了console.log('Downloading the file')但是这个语句没有被执行。 我还将网页呈现为图像page.render('webpage.png'),以检查我是否能够成功登录。我看到登录成功了。所以,我在这里几乎没有问题: -

  1. 为什么setInterval函数中的那些语句没有被执行?
  2. 我应该在哪里写这些语句以使它们正常工作?
  3. 事实上,当我在loginButton.click()语句之后编写这些语句时,我得到了这个错误 - TypeError:'null'不是一个对象(靠近'downloadButton')。click();. ..'),这意味着当时页面没有加载。因此,我在setInterval函数中写了它们,并将等待时间设为2秒。

    PS:我的click声明没有问题,因为我的loginButton.click正在运作。

    先谢谢。

1 个答案:

答案 0 :(得分:1)

当我开始尝试使用PhantomJS时,我遇到了同样的问题。 我意识到问题可能是page.evaluate()在打开的页面的上下文中运行。因此,当您单击登录按钮时,页面将被重定向,因此click()之后的语句不会被执行或输出不再可见。

我通过创建另一个page.run()块并在前一个完成后运行它(即超时)来解决这个问题 - 因为我想在登录后执行该部分脚本。