import puppeteer, { launch, Locator } from 'puppeteer'; // v23.0.0 or later import fs from 'fs'; import { resolve } from 'path'; (async () => { const browser = await launch({ headless: false, }); const page = await browser.newPage(); const timeout = 5000; page.setDefaultTimeout(timeout); { const targetPage = page; await targetPage.goto('https://hlk.meiguanjia.net/#/login'); } { const targetPage = page; await Locator.race([targetPage.locator('input[placeholder="请输入您的手机号码')]) .setTimeout(timeout) .click(); } { const targetPage = page; await Locator.race([targetPage.locator('input[placeholder="请输入您的手机号码')]) .setTimeout(timeout) .fill('17770720274'); } { const targetPage = page; await Locator.race([targetPage.locator('input[placeholder="请输入登录密码')]) .setTimeout(timeout) .click(); } { const targetPage = page; await Locator.race([targetPage.locator('input[placeholder="请输入登录密码')]) .setTimeout(timeout) .fill('a123456'); } { const targetPage = page; await Locator.race([targetPage.locator('#agreement')]) .setTimeout(timeout) .click(); } { const targetPage = page; await Locator.race([targetPage.locator('.login-form-button')]) .setTimeout(timeout) .click(); await new Promise((resolve) => setTimeout(resolve, 3000)); } { const targetPage = page; targetPage.on('console', (msg) => { for (let i = 0; i < msg.args().length; ++i) { console.log(`${msg.args()[i]}`); } }); // 获取浏览器中的 IndexedDB 数据 const result = await page.evaluate(async () => { const databases = await indexedDB.databases(); const allData = []; for (const db of databases) { const databaseName = db.name; // 打开数据库 const request = indexedDB.open(databaseName); const databaseData = await new Promise((resolve, reject) => { request.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction(db.objectStoreNames, 'readonly'); const objectStore = transaction.objectStore(db.objectStoreNames[0]); const cursorRequest = objectStore.openCursor(); const storeData = []; cursorRequest.onsuccess = (event) => { const cursor = event.target.result; if (cursor) { storeData.push({ key: cursor.key, value: cursor.value }); cursor.continue(); } else { resolve(storeData); // 执行 resolve,返回数据 } }; cursorRequest.onerror = (event) => { reject(event.target.error); // 发生错误时 reject }; }; request.onerror = (event) => { reject(event.target.error); // 发生错误时 reject }; }); // 将数据库数据存入 allData allData.push({ databaseName, data: databaseData, }); } return allData; }); const localStorageData = await page.evaluate(() => { return JSON.stringify(localStorage); // 将 localStorage 转换为对象 }); fs.writeFileSync('./indexedDB.json', JSON.stringify(result)); fs.writeFileSync('./localStorage.json', localStorageData); } await browser.close(); })().catch((err) => { console.error(err); process.exit(1); });