如何在JHipster 7.9.4单体应用中集成Puppeteer?编译问题求助
JHipster 7.9.4 集成浏览器自动化工具的解决方案
错误根源分析
你把Puppeteer代码写在了Angular前端代码中,这是核心问题:
Puppeteer是Node.js环境专属的浏览器自动化工具,它需要直接操作本地浏览器进程,依赖fs、child_process等Node.js核心模块——这些模块在浏览器环境中完全不存在,Webpack 5取消默认polyfill只是表象,本质上浏览器无法提供启动外部进程、访问本地文件的能力,加polyfill也无法解决。
正确集成方案:将自动化逻辑移至后端/独立脚本
方案1:独立Node.js脚本(推荐)
直接写一个独立的Node.js脚本,从MongoDB读取nodes实体数据,执行自动化登录:
- 在项目根目录新建
automation文件夹,创建login-automation.js:
const puppeteer = require('puppeteer'); const { MongoClient } = require('mongodb'); async function autoLoginFromNodes() { // 连接JHipster使用的MongoDB数据库 const client = await MongoClient.connect('mongodb://localhost:27017/myapp'); const db = client.db('myapp'); const nodes = await db.collection('nodes').find().toArray(); // 启动Puppeteer浏览器 const browser = await puppeteer.launch({ headless: 'new' }); for (const node of nodes) { const page = await browser.newPage(); try { await page.goto(node.loginUrl); // 填充登录凭证 await page.type('#username', node.username); await page.type('#password', node.password); await page.click('#login-button'); // 等待登录完成 await page.waitForNavigation({ waitUntil: 'networkidle2' }); console.log(`✅ 成功登录 ${node.loginUrl}`); await page.screenshot({ path: `login-success-${node._id}.png` }); } catch (err) { console.error(`❌ 登录 ${node.loginUrl} 失败:`, err); } finally { await page.close(); } } await browser.close(); await client.close(); } autoLoginFromNodes().catch(console.error);
- 安装依赖(在
automation文件夹下执行):
npm init -y npm install puppeteer mongodb
- 运行脚本:
node login-automation.js
方案2:封装为JHipster后端REST接口
如果需要通过前端触发自动化操作,可以在Java后端中调用Node.js脚本,或者使用Java原生的浏览器自动化工具(如Selenium WebDriver):
- 集成Selenium时,逻辑和Puppeteer一致:从MongoDB读取
nodes数据,驱动浏览器完成登录,无需依赖Node.js环境。
前端端到端测试替代方案
如果你的需求是前端自动化测试,JHipster已经默认集成了Cypress,直接用Cypress编写测试即可,无需引入Puppeteer:
// 在cypress/e2e/login-auto.cy.js中编写测试 describe('自动登录测试', () => { it('从nodes实体获取凭证完成登录', () => { // 调用后端接口获取nodes数据 cy.request('GET', '/api/nodes').then((response) => { const nodes = response.body; nodes.forEach(node => { cy.visit(node.loginUrl); cy.get('#username').type(node.username); cy.get('#password').type(node.password); cy.get('#login-button').click(); // 验证登录成功 cy.url().should('not.include', '/login'); cy.screenshot(`login-success-${node.id}`); }); }); }); });
内容的提问来源于stack exchange,提问作者Khaled Algelowb
相关产品推荐
相关产品推荐

