如何使用Phantomjs评估从文档中返回任何内容?

时间:2016-06-05 16:04:44

标签: javascript node.js phantomjs

我正在使用这个package的phantomjs,因为我想在节点上使用幻像。

我的目标是从给定网页上的给定位置获取元素。我尝试做的每件事我总是得到 null 空字符串 Promise {}

这里基本上是我的代码:

var phantom = require('phantom');
var sitepage;
var url = "http://amazon.com";

phantom.create().then(function(ph){
    return ph.createPage();
}).then(function(page){
    var pageWidth = parseInt("1920px", 10);
    var pageHeight = parseInt(pageWidth * 3/4, 10);
    sitepage = page;
    sitepage.property('settings', {loadImages: false});
    sitepage.property('viewportSize', { width: pageWidth, height: pageHeight });
    return sitepage.open(req.query.url);
}).then(function(status){
    if (status == "success") {
        var x = 888;
        var y = 777;

        var element = sitepage.evaluate(function(x, y) {
            return document.elementFromPoint(x, y).outerHTML;
        }, x, y);

        return element;
    }

    return '404';
}).then(function(content){
    console.log(content);

    page.close();
    ph.exit();      
});

在最后一个 .then()中,我希望能够打印或保存任何评估返回的变量。

到目前为止,我尝试了很多方法,花了几个小时没有成功。

编辑: 我使用的包I在自述文件中有以下示例:

page.evaluate(function() {
    return document.getElementById('foo').innerHTML;
}).then(function(html){
    console.log(html);
});

不确定我是否正确使用它,但我尝试的任何东西都没有用过:\

1 个答案:

答案 0 :(得分:1)

代码中有三个错误:

1。未定义的then

在上一次ph回调中,您的then变量未定义,因为它在第一次ph回调后确定了范围(并且已丢失)。

因此,通过修改第一个回调以将var ph; phantom.create().then(function(pahntomObj){ ph = pahntomObj; return ph.createPage(); })... 变量分解出范围,我们可以在最后一个回调中使用它:

req.query.url

2。错误的变量

第二个错误是,您正在使用未定义的变量url,而您可能应该使用自己的return sitepage.open(url); 变量:

settings

3。清除太多设置

第三个问题是,您使用{loadImages: false}覆盖了settings属性对象,而{ XSSAuditingEnabled: false, javascriptCanCloseWindows: true, javascriptCanOpenWindows: true, javascriptEnabled: true, loadImages: true, localToRemoteUrlAccessEnabled: false, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1', webSecurityEnabled: true } 属性中包含的完整对象最初是:

sitepage.property('settings', {loadImages: false});

所以只需调用settings清除所有其他标志(如userAgent,javascriptEnabled等)。

要解决此问题,您应该:

  1. 阅读settings属性
  2. 在本地修改对象
  3. 将修改后的对象保存到.then(function() { return sitepage.property('settings'); }).then(function(settings) { settings.loadImages = false; return sitepage.property('settings', settings); })
  4. 这转换为代码:

    var phantom = require('phantom');
    var sitepage;
    var url = "http://amazon.com";
    
    var ph;
    phantom.create().then(function(phObj){
        ph = phObj;
        return ph.createPage();
    }).then(function(page){
        sitepage = page;
        var pageWidth = parseInt("1920px", 10);
        var pageHeight = parseInt(pageWidth * 3/4, 10);
        return sitepage.property('viewportSize', { width: pageWidth, height: pageHeight });
    }).then(function() {
        return sitepage.property('settings');
    }).then(function(settings) {
        settings.loadImages = false;
        return sitepage.property('settings', settings);
    }).then(function() {
        return sitepage.open(url);
    }).then(function(status){
        if (status == "success") {
            var x = 888;
            var y = 777;
    
            var element = sitepage.evaluate(function(x, y) {
                return document.elementFromPoint(x, y).outerHTML;
            }, x, y);
    
            return element;
        }
    
        return '404';
    }).then(function(content){
        console.log(content);
    
        sitepage.close();
        ph.exit();      
    });
    

    解决方案

    结合这些,我们将得到一个有效的代码:

    ObjectSpace