我正在尝试使用Nightmarejs制作简单的脚本。它应该以下一种方式工作:
到目前为止我所拥有的是它,它没有任何错误,但只点击第一个关注按钮就结束了:
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true })
nightmare
.goto('http://example.com/')
.click('.buttonOpenModal')
.wait(4000)
.click('.buttonFollow')
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});
我试图循环点击这样的关注按钮,但它给了我错误 $未定义
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true })
nightmare
.goto('http://example.com/')
.click('.buttonOpenModal')
.wait(4000)
.evaluate(function(){
$('.buttonFollow').each(function() {
$(this).click();
});
})
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});
我相信对于那些在Nightmarejs有经验的人来说,这将是一项简单的任务,但我刚刚开始使用它并且已经挣扎了2天了。
我真的很感激任何帮助。
答案 0 :(得分:4)
你得到$ is not defined
,因为这个语法是jQuery的一部分,当你编写NightmareJS脚本时,它使用纯javascript。
由于函数.inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")
我们需要同步睡眠,否则NightmareJS可能会在完成之前结束函数evaluate
。 (我在这个帖子上找到了sleep
的代码:https://stackoverflow.com/a/17532524/6479780)
如果您想尝试异步睡眠,则必须使用setTimeout(callback, millis)
这是我要做的,使用纯javascript:
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true })
nightmare
.goto('http://example.com/')
.click('.buttonOpenModal')
.wait(4000)
.evaluate(function(){
function sleep(ms) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
return;
}
var list = document.querySelectorAll('.buttonFollow');
list.forEach(function(elt){
elt.click();
//We need synchronous sleep here
sleep(2000); //Wait 2 seconds
});
})
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});
答案 1 :(得分:0)
试试这个版本:
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });
nightmare
.goto('http://example.com/')
.click('.buttonOpenModal')
.wait('div.Buttons')
.evaluate(function () {
var interval = setInterval(function () {
var btn = document.querySelectorAll('div.Buttons');
if (undefined == btn || 0 == btn.length) {
clearInterval(interval);
}
else {
btn[0].click();
}
}, 5000);
})
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});