在 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);
});
我正在制作一个网络机器人,检查页面是否正确加载了噩梦。我有不止一页需要在每次执行程序时检查。我了解如何使用 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);
});