import { launch, Locator } from 'puppeteer'; // v23.0.0 or later import fs from 'fs'; (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(`${i}: ${msg.args()[i]}`); } }); const allData = await targetPage.evaluate(() => { return new Promise((resolve, reject) => { // 获取所有数据库列表 indexedDB .databases() .then((databases) => { const allDatabasesData = []; // 遍历所有数据库 const dbPromises = databases.map((db) => { return new Promise((dbResolve, dbReject) => { const request = indexedDB.open(db.name); request.onsuccess = () => { const database = request.result; const transaction = database.transaction(database.objectStoreNames, 'readonly'); const dbData = { name: db.name, stores: {} }; // 遍历数据库中的每个对象存储 for (let storeName of database.objectStoreNames) { const storeData = []; const store = transaction.objectStore(storeName); const cursorRequest = store.openCursor(); cursorRequest.onsuccess = (event) => { const cursor = event.target.result; if (cursor) { storeData.push(cursor.value); cursor.continue(); } else { // 当遍历完所有数据时,将数据保存到 dbData 中 dbData.stores[storeName] = storeData; if ( Object.keys(dbData.stores).length === database.objectStoreNames.length ) { // 完成一个数据库的所有对象存储数据 dbResolve(dbData); } } }; cursorRequest.onerror = (error) => { dbReject(error); }; } }; request.onerror = (error) => { dbReject(error); }; }); }); // 等待所有数据库的数据获取完成 Promise.all(dbPromises) .then((results) => { resolve(results); }) .catch(reject); }) .catch(reject); }); }); fs.writeFileSync('allData.json', JSON.stringify(allData, null, 2)); // console.log(allData[0].stores.keyvaluepairs); // 打印所有数据库的数据 } // await browser.close(); })().catch((err) => { console.error(err); process.exit(1); });