phantomJS如何从页面加载后开始的JS脚本中获得答案

时间:2014-04-12 09:54:12

标签: javascript json response phantomjs pageload

我正在为这个问题寻找解决方案。

网站在页面加载后加载了几个JS脚本,它运行良好,页面从脚本获取响应并将其呈现到网站页面。

但脚本返回JSON,我希望在JSON中获得此响应,而不是从生成的页面获取。使用脚本的答案比使用选择器和周期从页面获取信息更快。

我尝试使用page.onResourceReceived(),但它只获取分析信息,文件名库存和响应大小;

如何获得此回复的正文?

1 个答案:

答案 0 :(得分:1)

如果我已正确理解您的要求,您可以尝试在网页端使用window.callPhantom将数据作为Object传递,并通过PhantomJS范围内的page.onCallback eventlistener接收数据。

http://phantomjs.org/api/webpage/handler/on-callback.html

摘录:

当在网页上进行JavaScript window.callPhantom调用时,将调用此回调。传递给回调的唯一参数是数据对象。

注意:window.callPhantom仍然是一个实验性API。在不久的将来,它可能会被基于消息的解决方案所取代,该解决方案仍将提供相同的功能。

虽然这种控制反转有很多可能的用例,但到目前为止主要的用例是防止PhantomJS脚本不断轮询网页上的某些变量。

实施例: WebPage(客户端)

if (typeof window.callPhantom === 'function') {
    window.callPhantom({ hello: 'world' });
}

PhantomJS(服务器端)

page.onCallback = function(data) {
    console.log('CALLBACK: ' + JSON.stringify(data));  // Prints 'CALLBACK: { "hello":     "world" }'
};

另外,请注意,WebPage#onCallback处理程序可以返回一个数据对象,该数据对象也将作为原始window.callPhantom调用的结果返回。

示例:

WebPage(客户端)

if (typeof window.callPhantom === 'function') {
    var status = window.callPhantom({ secret: 'ghostly' });
    alert(status);  // Will either print 'Accepted.' or 'DENIED!'
}

PhantomJS(服务器端)

page.onCallback = function(data) {
    if (data && data.secret && data.secret === 'ghostly') {
        return 'Accepted.';
    }
    return 'DENIED!';
};