79 lines
1.8 KiB
JavaScript
79 lines
1.8 KiB
JavaScript
const automator = require('miniprogram-automator');
|
|
|
|
let sharedInstance = null;
|
|
let connectPromise = null;
|
|
|
|
/**
|
|
* 连接小程序自动化实例(使用共享单例,避免多个套件重复启动)
|
|
* @returns {Promise<import('miniprogram-automator').MiniProgram>}
|
|
*/
|
|
async function connectMiniProgram() {
|
|
if (sharedInstance) {
|
|
return sharedInstance;
|
|
}
|
|
|
|
if (connectPromise) {
|
|
return connectPromise;
|
|
}
|
|
|
|
const port = global.DEVTOOLS_PORT || 63956;
|
|
|
|
connectPromise = (async () => {
|
|
console.log('连接小程序自动化...');
|
|
console.log(' 端口:', port);
|
|
|
|
const mp = await automator.connect({
|
|
wsEndpoint: `ws://127.0.0.1:${port}`
|
|
});
|
|
|
|
sharedInstance = mp;
|
|
console.log('连接小程序自动化成功');
|
|
return mp;
|
|
})();
|
|
|
|
try {
|
|
return await connectPromise;
|
|
} catch (error) {
|
|
connectPromise = null;
|
|
sharedInstance = null;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 断开小程序自动化连接(仅在全局 teardown 时使用)
|
|
*/
|
|
async function disconnectMiniProgram() {
|
|
if (sharedInstance) {
|
|
try {
|
|
await sharedInstance.close();
|
|
} catch (_) {
|
|
// 忽略关闭错误
|
|
}
|
|
sharedInstance = null;
|
|
connectPromise = null;
|
|
console.log('小程序自动化已断开');
|
|
}
|
|
}
|
|
|
|
async function waitForText(miniProgram, text, timeout = 10000) {
|
|
const startTime = Date.now();
|
|
while (Date.now() - startTime < timeout) {
|
|
const page = await miniProgram.currentPage();
|
|
const content = await page.data();
|
|
if (JSON.stringify(content).includes(text)) {
|
|
return true;
|
|
}
|
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
module.exports = {
|
|
connectMiniProgram,
|
|
disconnectMiniProgram,
|
|
launchMiniProgram: connectMiniProgram, // 兼容旧引用名
|
|
closeMiniProgram: disconnectMiniProgram, // 兼容旧引用名
|
|
waitForText
|
|
};
|