Files
20260324-42433647/explore.mjs
2026-04-25 21:50:03 +08:00

148 lines
5.1 KiB
JavaScript

/**
* 探索脚本:登录店小秘,截图页面结构
*/
import { chromium } from 'playwright';
import { mkdirSync } from 'fs';
const SCREENSHOTS_DIR = './screenshots';
mkdirSync(SCREENSHOTS_DIR, { recursive: true });
const browser = await chromium.launch({ headless: false }); // 有头模式方便观察
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
locale: 'zh-CN',
});
const page = await context.newPage();
try {
// 1. 打开登录页
console.log('>> 打开店小秘登录页...');
await page.goto('https://www.dianxiaomi.com/home.htm', { waitUntil: 'networkidle', timeout: 30000 });
await page.screenshot({ path: `${SCREENSHOTS_DIR}/01-homepage.png`, fullPage: true });
console.log('>> 截图: 01-homepage.png');
// 打印页面标题
console.log('>> 页面标题:', await page.title());
// 查找登录表单元素
const inputs = await page.$$('input');
for (const input of inputs) {
const type = await input.getAttribute('type');
const name = await input.getAttribute('name');
const placeholder = await input.getAttribute('placeholder');
const id = await input.getAttribute('id');
console.log(` input: type=${type}, name=${name}, id=${id}, placeholder=${placeholder}`);
}
// 查找所有按钮
const buttons = await page.$$('button, input[type="submit"], .btn, a.btn');
for (const btn of buttons) {
const text = await btn.textContent();
const tag = await btn.evaluate(el => el.tagName);
console.log(` button: tag=${tag}, text="${text.trim().substring(0, 50)}"`);
}
// 2. 尝试登录
console.log('\n>> 尝试填写登录信息...');
// 尝试多种可能的选择器
const usernameSelectors = [
'input[name="username"]', 'input[name="userName"]', 'input[name="account"]',
'input[name="loginName"]', 'input[id="username"]', 'input[id="account"]',
'input[placeholder*="账号"]', 'input[placeholder*="用户"]', 'input[placeholder*="手机"]',
'input[type="text"]:first-of-type'
];
const passwordSelectors = [
'input[name="password"]', 'input[name="pwd"]', 'input[type="password"]',
'input[id="password"]', 'input[placeholder*="密码"]'
];
let usernameInput = null;
let passwordInput = null;
for (const sel of usernameSelectors) {
usernameInput = await page.$(sel);
if (usernameInput) {
console.log(` 找到用户名输入框: ${sel}`);
break;
}
}
for (const sel of passwordSelectors) {
passwordInput = await page.$(sel);
if (passwordInput) {
console.log(` 找到密码输入框: ${sel}`);
break;
}
}
if (usernameInput && passwordInput) {
await usernameInput.fill('MiLe-kf01');
await passwordInput.fill('Vxdas@302');
await page.screenshot({ path: `${SCREENSHOTS_DIR}/02-filled-login.png` });
console.log('>> 截图: 02-filled-login.png');
// 查找登录按钮
const loginBtnSelectors = [
'button:has-text("登录")', 'button:has-text("登 录")', 'input[type="submit"]',
'a:has-text("登录")', '.login-btn', '#loginBtn', 'button[type="submit"]'
];
let loginBtn = null;
for (const sel of loginBtnSelectors) {
loginBtn = await page.$(sel);
if (loginBtn) {
console.log(` 找到登录按钮: ${sel}`);
break;
}
}
if (loginBtn) {
await loginBtn.click();
console.log('>> 点击登录...');
// 等待页面跳转或加载
await page.waitForTimeout(5000);
await page.screenshot({ path: `${SCREENSHOTS_DIR}/03-after-login.png`, fullPage: true });
console.log('>> 截图: 03-after-login.png');
console.log('>> 登录后URL:', page.url());
console.log('>> 登录后标题:', await page.title());
// 打印页面上的所有导航链接
console.log('\n>> 页面导航链接:');
const links = await page.$$('a, .menu-item, .nav-item, [class*="menu"], [class*="nav"]');
for (const link of links.slice(0, 50)) {
const text = (await link.textContent()).trim();
const href = await link.getAttribute('href');
if (text && text.length < 30) {
console.log(` link: "${text}" -> ${href || '(no href)'}`);
}
}
// 查找"采购"相关菜单
console.log('\n>> 查找采购/仓库相关元素:');
const purchaseElements = await page.$$('*:has-text("采购"), *:has-text("仓库"), *:has-text("导出")');
for (const el of purchaseElements.slice(0, 20)) {
const tag = await el.evaluate(el => el.tagName);
const text = (await el.textContent()).trim().substring(0, 60);
const className = await el.getAttribute('class');
if (tag === 'A' || tag === 'LI' || tag === 'SPAN' || tag === 'DIV') {
console.log(` ${tag}.${className}: "${text}"`);
}
}
}
} else {
console.log('!! 未找到登录表单,请查看截图 01-homepage.png');
}
} catch (err) {
console.error('错误:', err.message);
await page.screenshot({ path: `${SCREENSHOTS_DIR}/error.png`, fullPage: true });
} finally {
// 保持浏览器打开 30 秒方便观察
console.log('\n>> 浏览器将在 30 秒后关闭...');
await page.waitForTimeout(30000);
await browser.close();
}