.single-column-form{width:100%}.single-column-form .panel{margin:0}.single-column-form .panel-body{padding:20px 24px 32px}.single-column-form .form-grid{display:grid;grid-template-columns:1fr!important;gap:20px}.single-column-form .form-grid>*{grid-column:1!important}.single-column-form .field{max-width:680px;gap:8px}.single-column-form .field>span{font-size:14px}.single-column-form .field input,.single-column-form .field select{height:40px;border-radius:4px;padding:0 12px}.single-column-form .field textarea{min-height:112px;border-radius:4px;padding:10px 12px}.single-column-form .field textarea.small{min-height:88px}.single-column-form .field small{font-size:12px;color:var(--company-muted)}
.domain-select{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center}.domain-select .text-button{margin:0}.domain-add{max-width:520px}.domain-add .button{min-width:88px}.field-assist{display:flex;justify-content:flex-start;margin-top:4px}.field-assist .button{min-width:140px}.form-section-heading{max-width:680px;border-top:1px solid var(--company-border);padding-top:20px;margin-top:4px}.form-section-heading h3{font-size:16px;margin:0 0 4px}.form-section-heading p{margin:0;color:var(--company-muted);font-size:13px}.form-guidance{max-width:680px;padding:12px 14px;background:#f5f8fa;border-left:3px solid var(--company-primary);display:flex;flex-direction:column;gap:5px}.form-guidance span{color:#666;font-size:13px}.save-indicator{color:var(--company-muted);font-size:13px}
.upload{height:96px;border-color:#bfc7cd;background:#fafafa;border-radius:4px}.upload b{font-size:20px}.upload span{font-size:14px}.upload small{font-size:12px}
-.ai-assist-intro{display:flex;gap:14px;padding:16px;background:#f3f8fb;border:1px solid #d9eaf3}.ai-assist-intro>.anticon{font-size:24px;color:var(--company-primary)}.ai-assist-intro h3{font-size:16px;margin:0 0 6px}.ai-assist-intro p{margin:0;color:#666;line-height:1.7}.drawer-actions{display:flex;gap:8px;margin:18px 0}.drawer-actions .button{min-width:120px}
+.ai-assist-intro{display:flex;gap:14px;padding:16px;background:#f3f8fb;border:1px solid #d9eaf3}.ai-assist-intro>.anticon{font-size:24px;color:var(--company-primary)}.ai-assist-intro h3{font-size:16px;margin:0 0 6px}.ai-assist-intro p{margin:0;color:#666;line-height:1.7}.ai-assist-drawer .field>span{font-size:16px;font-weight:500}.drawer-actions{display:flex;gap:8px;margin:18px 0}.drawer-actions .button{min-width:120px}
.result-header{min-height:72px;border:0;border-bottom:1px solid var(--company-border);padding:12px 0;margin:0}.result-header h2{font-size:20px}.result-header .site-icon{border-radius:4px;background:var(--company-primary);color:#fff;border:0;font-size:16px}.result-actions{display:flex;gap:8px}.result-actions .button{min-width:112px}
.kpi-row{border-bottom:1px solid var(--company-border);gap:0;margin:0 0 16px}.kpi-row>div{height:72px;border:0;border-right:1px solid #eee;padding:12px 16px}.kpi-row>div:last-child{border-right:0}.kpi-row span{color:var(--company-muted)}.kpi-row b{font-size:22px}
.result-layout{grid-template-columns:1fr}.result-pages{display:grid;grid-template-columns:1fr;gap:0}.result-pages article{display:grid;grid-template-columns:300px 1fr;min-height:180px;border:0;border-bottom:1px solid var(--company-border);padding:16px 0}.result-pages article>div:last-child{padding:0 20px}.result-pages h3{font-size:16px;margin:14px 0 8px}.result-pages p{font-size:13px;line-height:1.6}.result-pages footer{gap:8px}.result-pages footer .button{min-width:96px;height:32px;margin:0}.dashboard-thumb-live{min-height:160px;border:1px solid var(--company-border);background:#f5f5f5}
import { chromium } from 'playwright';
-
const BASE = 'https://aidemo.istation.cloud/t/stationbuilder';
const browser = await chromium.launch();
const page = await browser.newPage();
-const errors = [];
-page.on('console', m => { if (m.type() === 'error') errors.push(m.text()); });
-page.on('response', r => { if (r.status() >= 400) errors.push('HTTP ' + r.status() + ' ' + r.url()); });
-
await page.goto(BASE + '/?page=basic', { waitUntil: 'networkidle' });
-
-// Open a site first via the list -> need an existing site. Try navigating by clicking first company row.
-// Fallback: directly go to a known route if exists. We'll just click "打开项目" of first row.
const row = page.locator('.company-table tbody tr').first();
-if (await row.count()) {
- await row.click();
- await page.waitForTimeout(800);
- const openBtn = page.getByText('打开项目');
- if (await openBtn.count()) { await openBtn.first().click(); await page.waitForTimeout(1000); }
-}
-
-const leftBefore = await page.locator('.single-column-form').innerText().catch(() => '');
-const leftHasSupplementBefore = leftBefore.includes('补充要求');
-
-// Now ensure we're on basic page: click the AI 智能补全 button
-const aiBtn = page.getByText('AI 智能补全').first();
-await aiBtn.click();
+if (await row.count()) { await row.click(); await page.waitForTimeout(800); const b = page.getByText('打开项目'); if (await b.count()) { await b.first().click(); await page.waitForTimeout(1000); } }
+await page.getByText('AI 智能补全').first().click();
await page.waitForTimeout(800);
-
-const drawerText = await page.locator('.ai-assist-drawer').innerText().catch(() => '');
-const leftHasSupplement = await page.locator('.single-column-form').innerText().then(t => t.includes('补充要求')).catch(() => false);
-
-console.log('DRAWER_HAS_补充要求:', drawerText.includes('补充要求'));
-console.log('DRAWER_HAS_填写建议:', drawerText.includes('填写建议'));
-console.log('DRAWER_HAS_参考资料:', drawerText.includes('参考资料'));
-console.log('DRAWER_HAS_文件上传:', drawerText.includes('上传文件') || drawerText.includes('点击或拖拽'));
-console.log('LEFT_FORM_HAS_补充要求_BEFORE_DRAWER:', leftHasSupplementBefore);
-console.log('LEFT_FORM_HAS_补充要求:', leftHasSupplement);
-console.log('ERRORS:', JSON.stringify(errors.slice(0, 10)));
+const styles = await page.evaluate(() => {
+ const ref = document.querySelector('.form-section-heading h3');
+ const labels = [...document.querySelectorAll('.ai-assist-drawer .field>span')];
+ return {
+ ref: ref ? { fontSize: getComputedStyle(ref).fontSize, fontWeight: getComputedStyle(ref).fontWeight } : null,
+ labels: labels.map(el => ({ text: el.textContent.trim(), fontSize: getComputedStyle(el).fontSize, fontWeight: getComputedStyle(el).fontWeight }))
+ };
+});
+console.log(JSON.stringify(styles, null, 2));
await browser.close();