javascript – 有没有办法从页面上下文中捕捉幻像上下文中的事件?

例如:我用PhantomJS打开一个页面,评估异步脚本(例如ajax).当它成功时,我想让幻像上下文(在page.evaluate()之外)知道异步过程已经完成.

我不想使用setTimeout和setInteval等待并在幻像上下文中连续检查该进程是否已完成.

解决方法

这正是070​​00的用途.

因此,如果您在页面上下文中有异步调用(如AJAX请求),则可以执行以下操作:

page.onCallback = function(data){
    console.log("finished: " + data.text);
    phantom.exit();
};
page.evaluate(function(){
    var xhr = new XMLHttpRequest();
    xhr.open("GET","/");
    xhr.onreadystatechange = function () {
        var DONE = this.DONE || 4;
        if (this.readyState === DONE){
            window.callPhantom({text: this.responseText});
        }
    };
    xhr.send();
});

另一种使用方法是将调用添加到生产JavaScript中,以便更轻松地进行测试.如果您正在编写Web应用程序,有时候找到一个表示页面完全加载的选择器会很复杂.为了更轻松地测试这样的应用程序,您可以在页面JavaScript中使用以下内容

finishOffPage(function callback(){
    if (typeof window.callPhantom === "function") {
        window.callPhantom({type: "loadFinished"});
    }
});

然后你可以写这样的测试:

page.onCallback = function(data){
    if (data.type === "loadFinished") {
        // do some testing
    }
};
page.open(url);

这是一个可以动态添加这样的东西的例子:wait for angular app to be fully rendered from phantom script

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...