javascript - 在页面上下文中的控制台日志之间在 PhantomJS 中等待一段时间

标签 javascript asynchronous phantomjs

<分区>

我需要在 PhantomJS 中等待一段时间。我搜索了很多但没有找到答案。我在 page.open 中尝试了这段代码,但它不起作用。

var interval = window.setInterval(function(){ 
    console.log("works");
    clearInterval(interval); 
}, 3000);

我也尝试了 setTimeout 但它也没有帮助

window.setTimeout(function(){ 
    console.log("works");
}, 3000);

等待几秒钟的解决方案是什么?

我需要在日志之间等待 3 秒:jquery includedworks。但是这些日志同时出现在控制台中。

var page = require("webpage").create();
var url = "https://www.youtube.com";

page.open(url, function(status) {
    if (status == "success"){
        console.log(status);
        if (page.injectJs("jquery.min.js")){
            console.log("jquery included");
            page.evaluate(function(){
                setTimeout(function(){       
                }, 3000);
            });
            console.log("works");
            phantom.exit();
        }       
    }
    else{
        console.log(status);
        phantom.exit();
    }
});

最佳答案

这是错误的集合:

  • JavaScript 没有像其他语言一样的休眠功能,因为它是单线程的。这意味着 sleep 将有效地停止所有其他处理。所以,你不能使用

    console.log("1");
    setTimeout(function(){}, 5000);
    console.log("2");
    

    并期望 21 之后 5 秒打印。 2 将在 1 之后立即打印。您需要使用 JavaScript 的异步特性:

    console.log("1");
    setTimeout(function(){
        console.log("2");
    }, 5000);
    
  • phantom.exit() 必须在您完成脚本后调用。这意味着您需要从 setTimeout 回调中调用它。

  • page.evaluate 是沙盒页面上下文。您不能使用外部定义的变量。因此,您不能在 page.evaluate() 内部使用 phantom.exit(),但可以使用 window.callPhantom/page.onCallback pair从页面上下文获取消息。

  • 如果您想从页面上下文接收控制台消息,您需要提供一个 onConsoleMessage event handler .

完整脚本:

var page = require("webpage").create();
var url = "https://www.youtube.com";

page.onCallback = function(data){
    if (data.type === "exit") {
        phantom.exit();
    }
};
page.onConsoleMessage = function(msg){
    console.log("remote: " + msg);
};
page.open(url, function(status) {
    if (status == "success"){
        console.log(status);
        if (page.injectJs("jquery.min.js")){
            console.log("jquery included");
            page.evaluate(function(){
                setTimeout(function(){
                    console.log("works");
                    window.callPhantom({type: "exit"});
                }, 3000);
            });
        }       
    }
    else{
        console.log(status);
        phantom.exit();
    }
});

关于javascript - 在页面上下文中的控制台日志之间在 PhantomJS 中等待一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116488/

相关文章:

javascript - 由于 Phantomjs 中的 javascript 日志而无法截图?

javascript - 这个JS函数如何使用参数?

javascript - react 原生 : How to make change in specific item of ScrollView

javascript - 插入排序函数错误

c# - 如何在 UWP 中查找 UI 线程

multithreading - 回调如何在非阻塞设计中工作?

javascript - 使用 react 钩子(Hook)和 typescript 为操作对象创建接口(interface)的正确方法是什么

ios - 从 Swift 函数中的异步调用返回数据

ajax - 如何使用 casperjs 捕获和处理 XHR 响应中的数据?

javascript - Grunt- Mocha ​​ `PhantomJS timed out`