const { chromium } = require("playwright-core"); (async () => { const browser = await chromium.launch({ executablePath: "C:/Program Files/Google/Chrome/Application/chrome.exe", args: ["--disable-blink-features=AutomationControlled"], }); const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const errors = []; page.on("console", msg => { if (msg.type() === "error") errors.push(msg.text()); }); page.on("pageerror", err => errors.push(err.message)); const BASE = "http://127.0.0.1:5175"; const loginResp = await page.request.post("http://127.0.0.1:8010/api/auth/login", { data: { phone: "13943441149", password: "Test1234" }, }); const token = (await loginResp.json()).access_token; await page.goto(BASE + "/login", { waitUntil: "networkidle" }); await page.evaluate(t => { localStorage.setItem("token", t); localStorage.setItem("access_token", t); localStorage.setItem("zj_token", t); }, token); // Get existing courseware list const cwResp = await page.request.get("http://127.0.0.1:8010/api/coursewares", { headers: { Authorization: `Bearer ${token}` }, }); const coursewares = await cwResp.json(); console.log("existing coursewares:", coursewares.length); if (coursewares.length > 0) { console.log("first courseware id:", coursewares[0].id, "title:", coursewares[0].title?.substring(0, 30)); } // Navigate to courseware list and check if preview works console.log("\n=== COURSEWARE LIST ==="); await page.goto(BASE + "/courseware", { waitUntil: "networkidle" }); await page.waitForTimeout(2000); // Count cards const cards = await page.$$(".courseware-card, .cw-card, .el-card"); console.log("courseware cards on page:", cards.length); // Check for action buttons const previewBtns = await page.$$("button:has-text('预览'), button:has-text('查看'), a:has-text('预览')"); console.log("preview buttons:", previewBtns.length); // Navigate to first courseware preview if exists if (coursewares.length > 0) { console.log("\n=== COURSEWARE PREVIEW ==="); await page.goto(`${BASE}/courseware/${coursewares[0].id}/preview`, { waitUntil: "networkidle" }); await page.waitForTimeout(3000); // Check if slides rendered const iframes = await page.$$("iframe"); console.log("iframes:", iframes.length); const slideContent = await page.evaluate(() => { const slide = document.querySelector(".slide-container, .preview-slide, .cw-slide"); return slide ? "slide found" : "no slide element"; }); console.log("slide element:", slideContent); // Check page navigation const navBtns = await page.$$(".page-nav, .nav-btn, button:has-text('下一页'), button:has-text('上一页')"); console.log("nav buttons:", navBtns.length); // Take screenshot await page.screenshot({ path: "_cw_preview.png" }); console.log("screenshot saved"); } const realErrors = errors.filter(e => !e.includes("401") && !e.includes("403") && !e.includes("Failed to fetch")); console.log("\nerrors (filtered):", realErrors.length); realErrors.slice(0, 3).forEach(e => console.log(" ", e.substring(0,120))); await browser.close(); })();