我正在使用这个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);
});
不确定我是否正确使用它,但我尝试的任何东西都没有用过:\
答案 0 :(得分:1)
代码中有三个错误:
then
在上一次ph
回调中,您的then
变量未定义,因为它在第一次ph
回调后确定了范围(并且已丢失)。
因此,通过修改第一个回调以将var ph;
phantom.create().then(function(pahntomObj){
ph = pahntomObj;
return ph.createPage();
})...
变量分解出范围,我们可以在最后一个回调中使用它:
req.query.url
第二个错误是,您正在使用未定义的变量url
,而您可能应该使用自己的return sitepage.open(url);
变量:
settings
第三个问题是,您使用{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等)。
要解决此问题,您应该:
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();
});
结合这些,我们将得到一个有效的代码:
ObjectSpace