Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82920dd8fb | ||
| 82414ef213 | |||
|
|
b9c7b52a4d | ||
|
|
e521f3b028 | ||
|
|
1d4797ece3 | ||
|
|
cc1251eda9 | ||
|
|
427cc0d929 | ||
|
|
1f315fe199 | ||
|
|
b3f96ddddd | ||
|
|
9a9b4646ca |
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@ node_modules/
|
||||
*.png
|
||||
businessData.json
|
||||
data/user.json
|
||||
data/technicianReport.json
|
||||
|
||||
@ -1,24 +1,36 @@
|
||||
import { launch } from 'puppeteer';
|
||||
import fs from 'fs';
|
||||
import 'dotenv/config.js'
|
||||
import { setLocalStorage } from './utils/userUtils.js';
|
||||
import { getDate } from './utils/businessDataUtil.js';
|
||||
import { setMonthTime } from './utils/commnUtils.js'
|
||||
|
||||
(async () => {
|
||||
const browser = await launch({ headless: true, args: [`--window-size=1920,1080`], defaultViewport: { width: 1920, height: 1080 } });
|
||||
const page = await browser.newPage();
|
||||
await page.setViewport({ width: 1920, height: 1080 });
|
||||
|
||||
page.on('response', async(response) => {
|
||||
console.log(response.url());
|
||||
});
|
||||
|
||||
setLocalStorage(page, '.\\data\\user.json');
|
||||
await page.goto('https://dev-dmp.meiguanjia.net/report/businessData');
|
||||
// await page.goto('https://boss.aizhb.net/report/businessData');
|
||||
|
||||
console.log(current);
|
||||
console.log(process.env.ACCOUNT);
|
||||
await page.waitForSelector('.menu-list-second');
|
||||
const childElements = await page.$$('.menu-list-second .menu-list-second-item');
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
await childElements[1].click();
|
||||
const str = await page.evaluate(node => node.textContent.trim(), childElements[1]);
|
||||
console.log(str);
|
||||
|
||||
const item = await page.$eval('.item.cur', node=>node.innerHTML);
|
||||
console.log(item);
|
||||
// const arcoMessage = await page.$eval('.arco-message .arco-message-content', node => node.innerHTML);
|
||||
// await page.screenshot({ path: 'resetPassword.png' });
|
||||
console.log(arcoMessage);
|
||||
const file = './data/businessData.json';
|
||||
|
||||
page.on('console', msg => {
|
||||
console.log('PAGE:', msg.text())
|
||||
})
|
||||
fs.writeFileSync(file, '', 'utf-8');
|
||||
|
||||
await setMonthTime(page, '.arco-picker-start-time', '2024-05');
|
||||
await getDate(page, fs, file);
|
||||
console.log('========');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
30
TechnicianContributionAnalysisSheet.js
Normal file
30
TechnicianContributionAnalysisSheet.js
Normal file
@ -0,0 +1,30 @@
|
||||
import { launch } from 'puppeteer';
|
||||
import fs from 'fs';
|
||||
import 'dotenv/config.js'
|
||||
import { setLocalStorage } from './utils/userUtils.js';
|
||||
import { setMonthTime, getDate, changeTimeDimension } from './utils/commnUtils.js'
|
||||
|
||||
(async () => {
|
||||
const browser = await launch({ headless: false, args: [`--window-size=1920,1080`], defaultViewport: { width: 1920, height: 1080 } });
|
||||
const page = await browser.newPage();
|
||||
setLocalStorage(page, '.\\data\\user.json');
|
||||
await page.goto('https://dev-dmp.meiguanjia.net/report/technicianReport');
|
||||
// await page.goto('https://boss.aizhb.net/report/businessData');
|
||||
|
||||
await page.waitForSelector('.menu-list-second');
|
||||
const childElements = await page.$$('.menu-list-second .menu-list-second-item');
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
await childElements[2].click();
|
||||
const str = await page.evaluate(node => node.textContent.trim(), childElements[2]);
|
||||
console.log(str);
|
||||
|
||||
const file = './data/technicianReport.json';
|
||||
|
||||
fs.writeFileSync(file, '', 'utf-8');
|
||||
|
||||
await changeTimeDimension(page, 2);
|
||||
await setMonthTime(page, '.arco-picker-start-time', '2024-05');
|
||||
await getDate(page, fs, file);
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
3670
allData.json
Normal file
3670
allData.json
Normal file
File diff suppressed because it is too large
Load Diff
1
cookie.json
Normal file
1
cookie.json
Normal file
@ -0,0 +1 @@
|
||||
[{"name":"JSESSIONID","value":"9E55F1720F56A71F1C1DDE22ECE125EA","domain":"hlk.meiguanjia.net","path":"/","expires":-1,"size":42,"httpOnly":true,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure"}]
|
||||
20
example2.js
20
example2.js
@ -2,10 +2,11 @@ import { launch } from 'puppeteer';
|
||||
import fs from 'fs';
|
||||
import 'dotenv/config.js'
|
||||
import { setLocalStorage } from './utils/userUtils.js';
|
||||
import { getDate, cleanType, changeTimeDimension } from './utils/businessDataUtil.js';
|
||||
import { getDate } from './utils/businessDataUtil.js';
|
||||
import { setMonthTime } from './utils/commnUtils.js'
|
||||
|
||||
(async () => {
|
||||
const browser = await launch({ headless: false, args: [`--window-size=1920,1080`], defaultViewport: { width: 1920, height: 1080 } });
|
||||
const browser = await launch({ headless: true, args: [`--window-size=1920,1080`], defaultViewport: { width: 1920, height: 1080 } });
|
||||
const page = await browser.newPage();
|
||||
setLocalStorage(page, '.\\data\\user.json');
|
||||
await page.goto('https://dev-dmp.meiguanjia.net/report/businessData');
|
||||
@ -18,24 +19,11 @@ import { getDate, cleanType, changeTimeDimension } from './utils/businessDataUti
|
||||
const str = await page.evaluate(node => node.textContent.trim(), childElements[1]);
|
||||
console.log(str);
|
||||
|
||||
await changeTimeDimension(page, '周报');
|
||||
|
||||
const file = './data/businessData.json';
|
||||
|
||||
fs.writeFileSync(file, '', 'utf-8');
|
||||
|
||||
await getDate(page, fs, file);
|
||||
console.log('========');
|
||||
|
||||
await cleanType(page, '.arco-picker-start-time', '2024-06');
|
||||
await getDate(page, fs, file);
|
||||
console.log('========');
|
||||
|
||||
await cleanType(page, '.arco-picker-start-time', '2024-05');
|
||||
await getDate(page, fs, file);
|
||||
console.log('========');
|
||||
|
||||
await cleanType(page, '.arco-picker-start-time', '2024-04');
|
||||
await setMonthTime(page, '.arco-picker-start-time', '2024-05');
|
||||
await getDate(page, fs, file);
|
||||
console.log('========');
|
||||
|
||||
|
||||
135
hlk.spec.js
Normal file
135
hlk.spec.js
Normal file
@ -0,0 +1,135 @@
|
||||
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);
|
||||
});
|
||||
1
indexedDB.json
Normal file
1
indexedDB.json
Normal file
File diff suppressed because one or more lines are too long
1
localStorage.json
Normal file
1
localStorage.json
Normal file
File diff suppressed because one or more lines are too long
110
sethlk.spec.js
Normal file
110
sethlk.spec.js
Normal file
@ -0,0 +1,110 @@
|
||||
import puppeteer from 'puppeteer';
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
(async () => {
|
||||
// 读取 JSON 文件
|
||||
const jsonData = JSON.parse(readFileSync('indexedDB.json', 'utf8'));
|
||||
|
||||
const browser = await puppeteer.launch({ headless: false });
|
||||
|
||||
// 获取当前的页面,通常是浏览器启动后的默认页面
|
||||
const [page] = await browser.pages();
|
||||
|
||||
// 打开目标网页
|
||||
await page.goto('https://hlk.meiguanjia.net'); // 替换为你的目标 URL
|
||||
|
||||
const localStorageData = JSON.parse(readFileSync('localStorage.json', 'utf8'));
|
||||
await page.evaluate((data) => {
|
||||
for (const key in data) {
|
||||
localStorage.setItem(key, data[key]);
|
||||
}
|
||||
}, localStorageData);
|
||||
console.log('set localStorage success');
|
||||
|
||||
await page.evaluate((jsonData) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 使用 async 函数来处理异步操作
|
||||
const processDatabase = async (database) => {
|
||||
try {
|
||||
// 打开 IndexedDB 数据库
|
||||
const openRequest = indexedDB.open(database.databaseName, 2);
|
||||
|
||||
// 处理数据库版本升级
|
||||
openRequest.onupgradeneeded = (event) => {
|
||||
const db = event.target.result;
|
||||
// 创建对象存储,如果不存在的话
|
||||
if (!db.objectStoreNames.contains('keyvaluepairs')) {
|
||||
db.createObjectStore('keyvaluepairs');
|
||||
}
|
||||
if (!db.objectStoreNames.contains('local-forage-detect-blob-support')) {
|
||||
db.createObjectStore('local-forage-detect-blob-support');
|
||||
}
|
||||
};
|
||||
|
||||
// 处理数据库打开成功
|
||||
openRequest.onsuccess = async (event) => {
|
||||
const db = event.target.result;
|
||||
const table = database.data;
|
||||
const transaction = db.transaction(['keyvaluepairs'], 'readwrite');
|
||||
const objectStore = transaction.objectStore('keyvaluepairs'); // 使用硬编码的存储名
|
||||
console.log(table.value);
|
||||
|
||||
let completedOperations = 0;
|
||||
const totalOperations = table.length;
|
||||
|
||||
// 使用 Promise.all 来确保所有的写入操作完成
|
||||
const writeOperations = table.map((item, index) => {
|
||||
return new Promise((innerResolve, innerReject) => {
|
||||
const addObject = objectStore.put(item.value, item.key);
|
||||
addObject.onsuccess = () => {
|
||||
console.log('数据添加成功', item.key);
|
||||
completedOperations++;
|
||||
// 如果所有操作完成,调用 resolve
|
||||
if (completedOperations === totalOperations) {
|
||||
innerResolve('数据写入成功');
|
||||
}
|
||||
};
|
||||
addObject.onerror = (event) => {
|
||||
console.error('数据添加失败:', event.target.error);
|
||||
innerReject('数据添加失败');
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// 等待所有写入操作完成
|
||||
try {
|
||||
await Promise.all(writeOperations);
|
||||
console.log('所有数据写入完成');
|
||||
resolve('所有数据写入完成');
|
||||
} catch (error) {
|
||||
reject('数据写入失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 错误处理
|
||||
openRequest.onerror = (event) => {
|
||||
console.error('数据库打开失败:', event.target.error);
|
||||
reject('数据库打开失败');
|
||||
};
|
||||
} catch (error) {
|
||||
reject('数据库操作失败: ' + error);
|
||||
}
|
||||
};
|
||||
|
||||
// 遍历所有数据库
|
||||
Promise.all(jsonData.map((database) => processDatabase(database)))
|
||||
.then(() => resolve('所有数据库操作完成'))
|
||||
.catch((error) => reject('操作失败: ' + error));
|
||||
});
|
||||
}, jsonData); // 将 jsonData 传递到浏览器上下文中
|
||||
|
||||
console.log('end');
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 2000));
|
||||
|
||||
await page.goto('https://hlk.meiguanjia.net');
|
||||
|
||||
// await
|
||||
|
||||
// await browser.close();
|
||||
})();
|
||||
85
testhlk.spec.js
Normal file
85
testhlk.spec.js
Normal file
@ -0,0 +1,85 @@
|
||||
import puppeteer, { launch, Locator } from 'puppeteer'; // v23.0.0 or later
|
||||
import fs from 'fs';
|
||||
import { resolve } from 'path';
|
||||
import { writeIndexedDB, readIndexedDB } from './utils.js';
|
||||
|
||||
(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 (readIndexedDBFnString) => {
|
||||
// 使用 eval() 执行传入的函数代码
|
||||
eval(readIndexedDBFnString);
|
||||
return await readIndexedDB();
|
||||
// const readIndexedDBFn = new Function('return ' + readIndexedDBFnString)();
|
||||
// return await readIndexedDBFn();
|
||||
// 调用传入的函数并等待其返回结果
|
||||
}, readIndexedDB.toString());
|
||||
|
||||
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);
|
||||
});
|
||||
125
utils.js
Normal file
125
utils.js
Normal file
@ -0,0 +1,125 @@
|
||||
export async function readIndexedDB() {
|
||||
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;
|
||||
}
|
||||
|
||||
export async function writeIndexedDB(jsonData) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 使用 async 函数来处理异步操作
|
||||
const processDatabase = async (database) => {
|
||||
try {
|
||||
// 打开 IndexedDB 数据库
|
||||
const openRequest = indexedDB.open(database.databaseName, 2);
|
||||
|
||||
// 处理数据库版本升级
|
||||
openRequest.onupgradeneeded = (event) => {
|
||||
const db = event.target.result;
|
||||
// 创建对象存储,如果不存在的话
|
||||
if (!db.objectStoreNames.contains('keyvaluepairs')) {
|
||||
db.createObjectStore('keyvaluepairs');
|
||||
}
|
||||
if (!db.objectStoreNames.contains('local-forage-detect-blob-support')) {
|
||||
db.createObjectStore('local-forage-detect-blob-support');
|
||||
}
|
||||
};
|
||||
|
||||
// 处理数据库打开成功
|
||||
openRequest.onsuccess = async (event) => {
|
||||
const db = event.target.result;
|
||||
const table = database.data;
|
||||
const transaction = db.transaction(['keyvaluepairs'], 'readwrite');
|
||||
const objectStore = transaction.objectStore('keyvaluepairs'); // 使用硬编码的存储名
|
||||
console.log(table.value);
|
||||
|
||||
let completedOperations = 0;
|
||||
const totalOperations = table.length;
|
||||
|
||||
// 使用 Promise.all 来确保所有的写入操作完成
|
||||
const writeOperations = table.map((item, index) => {
|
||||
return new Promise((innerResolve, innerReject) => {
|
||||
const addObject = objectStore.put(item.value, item.key);
|
||||
addObject.onsuccess = () => {
|
||||
console.log('数据添加成功', item.key);
|
||||
completedOperations++;
|
||||
// 如果所有操作完成,调用 resolve
|
||||
if (completedOperations === totalOperations) {
|
||||
innerResolve('数据写入成功');
|
||||
}
|
||||
};
|
||||
addObject.onerror = (event) => {
|
||||
console.error('数据添加失败:', event.target.error);
|
||||
innerReject('数据添加失败');
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// 等待所有写入操作完成
|
||||
try {
|
||||
await Promise.all(writeOperations);
|
||||
console.log('所有数据写入完成');
|
||||
resolve('所有数据写入完成');
|
||||
} catch (error) {
|
||||
reject('数据写入失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 错误处理
|
||||
openRequest.onerror = (event) => {
|
||||
console.error('数据库打开失败:', event.target.error);
|
||||
reject('数据库打开失败');
|
||||
};
|
||||
} catch (error) {
|
||||
reject('数据库操作失败: ' + error);
|
||||
}
|
||||
};
|
||||
|
||||
// 遍历所有数据库
|
||||
Promise.all(jsonData.map((database) => processDatabase(database)))
|
||||
.then(() => resolve('所有数据库操作完成'))
|
||||
.catch((error) => reject('操作失败: ' + error));
|
||||
});
|
||||
}
|
||||
@ -1,55 +1,54 @@
|
||||
/**
|
||||
*
|
||||
* @param {Page} page
|
||||
* @param {fs} fs
|
||||
* @param {String} file 存储文件位置
|
||||
*/
|
||||
export async function getDate(page, fs, file) {
|
||||
const its = new Map();
|
||||
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
await page.waitForSelector('.ai_custome');
|
||||
const aiCustome = await page.$$('.ai_custome .ai_custome_item .amount');
|
||||
let ai = new Set();
|
||||
for (const e of aiCustome) {
|
||||
let str = await page.evaluate(element => element.textContent, e);
|
||||
ai.add(str);
|
||||
}
|
||||
const aiCustome = await page.$$('.ai_custome .ai_custome_item');
|
||||
|
||||
let importStorage = '\n' + JSON.stringify(Array.from(ai), null, 2) + '\n';
|
||||
fs.appendFileSync(file, importStorage, 'utf-8');
|
||||
if (aiCustome.length > 0) {
|
||||
for (const iterator of aiCustome) {
|
||||
const key = await iterator.$('span');
|
||||
const value = await iterator.$('div');
|
||||
const keyStr = await page.evaluate(element => element.textContent.trim(), key);
|
||||
const valueStr = await page.evaluate(element => element.textContent.trim(), value);
|
||||
its.set(keyStr, valueStr);
|
||||
}
|
||||
} else {
|
||||
console.log('.ai_custome_item not found');
|
||||
}
|
||||
|
||||
const elementHandle = await page.waitForSelector('.bi_warp iframe');
|
||||
const frame = await elementHandle.contentFrame();
|
||||
await frame.waitForSelector('#label-content');
|
||||
const items = await frame.$$('#label-content'); // Use $$ to get all matching elements
|
||||
let its = new Set();
|
||||
if (items.length > 0) { // Check if items array is not empty
|
||||
const items = await frame.$$('#label-content');
|
||||
|
||||
if (items.length > 0) {
|
||||
for (const e of items) {
|
||||
let str = await frame.evaluate(element => element.textContent, e); // Use frame.evaluate() here
|
||||
its.add(str.replace(/\s+/g, ' '));
|
||||
const key = await e.$('span p');
|
||||
const value = await e.$('span span');
|
||||
const keyStr = await frame.evaluate(element => element.textContent.trim(), key);
|
||||
const valueStr = await frame.evaluate(element => element.textContent.trim(), value);
|
||||
|
||||
its.set(keyStr, valueStr);
|
||||
}
|
||||
} else {
|
||||
console.log('#label-content not found in the iframe');
|
||||
}
|
||||
|
||||
importStorage = JSON.stringify(Array.from(its), null, 2) + '\n';
|
||||
fs.appendFileSync(file, importStorage, 'utf-8');
|
||||
}
|
||||
const convert = {};
|
||||
|
||||
export async function cleanType(page, element, timeContent) {
|
||||
const time = await page.$(element);
|
||||
await time.click({ clickCount: 3 });
|
||||
await time.type(timeContent, { delay: 100 });
|
||||
}
|
||||
|
||||
export async function changeTimeDimension(page, timeDimension) {
|
||||
let rb = await page.$('.arco-space-item .arco-select-view-value');
|
||||
let s = await page.evaluate(node => node.textContent.trim(), rb);
|
||||
console.log(s);
|
||||
|
||||
await rb.click();
|
||||
const timeMap = new Map();
|
||||
rb = await page.$$('.arco-select-dropdown-list .arco-select-option');
|
||||
for (const iterator of rb) {
|
||||
s = await page.evaluate(node => node.textContent.trim(), iterator)
|
||||
console.log(s);
|
||||
timeMap.set(s, iterator);
|
||||
for (const [key, value] of its) {
|
||||
convert[key] = value;
|
||||
}
|
||||
console.log('===');
|
||||
console.log(timeMap);
|
||||
|
||||
await timeMap.get(timeDimension).click();
|
||||
console.log(convert);
|
||||
|
||||
const importStorage = JSON.stringify(convert, null, 2);
|
||||
fs.appendFileSync(file, importStorage, 'utf-8');
|
||||
}
|
||||
80
utils/commnUtils.js
Normal file
80
utils/commnUtils.js
Normal file
@ -0,0 +1,80 @@
|
||||
/**
|
||||
* 设置月报时间
|
||||
* @param {Page} page
|
||||
* @param {String} element
|
||||
* @param {String} timeContent
|
||||
*/
|
||||
export async function setMonthTime(page, element, timeContent) {
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
const time = await page.$(element);
|
||||
await time.click({ clickCount: 3 });
|
||||
await time.type(timeContent, { delay: 100 });
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Page} page
|
||||
* @param {Number} dismensionNumber
|
||||
*/
|
||||
export async function changeTimeDimension(page, dismensionNumber) {
|
||||
const timeDimension = [
|
||||
'日报',
|
||||
'周报',
|
||||
'月报',
|
||||
'自定义'
|
||||
];
|
||||
|
||||
let rb = await page.$('.arco-space-item .arco-select-view-value');
|
||||
let s = await page.evaluate(node => node.textContent.trim(), rb);
|
||||
|
||||
await rb.click();
|
||||
const timeMap = new Map();
|
||||
rb = await page.$$('.arco-select-dropdown-list .arco-select-option');
|
||||
for (const iterator of rb) {
|
||||
s = await page.evaluate(node => node.textContent.trim(), iterator)
|
||||
timeMap.set(s, iterator);
|
||||
}
|
||||
console.log(timeDimension[dismensionNumber]);
|
||||
await timeMap.get(timeDimension[dismensionNumber]).click();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Page} page
|
||||
* @param {fs} fs
|
||||
* @param {String} file 存储文件位置
|
||||
*/
|
||||
export async function getDate(page, fs, file) {
|
||||
const its = new Map();
|
||||
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
|
||||
const elementHandle = await page.waitForSelector('.bi_warp iframe');
|
||||
const frame = await elementHandle.contentFrame();
|
||||
await frame.waitForSelector('#label-content');
|
||||
const items = await frame.$$('#label-content');
|
||||
|
||||
if (items.length > 0) {
|
||||
for (const e of items) {
|
||||
const key = await e.$('span p');
|
||||
const value = await e.$('span span');
|
||||
const keyStr = await frame.evaluate(element => element.textContent.trim(), key);
|
||||
const valueStr = await frame.evaluate(element => element.textContent.trim(), value);
|
||||
|
||||
its.set(keyStr, valueStr);
|
||||
}
|
||||
} else {
|
||||
console.log('#label-content not found in the iframe');
|
||||
}
|
||||
|
||||
const convert = {};
|
||||
|
||||
for (const [key, value] of its) {
|
||||
convert[key] = value;
|
||||
}
|
||||
|
||||
console.log(convert);
|
||||
|
||||
const importStorage = JSON.stringify(convert, null, 2);
|
||||
fs.appendFileSync(file, importStorage, 'utf-8');
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user