【发布时间】:2016-02-28 20:34:43
【问题描述】:
我正在使用 PhantomJS 2 来点击页面的元素。但是,我不知道点击这些元素是否会触发事件(例如页面加载)。
我希望能够处理这两种情况:
当点击元素触发页面加载时,我想等到新页面加载完毕。
当点击未触发事件时,我希望能够识别(无需等待长时间超时)。
在 PhantomJS 1 中,我可以简单地使用这样的闭包:
function click(page, elem, callback) {
var loading = false;
page.set('onLoadStarted', function() {
loading = true;
});
page.set('onLoadFinished', function() {
callback('click triggered page load');
});
triggerClick(page, elem);
setTimeout(function() {
if ( ! loading) {
callback('click did not trigger page load');
}
}, 100);
}
在这里,我将关闭 loading 变量,它充当事件处理程序和 setTimeout 中的函数之间的“通信通道”。
如果点击触发页面加载,
onLoadFinished处理程序将在页面加载后调用回调。如果点击没有触发页面加载,
setTimeout中的函数会在100ms后调用回调(可以接受)。
这段代码在 PhantomJS 1 下运行良好。
不幸的是,在 PhantomJS 2 下,onLoadStarted 和 onLoadFinished 的事件处理程序无法再访问 loading 变量(即它们不再像看起来那样作为闭包工作)。
所以现在我想知道如何在 PhantomJS 2 中实现相同的行为。有什么想法吗?
PS:我知道我必须在 PhantomJS 2 中通过 page.property(...) 安装事件处理程序,而不是像在 PhantomJS 1 中那样使用 page.set(...)。
编辑:我使用 node 包 phantom (https://www.npmjs.com/package/phantom) 作为 node 和 phantomjs 之间的桥梁。
【问题讨论】:
-
PhantomJS(1 或 2)中没有
page.set。您是否在 node.js 和 PhantomJS 之间使用某种桥梁? -
啊,确实是的 - 我正在使用节点包幻影 (npmjs.com/package/phantom)。显然忘记提及了;)。但是,我想知道解决上述问题的方法可能涉及到哪种方式......这实际上是这个节点桥而不是 phantomjs 本身的问题吗?
标签: javascript phantomjs