有没有办法从页面上下文中监听幻像上下文中的事件?
Is there a way to listen to an event in the phantom context from page context?
例如:我用 PhantomJS 打开一个页面,评估一个异步脚本(例如 ajax)。当它成功时,我想让幻像上下文(page.evaluate()
之外)知道异步过程完成。
我不想使用 setTimeout
和 setInteval
等待并在幻象上下文中连续检查进程是否已完成。
这正是 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