在 for 循环中第二次 运行 噩梦中断

nightmare break at 2nd time run in forloop

我正在制作一个网络机器人,检查页面是否正确加载了噩梦。我有不止一页需要在每次执行程序时检查。我了解如何使用 nightmare 通过检查页面的选择器来检查页面是否已加载。当我只检查一页时它是成功的。但是当涉及到检查 2 页的 for 循环时。它失败。我需要使用 'vo' 模块,因为我发现多次执行噩梦需要使用 vo。

我用我的调试器来检查。第一个循环执行得很好。第二个是噩梦中的“.then”。

var run_true = function*() {
    yield nightmare
      .goto('https://www.hkbn.net/personal/home/tc/landing')
      .wait('#root') // Wait for landing page
      .catch(() => {
        console.log('T:Not Found')
      })
      .then(() => {
        console.log('T:Landing page is loaded.');
      })

    yield nightmare.end();
    return null;
  }

  var run_fail = function*() {
    yield nightmare
      .goto('https://www.hkbn.net/personal/home/tc/landing')
      .wait('#rodfsdfdsffsfdsfdsfot') // Wait for landing page
      .then(() => {
        console.log('F:Landing page is loaded.');
      })
      .catch(() => {
        console.log('F:Not Found')
      })
    yield nightmare.end();
    return null;
  }

var test = function*(){
    for(var i = 0; i <2 ; i++){
        if (i==0){
            var x = yield vo(run_fail)();   //x is meaningless, just let it call the run fail
        }else{
            var y = yield vo(run_true)();
        }
    }
}


vo(test)();

我需要同时显示 run_fail 和 run_true 的结果。 应该是 'F:Not Found' ,然后是 'T:Landing page is loaded.' 目前只有 F:Not 找到。

我可以建议用 Promises 重写它吗?你会摆脱很多头痛。另外,当你有 end() 调用时,这意味着噩梦对象将在链 运行 之后被释放。这也意味着您不能在第二个循环 运行 中重复使用该对象。这是让您入门的代码:

const Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });

var run_true = function() {
    return nightmare
        .goto('https://www.hkbn.net/personal/home/tc/landing')
        .wait('#root') // Wait for landing page
        .catch(() => {
            console.log('T:Not Found')
        })
        .then(() => {
            console.log('T:Landing page is loaded.');
        });
}

var run_fail = function() {
    return nightmare
        .goto('https://www.hkbn.net/personal/home/tc/landing')
        .wait('#rodfsdfdsffsfdsfdsfot') // Wait for landing page
        .then(() => {
            console.log('F:Landing page is loaded.');
        })
        .catch(() => {
            console.log('F:Not Found')
        });
}

var test = async function() {
    for (var i = 0; i < 2; i++) {
        try {
            if (i == 0) {
                await run_fail();
            } else {
                await run_true();
            }
        } catch (e) {
            // do something with errors
        }
    }
}

test().catch(err => {
    console.error(err); // do something with error
    process.exit(1);
}).then(result => {
    console.log('All processes finished');
    process.exit(0);
});