如何使用Phantomjs评估从文档返回任何东西?
我正在使用这个phantomjs 软件包 ,因为我想和节点一起使用幻影。
我的目标是从给定网页上给定的位置获取元素。 我所做的一切,我总是得到null , 空string或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()我希望能够打印或保存到一个variables什么评估返回。
我已经尝试了很多方法,并且花了好几个小时,但迄今为止没有成功。
编辑:我正在使用的包在自述文件中有以下示例:
page.evaluate(function() { return document.getElementById('foo').innerHTML; }).then(function(html){ console.log(html); });
不知道我是否正确使用,但我尝试过的任何东西还没有工作:\
你的代码中有三个错误:
1.未定义的ph
在最后callback您的ph
variables是未定义的,因为它是范围(和丢失)后第一个callback。
所以,通过修改第一个callback来将ph
variables从范围中分离出来,我们可以在最后一个callback中使用它:
var ph; phantom.create().then(function(pahntomObj){ ph = pahntomObj; return ph.createPage(); })...
2.错误的variables
第二个错误是,你正在使用一个未定义的variablesreq.query.url
,而你可能应该使用自己的url
variables:
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等)。
要解决这个问题,你应该:
- 阅读
settings
属性 - 在本地修改对象
- 将修改的对象保存到
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(); });