PhantomJS 2:检测到未触发事件的点击

PhantomJS 2: Detecting click that did not trigger an event

本文关键字:事件 检测 PhantomJS      更新时间:2023-09-26

我正在使用PhantomJS 2来单击页面的元素。但是,我不知道单击这些元素是否会触发事件(例如页面加载)。

我希望能够处理这两种情况:

  1. 当单击元素触发页面加载时,我想等到新页面加载完毕。

  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函数之间的"通信通道"。

  1. 如果单击触发页面加载,onLoadFinished处理程序将在加载页面后调用回调。

  2. 如果点击没有触发页面加载,setTimeout中的函数将在 100 毫秒后调用回调(这是可以接受的)。

这段代码在PhantomJS 1下运行良好。

不幸的是,在 PhantomJS 2 下,onLoadStartedonLoadFinished的事件处理程序无法再访问 loading 变量(即它们不再像看起来那样用作闭包)。

所以现在我想知道如何在 PhantomJS 2 中实现相同的行为。有什么想法吗?

PS:我知道我必须在PhantomJS 2中通过page.property(...)安装事件处理程序,而不是像PhantomJS 1那样使用page.set(...)

编辑:我正在使用节点包phantom(https://www.npmjs.com/package/phantom)作为node和phantomjs之间的桥梁。

对我来说,解决方案实际上是放弃节点桥,而是使用纯 phantomjs。这会导致以下相应的代码像超级按钮一样工作,即使使用 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);
}