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

时间:2016-02-28 20:34:44

标签: javascript phantomjs

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

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

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

  2. 当点击没有触发事件时,我希望能够识别(无需等待很长的超时)。

  3. 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毫秒后调用回调(这是可以接受的)。

    3. 此代码在PhantomJS 1下运行良好。

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

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

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

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

1 个答案:

答案 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);
}