javascript - 有没有办法从页面上下文中监听幻像上下文中的事件?

标签 javascript events phantomjs hook webpage

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

我不想使用 setTimeoutsetInteval 等待并在幻象上下文中连续检查进程是否已完成。

最佳答案

这正是 onCallback and window.callPhantom() pair 的内容是为了。

因此,如果您在页面上下文中有一个异步调用,例如 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

关于javascript - 有没有办法从页面上下文中监听幻像上下文中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916699/

相关文章:

android - 从 Android 通过 EventChannel 接收字符串

javascript - 使用 Grunt.js 运行 mocha 测试

google-app-engine - 在 Travis-CI 上运行 Google App Engine 并使用 PhantomJS 进行测试

javascript - Vuetify,如何通过双击 v-data-table 中的事件获取行

javascript - 在隐身窗口中打开 URL

javascript - 合并两个 JSON 对象数组的 JSON 属性(使用 ramda)

javascript - ng-repeat 中的 UI Bootstrap 单选按钮

javascript - Javascript mousemove 事件处理程序会阻止 mousemove 事件吗?

mysql - 多个查询事件失败

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