2016-02-28 50 views
7

我使用PhantomJS 2点击页面的元素。但是,我不知道点击这些元素是否会触发事件(例如,页面加载)。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遗憾的是,对于onLoadStartedonLoadFinished事件处理程序不能访问的loading变量(即他们不工作的关闭了,因为它似乎)。

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

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

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

+0

没有'page.set'在PhantomJS(1或2)。你在node.js和PhantomJS之间使用某种桥梁吗? –

+0

嗯,是的确 - 我正在使用节点软件包phantom(https://www.npmjs.com/package/phantom)。显然忘了提及;)。但是,我想知道在哪种方式可能会涉及到我上述问题的解决方案...这实际上是这个节点桥而不是phantomjs本身的问题吗? – Oliver

回答

0

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