我使用 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
中的函数将在100毫秒后调用回调(这是可以接受的)。
此代码在PhantomJS 1下运行良好。
不幸的是,在PhantomJS 2下,onLoadStarted
和onLoadFinished
的事件处理程序无法再访问loading
变量(即它们不再作为闭包工作了)看起来像。)
所以现在我想知道如何在PhantomJS 2中实现相同的行为。任何想法?
PS :我知道我必须通过page.property(...)
在PhantomJS 2中安装事件处理程序,而不是像PhantomJS 1中那样使用page.set(...)
。
编辑:我使用节点包幻像(https://www.npmjs.com/package/phantom)作为节点和节点之间的桥梁。 phantomjs。
答案 0 :(得分:0)
对我来说,解决方案实际上是放弃节点桥,而是使用纯粹的幻像。这导致以下相应的代码像魅力一样工作,即使使用 PhantomJS 2 :
function click(page, elem, callback) {
var loading = false;
page.onLoadStarted = function() {
loading = true;
};
page.onLoadFinished = function() {
callback('click triggered page load');
};
triggerClick(page, elem);
setTimeout(function() {
if ( ! loading) {
callback('click did not trigger page load');
}
}, 100);
}