我尝试使用nodejs和nightmarejs来学习网页报废。
我想创建一个可以连接到我的linkedin帐户的机器人,然后寻找一种技术,例如javascript,然后将工作表中每个配置文件的链接添加到一个表中,并且使用此表,我想使用"的循环用于"单击每个链接。最后,我会在工作表上发送每个配置文件的邀请。
这是我的代码:
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true })
var langage = process.argv[2];
var urls = [];
nightmare
.viewport(1000, 720)
.goto('https://www.linkedin.com/')
.type('#login-email', '**********@gmail.com')
.type('#login-password', '*********')
.click('#login-submit')
.wait(3000)
.type('#main-search-box', langage)
.wait(3000)
.click('.search-button')
.wait(2000)
.click('a[data-li-vertical-type="people"]')
.wait()
.evaluate(function () {
var link = [];
$('.primary-action-button.label').each(function(i, item) {
link.push($(item).attr('href'));
urls = link;
})
}
})
.run(function (err, nightmare) {
if (err) return console.log(err);
console.log('Done!');
for (var i = 0; i< urls.length; i++ ) {
nightmare
.goto(urls[i])
.click('#IF-reason-iweReconnect')
.wait()
.click('.btn-primary')
}
});
我输入节点script.js&#39; jquery&#39;进入控制台,它告诉我“网址没有定义”,我不知道我的错误在哪里。 如果你能帮助我,那真的很有帮助:) 谢谢,
千电子伏
答案 0 :(得分:0)
你在与梦魇中遇到两个常见的陷阱。首先,变量提升 - 就像你试图用urls
数组一样 - 并不像你想象的那样工作。由于.evaluate()
d函数传递给Electron的方式,.evaluate()
内的范围无法使用封闭范围内的变量。修复此操作相当简单:从已评估的函数返回数组并对.then()
进行中间调用。像(为简洁而编辑)的东西:
.evaluate(function () {
var link = [];
$('.primary-action-button.label').each(function(i, item) {
link.push($(item).attr('href'));
})
return link;
})
.then(function(urls){
nightmare.goto(urls[0]) ...
})
要获得更深入的解释,您可能需要阅读Variable Lifting and .evaluate()
。
你几乎要立刻遇到的第二个问题是循环某些东西并使用Nightmare实例来执行某些命令。按照设计,Nightmare是异步的,因此你所拥有的循环是行不通的。您可能还想给Async Operations and Loops一个读数。从那里解除了相关的香草JS例子:
var urls = ['http://example1.com', 'http://example2.com', 'http://example3.com'];
urls.reduce(function(accumulator, url) {
return accumulator.then(function(results) {
return nightmare.goto(url)
.wait('body')
.title()
.then(function(result){
results.push(result);
return results;
});
});
}, Promise.resolve([])).then(function(results){
console.dir(results);
});