import sys, time sys.path.insert(0, r'D:\bwstudio\pear-admin-flask') from playwright.sync_api import sync_playwright BASE = 'http://127.0.0.1:5000' def login(page): page.goto(f'{BASE}/system/passport/login', wait_until='networkidle') page.wait_for_selector('input[name="captcha"]') # 用一个新的 context request 取同一个 session 的 captcha —— 因为 page.request 和 page 可能共享 cookie resp = page.request.get(f'{BASE}/system/passport/getCaptcha') code = resp.headers.get('x-captcha-code', '').lower() if not code: raise RuntimeError('no captcha code') # 再强制刷新一遍 login 页上的 captcha 图片,确保 server session code == 这张图绑定的那个 # 因为 server 端 captcha() 会覆写 session['code'] 为最近一张图 page.reload(wait_until='networkidle') page.wait_for_selector('input[name="captcha"]') resp = page.request.get(f'{BASE}/system/passport/getCaptcha') code = resp.headers.get('x-captcha-code', '').lower() print('captcha code =', code) page.fill('input[name="username"]', 'admin') page.fill('input[name="password"]', '123456') page.fill('input[name="captcha"]', code) page.click('button[lay-filter="login"]') # 等待跳转离开 login 页 time.sleep(2) print('after login url =', page.url) with sync_playwright() as pw: browser = pw.chromium.launch(headless=True, args=['--no-sandbox', '--disable-gpu']) ctx = browser.new_context() page = ctx.new_page() msgs = [] page.on('console', lambda m: msgs.append(f'[{m.type}] {m.text}')) page.on('pageerror', lambda e: msgs.append(f'[PAGE-ERR] {e}')) login(page) for menu_path in ['/system/nav/', '/system/friend/', '/system/about/', '/system/stats/']: msgs.clear() page.on('console', lambda m: msgs.append(f'[{m.type}] {m.text}')) page.on('pageerror', lambda e: msgs.append(f'[PAGE-ERR] {e}')) print(f'\n===== Visit {menu_path} =====') page.goto(BASE + menu_path, wait_until='networkidle') time.sleep(2.5) row_count = page.locator('.layui-table tbody tr').count() has_loading = page.locator('.layui-table-init').count() none_elem = page.locator('.layui-table-none').count() empty_text = '' if none_elem: empty_text = page.locator('.layui-table-none').first.inner_text() or '' print(f' rows={row_count}, init={has_loading}, none={none_elem}, none_text={empty_text!r}') out = menu_path.strip('/').replace('/', '_') + '.png' path = 'D:\\bwstudio\\pear-admin-flask\\scripts\\screenshots\\' + out import os os.makedirs(os.path.dirname(path), exist_ok=True) page.screenshot(path=path, full_page=True) print(f' screenshot -> {path}') for m in msgs[-15:]: print(' ', m) browser.close()