Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 噩梦EJS无法使用vo进行评估_Javascript_Node.js_Generator_Electron_Nightmare - Fatal编程技术网

Javascript 噩梦EJS无法使用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

我正在尝试使用Node.JS中的梦魇ejs v2和Vo来查看一些搜索词并从中收集数据。我的代码如下所示:

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
谢谢!但是,我昨天在处理了一个小时左右后,实际上解决了这个问题。我会将你的答案标记为被接受的答案,以帮助其他人在将来解决类似的问题。