我正在运行一个Nightmare.js脚本,其中我正在尝试require
lodash
(在本地安装了npm,在node_modules中,在package.json中注册)。
index.js:
var Nightmare = require('nightmare');
var _ = require('lodash');
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
function getElms(elm) {
var elsm = document.querySelectorAll(elm);
return _.map(elsm, function(elem){ return elem.innerHTML; });
}
var someWebsite = new Nightmare({ show: false })
.goto( ***some url*** )
.wait(getRandomInt(2500, 5000))
.evaluate(function () {
var elsm = document.querySelectorAll(***some selector***);
return _.map(elsm, function(elem){ return elem.innerHTML; });
// return getElms(***some selector***);
}).then(function(linkstexts) {
console.log(linkstexts)
});
但我得到了这个:
UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):_未定义
return getElms(***some selector***);
这是package.json
{
"name": "nightxp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"lodash": "^4.17.4",
"nightmare": "^2.10.0"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
我错过了什么?
更新
我尝试将lodash传递到浏览器范围,并使用catch()
完成,
但不知何故,lodash变量仍然没有传递给范围(例如hackernews):
var Nightmare = require('nightmare');
var lodash = require('lodash');
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
var facebook = new Nightmare({ show: false })
.goto('https://news.ycombinator.com')
.wait(getRandomInt(5500, 6000))
.evaluate( (lodash) => {
var elsm = document.querySelectorAll('tr td.title a.storylink');
return lodash.map(elsm, function(elem){ return elem.innerHTML; });
}, lodash).then(function(titles) {
console.log(titles)
}).catch(function (error) {
console.error('Error:', error);
});
这就是我得到的:
C:\Projects\nightmare>set DEBUG=nightmare & node index.js
nightmare queuing process start +0ms
nightmare queueing action "goto" for https://news.ycombinator.com +4ms
nightmare queueing action "wait" +2ms
nightmare queueing action "evaluate" +0ms
nightmare running +1ms
Error: Cannot read property 'map' of undefined
答案 0 :(得分:1)
运行时
var someWebsite = new Nightmare({ show: false })
.evaluate(function () {
/* ... */
}
您现在处于浏览器范围内 - 您可以将Nightmare.evaluate
视为在独立浏览器的上下文中运行包含的代码,这意味着您的全局范围(包括_
)不可用。
请点击此处获取更多信息以及有关将数据传递到范围的一些提示:
https://github.com/segmentio/nightmare/issues/89
https://github.com/segmentio/nightmare/issues/333
编辑:
虽然可以从节点上下文将简单值传递给evaluate,但是不能使用函数和方法传递复杂值。这是因为参数在传输过程中是序列化的,这对于函数来说很困难。这是一个解释它的问题:
https://github.com/segmentio/nightmare/issues/349
在这种特殊情况下,似乎最简单的事情就是在没有lodash的情况下工作,这些日子并不难。例如:
var facebook = new Nightmare({ show: false })
.goto('https://news.ycombinator.com')
.wait(getRandomInt(5500, 6000))
.evaluate( () => {
var elsm = document.querySelectorAll('tr td.title a.storylink');
return Array.prototype.map.call(elsm, elem => elem.innerHTML)
})
.then(function(titles) {
console.log("title", titles)
})
.catch(function (error) {
console.error('Error:', error);
});