# -*- coding: utf-8 -*- """票 13 快验:工商联想 NO_HIT / 导入过滤 / POOL-CFG 占位卡 / P3-3 / D-G1 注记""" import io, json, sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') from playwright.sync_api import sync_playwright URL = 'file:///E:/code/crm-backend-matt/.scratch/customer-demo-ref/demo/index.html' errors = [] out = {} with sync_playwright() as p: b = p.chromium.launch() pg = b.new_page(viewport={'width': 1720, 'height': 1080}) pg.on('pageerror', lambda e: errors.append(str(e))) pg.goto(URL) pg.wait_for_timeout(600) pg.fill('#uidInput', '739564171091247104') pg.evaluate('loginByUid()') pg.wait_for_timeout(2500) out['token'] = pg.evaluate('!!localStorage.getItem("e2c_token")') # 1) 工商联想 NO_HIT(#24 真请求:stub 恒空数组) out['lookup_raw'] = pg.evaluate('''async () => { const arr = await api('/api/customer/company-lookup?companyName=' + encodeURIComponent('恒信达')); return Array.isArray(arr) ? arr : ('type=' + typeof arr); }''') pg.evaluate('dlgCreate()') pg.wait_for_timeout(200) pg.fill('#cLk', '恒信达') pg.evaluate('doLookup()') pg.wait_for_timeout(1200) out['lookup_no_hit'] = pg.eval_on_selector('#cOut', 'e => e.textContent.includes("未查询到匹配企业")') out['lookup_stub_note'] = pg.eval_on_selector_all('#cOut [data-defect="STUB-LOOKUP"]', 'els => els.length') pg.keyboard.press('Escape') pg.wait_for_timeout(200) # 2) 导入任务过滤(#63 真请求) pg.click('nav.tabs button[data-tab="import"]') pg.evaluate('loadImportPage()') pg.wait_for_timeout(1200) out['imp_all'] = pg.eval_on_selector_all('#impBody tr', 'els => els.length') pg.select_option('#impFStatus', '2') pg.wait_for_timeout(1200) out['imp_status2_rows'] = pg.evaluate('''() => { const trs = [...document.querySelectorAll('#impBody tr')]; return { n: trs.length, allDone: trs.every(tr => tr.textContent.includes('已完成') || tr.textContent.includes('暂无')) }; }''') pg.select_option('#impFStatus', '') pg.select_option('#impFMode', 'UPSERT') pg.wait_for_timeout(1200) out['imp_mode_upsert'] = pg.evaluate('''() => { const trs = [...document.querySelectorAll('#impBody tr')]; return { n: trs.length, allUpsert: trs.every(tr => tr.textContent.includes('UPSERT') || tr.textContent.includes('暂无')) }; }''') out['p3_3_note'] = pg.eval_on_selector_all('#tab-import [data-defect="P3-3"]', 'els => els.length') # 3) POOL-CFG 占位卡(设置页) pg.click('nav.tabs button[data-tab="settings"]') pg.wait_for_timeout(200) out['pool_cfg'] = pg.eval_on_selector_all('#tab-settings [data-defect="POOL-CFG"]', 'els => els.length') out['pool_disabled'] = pg.evaluate('''() => { const inputs = [...document.querySelectorAll('#tab-settings [data-defect="POOL-CFG"]')]; const panel = inputs[0] ? inputs[0].closest('.panel') : null; return panel ? [...panel.querySelectorAll('input')].every(i => i.disabled && i.readOnly) : false; }''') # 4) D-G1 注记(详情页签联系人工具栏) pg.click('nav.tabs button[data-tab="detail"]') pg.wait_for_timeout(200) out['dg1_note'] = pg.eval_on_selector_all('[data-defect="D-G1"]', 'els => els.length') # 5) F6 stub 钩子(列表 tab) pg.click('nav.tabs button[data-tab="list"]') pg.wait_for_timeout(200) out['f6_stub_hook'] = pg.eval_on_selector_all('[data-defect="STUB-LOOKUP"]', 'els => els.length') pg.screenshot(path='E:/code/crm-backend-matt/.scratch/customer-demo-ref/demo/shots/t13-quick-settings.png') b.close() out['pageerror'] = errors print(json.dumps(out, ensure_ascii=False, indent=1))