/** * 交互冒烟:验证插入面板能打开、能插入区块,封面条存在, * 并记录无法捕获的 promise 拒绝。 */ const fs = require('fs'); const path = require('path'); const puppeteer = require('puppeteer-core'); const CANDIDATES = [ process.env.JIO_BROWSER, 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe', ].filter(Boolean); const BROWSER = CANDIDATES.find((p) => fs.existsSync(p)); const URL = process.argv[2] || 'https://localhost/jio-preview.html'; (async () => { const browser = await puppeteer.launch({ executablePath: BROWSER, headless: 'new', ignoreHTTPSErrors: true, args: ['--disable-gpu', '--no-sandbox'], }); const page = await browser.newPage(); await page.setViewport({ width: 1440, height: 560 }); if (process.env.JIO_USE_WORKTREE_BUILD === '1') { await page.setRequestInterception(true); page.on('request', (request) => { const pathname = new URL(request.url()).pathname; const jsSuffix = '/assets/creator-studio/build/index.js'; const cssSuffix = '/assets/creator-studio/build/index.css'; if (pathname.endsWith(jsSuffix)) { request.respond({ status: 200, contentType: 'application/javascript', body: fs.readFileSync(path.join(__dirname, '../build/index.js')), }); } else if (pathname.endsWith(cssSuffix)) { request.respond({ status: 200, contentType: 'text/css', body: fs.readFileSync(path.join(__dirname, '../build/index.css')), }); } else { request.continue(); } }); } const errors = []; page.on('pageerror', (e) => errors.push('pageerror: ' + e.message)); await page.goto(URL, { waitUntil: 'networkidle2', timeout: 60000 }); await new Promise((r) => setTimeout(r, 2500)); const before = await page.evaluate(() => ({ blocks: document.querySelectorAll('.block-editor-block-list__block').length, hasInsertBtn: !!document.querySelector('.jio-creator__insert'), hasCover: !!document.querySelector('.jio-creator__cover'), toolbarTop: document.querySelector('.jio-creator__bar')?.getBoundingClientRect().top, })); await page.evaluate(() => window.scrollTo(0, 700)); await new Promise((r) => setTimeout(r, 300)); const toolbarAfterScroll = await page.$eval('.jio-creator__bar', (el) => el.getBoundingClientRect().top); console.log('BEFORE ' + JSON.stringify({ ...before, toolbarAfterScroll })); // 打开插入面板 await page.click('.jio-creator__insert'); await new Promise((r) => setTimeout(r, 400)); const panel = await page.evaluate(() => ({ open: !!document.querySelector('.jio-insert__panel'), items: Array.from(document.querySelectorAll('.jio-insert-item__label')).map((n) => n.textContent), })); console.log('PANEL ' + JSON.stringify(panel)); // 插入「标题」区块 const clicked = await page.evaluate(() => { const btn = Array.from(document.querySelectorAll('.jio-insert-item')).find( (b) => (b.textContent || '').includes('标题') ); if (!btn) return false; btn.click(); return true; }); await new Promise((r) => setTimeout(r, 900)); const after = await page.evaluate(() => ({ panelClosed: !document.querySelector('.jio-insert__panel'), blocks: document.querySelectorAll('.block-editor-block-list__block').length, hasHeading: !!document.querySelector('[data-type="core/heading"]'), })); console.log('AFTER ' + JSON.stringify({ clicked, ...after })); await page.screenshot({ path: 'C:/Users/Xing/Desktop/WP-Date/data/wordpress/shot-insert.png' }); if (errors.length) { console.log('--- errors ---'); errors.slice(0, 10).forEach((e) => console.log(e)); } await browser.close(); })();