如何使用Phantomjs评估从文档返回任何东西?

我正在使用这个phantomjs 软件包 ,因为我想和节点一起使用幻影。

我的目标是从给定网页上给定的位置获取元素。 我所做的一切,我总是得到null空stringPromise {}

基本上这里是我的代码:

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()我希望能够打印或保存到一个variables什么评估返回。

我已经尝试了很多方法,并且花了好几个小时,但迄今为止没有成功。

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

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

不知道我是否正确使用,但我尝试过的任何东西还没有工作:\

你的代码中有三个错误:

1.未定义的ph

在最后callback您的phvariables是未定义的,因为它是范围(和丢失)后第一个callback。

所以,通过修改第一个callback来将phvariables从范围中分离出来,我们可以在最后一个callback中使用它:

 var ph; phantom.create().then(function(pahntomObj){ ph = pahntomObj; return ph.createPage(); })... 

2.错误的variables

第二个错误是,你正在使用一个未定义的variablesreq.query.url ,而你可能应该使用自己的urlvariables:

 return sitepage.open(url); 

3.清除太多的设置

第三个问题是,您正在用{loadImages: false}重写settings属性对象,而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}); 清除所有其他标志(如userAgent,javascriptEnabled等)。

要解决这个问题,你应该:

  1. 阅读settings属性
  2. 在本地修改对象
  3. 将修改的对象保存到settings

这转换为代码:

 .then(function() { return sitepage.property('settings'); }).then(function(settings) { settings.loadImages = false; return sitepage.property('settings', settings); }) 

结合这些,我们将得到一个工作代码:

 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(); });