const assert = require('node:assert/strict') const path = require('node:path') const { chromium } = require('/Users/macclaw/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright') module.exports = async function contentBrowser(auth, directory, map) { const browser = await chromium.launch({ headless: true, channel: 'chrome' }) let page const errors=[] try { const context=await browser.newContext({viewport:{width:1440,height:1000}}) await context.addInitScript(a=>{ for(const [key,value] of Object.entries({weknora_user:JSON.stringify({...a.user,tenant_id:String(a.user.tenant_id)}),weknora_tenant:JSON.stringify({...a.active_tenant,id:String(a.active_tenant.id)}),weknora_token:a.token,weknora_refresh_token:a.refresh_token,weknora_memberships:JSON.stringify(a.memberships)})) localStorage.setItem(key,value) },auth) page=await context.newPage() page.on('pageerror',error=>errors.push(error.message)) await page.goto(`http://127.0.0.1:15173/platform/training-maps?resource=${map.id}`) await page.locator('.guide__close').click() const status=page.locator('.generation-status').first() const waitDone=()=>status.getByText('已完成',{exact:true}).first().waitFor({timeout:30000}) await page.getByRole('button',{name:'全屏查看',exact:true}).click() const preview=page.locator('.t-dialog:visible') await preview.getByRole('button',{name:'批改方案',exact:true}).last().click() const advice=page.locator('.t-dialog:visible').filter({hasText:'第 2 天的方案批改建议'}) await advice.locator('textarea').fill('保持第一天的先修关系,第二天补充练习框架。') await advice.getByRole('button',{name:'提交给 AI 修改',exact:true}).click() await status.locator('.t-progress').waitFor() await page.reload() await waitDone() await page.getByRole('button',{name:'确认方案',exact:true}).click() await page.getByRole('button',{name:'方案已确认',exact:true}).waitFor({timeout:30000}) const day2=page.locator('.t-collapse-panel').filter({hasText:'第 2 天 · 实际应用'}) await day2.getByRole('button',{name:'生成每日框架',exact:true}).click() await day2.getByRole('button',{name:'重新生成每日框架',exact:true}).waitFor({timeout:30000}) await waitDone() await page.screenshot({path:path.join(directory,'training-map-desktop.png')}) await page.getByRole('button',{name:'全屏查看',exact:true}).click() await page.locator('.t-dialog:visible').getByText('判断依据',{exact:false}).first().waitFor() await page.screenshot({path:path.join(directory,'training-map-preview.png')}) await page.keyboard.press('Escape') await page.setViewportSize({width:390,height:844}) await page.screenshot({path:path.join(directory,'training-map-mobile.png')}) assert.ok(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+2),'Training map page overflows mobile') assert.deepEqual(errors,[],'Browser JavaScript errors') return '导图真实浏览器全屏批改、刷新恢复任务、确认及第二天框架生成;桌面/手机截图' } catch(error) { if(page) await page.screenshot({path:path.join(directory,'training-map-browser-failure.png')}) throw error } finally { await browser.close() } }