node.js - 如何在 node.js 中处理同步浏览器仿真
问题描述
我正在编写一个脚本,该脚本旨在从 .txt 文件中加载一些内容,然后使用 node.js 的浏览器模拟器噩梦对网站执行多个(循环)请求。
我从 txt 文件中读取没有问题,所以没有,但设法让它运行同步并且没有例外。
function visitPage(url, code) {
new Promise((resolve, reject) => {
Nightmare
.goto(url)
.click('.vote')
.insert('input[name=username]', 'testadmin')
.insert('.test-code-verify', code)
.click('.button.vote.submit')
.wait('.tag.vote.disabled,.validation-error')
.evaluate(() => document.querySelector('.validation -error').innerHTML)
.end()
.then(text => {
return text;
})
});
}
async function myBackEndLogic() {
try {
var br = 0, user, proxy, current, agent;
while(br < loops){
current = Math.floor(Math.random() * (maxLoops-br-1));
/*...getting user and so on..*/
const response = await visitPage('https://example.com/admin/login',"code")
br++;
}
} catch (error) {
console.error('ERROR:');
console.error(error);
}
}
myBackEndLogic();
发生的错误是: UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'webContents' of undefined
所以有几个问题:
1)如何修复异常
2)如何使它实际工作同步并模拟每次地址(如在之前的尝试中,我没有保存,我修复了异常,但浏览器实际上并没有打开,它基本上被跳过了
3)(不那么重要)是否可以选择几个对象
.wait('.class1,.class2,.validation-error')
并将每个值保存在不同的变量中,或者只是从第一个发生的文本中获取文本?(如果这些都没有发生,则返回 0 例如)
解决方案
我看到上面的代码有一些问题。
- 在
visitPage
函数中,您将返回一个 Promise。没关系,除了你不必创建包装承诺!看起来噩梦给你带来了一个承诺。今天,您正在丢弃一个承诺通过包装它返回的错误。相反 - 只需使用异步函数!
async function visitPage(url, code) {
return Nightmare
.goto(url)
.click('.vote')
.insert('input[name=username]', 'testadmin')
.insert('.test-code-verify', code)
.click('.button.vote.submit')
.wait('.tag.vote.disabled,.validation-error')
.evaluate(() => document.querySelector('.validation -error').innerHTML)
.end();
}
- 您可能不想将此方法的内容包装在“try/catch”中。让承诺流淌:)
async function myBackEndLogic() {
var br = 0, user, proxy, current, agent;
while(br < loops){
current = Math.floor(Math.random() * (maxLoops-br-1));
const response = await visitPage('https://example.com/admin/login',"code")
br++;
}
}
- 当你运行你的方法时——确保包含一个捕获!或者一个然后!否则,您的应用可能会提前退出。
myBackEndLogic()
.then(() => console.log('donesies!'))
.catch(console.error);
我不确定这是否有助于解决您的具体问题,但希望它能让您走上正确的道路:)
推荐阅读
- java - 在 Appium 中动态选择驱动程序类型以编写“混合”测试
- mysql - 汇总每个用户的最新记录
- javascript - Javascript + MEAN堆栈:如何在数组中正确找到“_id”字段(不是“id”)?
- ffmpeg - 如何使用 DISCONTINUITY 标签将 HLS 转换为 RTMP
- jmeter - 无法处理来自请求的动态 cookie 值
- java - 如何在 Java Spring 中实现 ASN1 解码?
- rest - HP ALM 12.50 Rest API 登录返回禁止使用 Postman
- python - 当我使用 spark-submit 运行我的 job.py 时,它总是说文件 'pyspark.zip' 不存在
- mongodb - 索引 MongoDB 中的嵌套字段
- angular - Angular 6 - 设置 HTTP、登录服务、拦截器