【问题标题】:PhantomJS 2: Detecting click that did not trigger an eventPhantomJS 2:检测未触发事件的点击
【发布时间】:2016-02-28 20:34:43
【问题描述】:

我正在使用 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中的函数会在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


【解决方案1】:

我的解决方案实际上是放弃节点桥,而是使用纯 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);
}

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多