Javascript 在每个元素上单击()并在
我正在尝试用噩梦制作简单的跟随脚本。它应该以下一种方式工作:Javascript 在每个元素上单击()并在,javascript,jquery,phantomjs,browser-automation,nightmare,Javascript,Jquery,Phantomjs,Browser Automation,Nightmare,我正在尝试用噩梦制作简单的跟随脚本。它应该以下一种方式工作: 转到某个用户配置文件 单击按钮打开该用户的追随者列表 单击所有跟随按钮,每次单击之间有延迟 单击“加载更多” 重复步骤3。四,。几次 到目前为止,我得到的是这个,它工作正常,没有错误,但它只单击第一个跟随按钮,这就是结束: var Nightmare = require('nightmare'); var nightmare = Nightmare({ show: true }) nightmare .goto('http://ex
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);
});
我相信对于一个经历过噩梦的人来说,这将是一个简单的任务,但我刚刚开始做这件事,已经为此奋斗了两天
我非常感谢您的帮助。您得到的
$未定义
,因为此语法是jQuery的一部分,当您编写噩梦EJB脚本时,它使用纯javascript
由于函数.inject(“js”),您可以加载jquery库(在求值之前)https://code.jquery.com/jquery-3.1.0.min.js“”
我们需要同步睡眠,否则噩梦EJS可能会在函数完成之前结束函数̀evaluate
。(我在这个线程上找到了sleep
的代码:)
如果要尝试异步睡眠,必须使用setTimeout(回调,毫秒)
下面是我将使用纯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噩梦=require(“噩梦”);
var噩梦=噩梦({show:true})
噩梦
后藤先生('http://example.com/')
。单击(“.ButtonPenmodal”)
.等等(4000)
.评估(功能){
功能睡眠(ms){
var start=new Date().getTime(),expire=start+ms;
while(new Date().getTime()
试试这个版本:
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);
});
我懂了。这是可行的,但是它一次点击了所有的按钮,你能在每个按钮之间延迟编辑吗?如果我理解的很好,基本上你可以在里面添加任何纯javascript函数?非常感谢。evaluate中的代码将在噩梦ejs打开的窗口中执行。因此,基本上,这就像在浏览器上打开一个新选项卡,键入网址,然后将
evaluate
函数的内容粘贴到控制台中。这就是为什么纯javascript浏览器在这样睡觉时会冻结