Nightmarejs .click() 在每个元素上有延迟
Nightmarejs .click() on each element with delay between
我正在尝试使用 Nightmarejs 制作简单的跟随脚本。它应该以下一种方式工作:
- 转到某个用户个人资料
- 点击按钮打开该用户的关注者列表
- 点击所有跟随按钮,每次点击之间有延迟
- 点击加载更多
- 重复第 3 步和第 4 步几次
到目前为止我所拥有的是这个,它没有错误,但它只点击了第一个关注按钮,那就是结束:
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);
});
我试着循环点击像这样的关注按钮,但它给我错误 $ is not defined
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 天。
非常感谢任何帮助。
你得到 $ is not defined
因为这个语法是 jQuery 的一部分,当你写 NightmareJS 脚本时它使用纯 javascript.
由于函数 .inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")
,您可以加载 jquery 库(在求值之前)
我们需要一个同步休眠,否则 NightmareJS 可能会在函数结束前结束它 ̀evaluate
。 (我在这个线程上找到了 sleep
的代码:)
如果你想尝试异步睡眠,你必须使用 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);
});
试试这个版本:
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);
});
我正在尝试使用 Nightmarejs 制作简单的跟随脚本。它应该以下一种方式工作:
- 转到某个用户个人资料
- 点击按钮打开该用户的关注者列表
- 点击所有跟随按钮,每次点击之间有延迟
- 点击加载更多
- 重复第 3 步和第 4 步几次
到目前为止我所拥有的是这个,它没有错误,但它只点击了第一个关注按钮,那就是结束:
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);
});
我试着循环点击像这样的关注按钮,但它给我错误 $ is not defined
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 天。
非常感谢任何帮助。
你得到 $ is not defined
因为这个语法是 jQuery 的一部分,当你写 NightmareJS 脚本时它使用纯 javascript.
由于函数 .inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")
我们需要一个同步休眠,否则 NightmareJS 可能会在函数结束前结束它 ̀evaluate
。 (我在这个线程上找到了 sleep
的代码:)
如果你想尝试异步睡眠,你必须使用 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);
});
试试这个版本:
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);
});