Javascript 噩梦EJS无法使用vo进行评估
我正在尝试使用Node.JS中的梦魇ejs v2和Vo来查看一些搜索词并从中收集数据。我的代码如下所示:Javascript 噩梦EJS无法使用vo进行评估,javascript,node.js,generator,electron,nightmare,Javascript,Node.js,Generator,Electron,Nightmare,我正在尝试使用Node.JS中的梦魇ejs v2和Vo来查看一些搜索词并从中收集数据。我的代码如下所示: const nightmare = require('nightmare'), vo = require('vo'), nbot = nightmare({ title: 'Bot', show: true }); const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperl
const nightmare = require('nightmare'),
vo = require('vo'),
nbot = nightmare({ title: 'Bot',
show: true });
const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS
vo(run)(function(err) {
if (err) throw err
});
function * run() {
yield nbot.goto('http://google.com');
yield * forEach(searchTerms, gen);
yield nbot.end()
.then(function(result) {
console.log(result) // STUFF SHOULD BE LOGGED HERE
});
}
function * gen(item) {
yield nbot.wait('input[title="Search"]')
.click('input[title="Search"]')
.type('input[title="Search"]', item)
.click('input[name="btnK"]')
.wait(100)
.screenshot(item + '.png')
.insert('input[title="Search"]', '')
.evaluate(function() {
return 'foobar' // STUFF RETURNED HERE
})
}
function * forEach (arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS
let i;
for (i = 0; i < arr.length; i++) {
yield * fn(arr[i]);
}
}
const噩梦=require(“噩梦”),
vo=需要('vo'),
nbot=噩梦({title:'Bot',
show:true});
const searchTerms=['spacex'、'tesla'、'elon musk'、'hyperloop'];//示例搜索词
vo(运行)(功能(错误){
如果(错误)抛出错误
});
函数*run(){
后藤产量http://google.com');
收益率*forEach(搜索术语,gen);
收益率nbot.end()
.然后(函数(结果){
console.log(result)//应该在这里记录内容
});
}
功能*gen(项目){
产生nbot.wait('input[title=“Search”]”)
。单击('input[title=“Search”]”)
.type('input[title=“Search”]”,项)
。单击('input[name=“btnK”]”)
.等等(100)
.屏幕截图(项目+'.png')
.insert('input[title=“Search”]”,'')
.评估(功能){
return'foobar'//此处返回的内容
})
}
函数*forEach(arr,fn){//需要,因为forEach在生成器中不工作
让我;
对于(i=0;i
根据梦魇EJS的文档,如果你返回evaluate
中的某个内容,那么当你使用然后
时,它就会被吐出来。当我尝试这一点时,我没有定义。我想这是发电机的问题,但我对他们是新手,所以我不知道。非常感谢您的帮助。示例很接近,但看起来您正在将生成器与Promise语法进行混合和匹配。.evaluate()
方法的行为与您描述的一样,但是当您使用vo
(或co
)时,。然后()
将为您处理和管理,返回的值。然后()
返回到表达式的左侧(如果定义了表达式)。另外,不管怎样,生成器不会返回值,因此您将(正确地)得到未定义的
对迭代器、生成器、承诺和vo
/co
进行了更深入的介绍。您可能还想查看上的文档
最后,您的示例被修改为从gen
到forEach
直到run
返回结果:
const nightmare = require('nightmare'),
vo = require('vo'),
nbot = nightmare({
title: 'Bot',
show: true
});
const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS
vo(run)(function(err) {
if (err) throw err
});
function* run() {
yield nbot.goto('http://google.com');
var results = yield * forEach(searchTerms, gen);
console.log(results);
yield nbot.end();
}
function* gen(item) {
var value = yield nbot.wait('input[title="Search"]')
.click('input[title="Search"]')
.type('input[title="Search"]', item)
.click('input[name="btnK"]')
.wait(100)
.screenshot(item + '.png')
.insert('input[title="Search"]', '')
.evaluate(function() {
return 'foobar' // STUFF RETURNED HERE
});
return value;
}
function* forEach(arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS
let i;
var results = [];
for (i = 0; i < arr.length; i++) {
results.push(yield * fn(arr[i]));
}
return results;
}
const噩梦=require(“噩梦”),
vo=需要('vo'),
nbot=噩梦({
标题:“机器人”,
秀:真的
});
const searchTerms=['spacex'、'tesla'、'elon musk'、'hyperloop'];//示例搜索词
vo(运行)(功能(错误){
如果(错误)抛出错误
});
函数*run(){
后藤产量http://google.com');
var结果=收益率*forEach(搜索术语,gen);
控制台日志(结果);
收益率nbot.end();
}
功能*gen(项目){
var value=yield nbot.wait('input[title=“Search”]”)
。单击('input[title=“Search”]”)
.type('input[title=“Search”]”,项)
。单击('input[name=“btnK”]”)
.等等(100)
.屏幕截图(项目+'.png')
.insert('input[title=“Search”]”,'')
.评估(功能){
return'foobar'//此处返回的内容
});
返回值;
}
函数*forEach(arr,fn){//需要,因为forEach在生成器中不工作
让我;
var结果=[];
对于(i=0;i
很好的例子!默认情况下,提供的示例在我的案例中不起作用(来自德国的IP)
下面是一个一般搜索的小补丁:
const nightmare = require('nightmare'),
vo = require('vo'),
nbot = nightmare({
title: 'Bot',
show: true
});
const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS
vo(run)(function(err) {
if (err) throw err
});
function* run() {
yield nbot.goto('http://google.com');
var results = yield * forEach(searchTerms, gen);
console.log(results);
yield nbot.end();
}
function* gen(item) {
var inputTitle
var value = yield nbot
.evaluate(() => {
return document.getElementById("lst-ib").title
})
.then((lang) => {
inputTitle = 'input[title="' + lang + '"]'
return true
});
yield nbot
.wait(inputTitle)
.click(inputTitle)
.type(inputTitle, item)
.click('input[name="btnK"]')
.wait(100)
.screenshot(item + '.png')
.insert(inputTitle, '')
.evaluate(function() {
return 'foobar' // STUFF RETURNED HERE
});
return value;
}
function* forEach(arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS
let i;
var results = [];
for (i = 0; i < arr.length; i++) {
results.push(yield * fn(arr[i]));
}
return results;
}
const噩梦=require(“噩梦”),
vo=需要('vo'),
nbot=噩梦({
标题:“机器人”,
秀:真的
});
const searchTerms=['spacex'、'tesla'、'elon musk'、'hyperloop'];//示例搜索词
vo(运行)(功能(错误){
如果(错误)抛出错误
});
函数*run(){
后藤产量http://google.com');
var结果=收益率*forEach(搜索术语,gen);
控制台日志(结果);
收益率nbot.end();
}
功能*gen(项目){
风险值输入
var值=收益率nbot
.评估(()=>{
返回文档.getElementById(“lst ib”).title
})
.然后((lang)=>{
inputTitle='input[title=“”+lang+“]”输入
返回真值
});
产量nbot
.等待(输入标题)
。单击(输入标题)
.类型(输入标题、项目)
。单击('input[name=“btnK”]”)
.等等(100)
.屏幕截图(项目+'.png')
.插入(输入标题“”)
.评估(功能){
return'foobar'//此处返回的内容
});
返回值;
}
函数*forEach(arr,fn){//需要,因为forEach在生成器中不工作
让我;
var结果=[];
对于(i=0;i
谢谢!但是,我昨天在处理了一个小时左右后,实际上解决了这个问题。我会将你的答案标记为被接受的答案,以帮助其他人在将来解决类似的问题。