"""After login click, observe the page: screenshot + dump new DOM elements. We know now that: - click does trigger a state change (the form submit fires, or geetest starts loading) - but .geetest_canvas_bg selector times out (wrong class) - the original geetest v4 widget uses .geetest_canvas_bg, .geetest_canvas_slice, etc. - 996box may have renamed or wrapped them in a custom container So dump every iframe and every new element with class containing 'geetest' or 'captcha'. """ import asyncio import sys from pathlib import Path _HERE = Path(__file__).resolve().parent sys.path.insert(0, str(_HERE.parent / "src")) from playwright.async_api import async_playwright EDGE = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" URL = "https://pc.hzwlan.com/login/account" async def main(): out = _HERE / "jfbym_diag" async with async_playwright() as p: browser = await p.chromium.launch(executable_path=EDGE, headless=True) ctx = await browser.new_context(viewport={"width": 1366, "height": 768}) page = await ctx.new_page() await page.goto(URL, wait_until="networkidle", timeout=30000) await page.fill("input#username", "longwu988") await page.locator("input#username").press("Tab") await page.fill("input#password", "Longwu1988") await page.locator("input#password").press("Tab") await page.wait_for_timeout(300) await page.locator("button.login-form_box__submit_button").first.click(force=True) # Wait longer for the widget to appear (geetest loads its own assets) await page.wait_for_timeout(8000) await page.screenshot(path=str(out / "a1_after_click_v2.png"), full_page=True) info = await page.evaluate("""() => ({ url: location.href, title: document.title, any_geetest: !!document.querySelector('[class*=geetest]'), any_captcha: !!document.querySelector('[class*=captcha]'), geetest_els: [...document.querySelectorAll('[class*=geetest]')] .slice(0, 15) .map(e => ({tag: e.tagName, cls: e.className.slice(0, 80)})), captcha_els: [...document.querySelectorAll('[class*=captcha]')] .slice(0, 15) .map(e => ({tag: e.tagName, cls: e.className.slice(0, 80)})), iframes: [...document.querySelectorAll('iframe')].map(i => i.src.slice(0, 100)), canvas_count: document.querySelectorAll('canvas').length, canvas_classes: [...document.querySelectorAll('canvas')] .map(c => c.className.slice(0, 80)), })""") print(f"url: {info['url']}") print(f"any_geetest: {info['any_geetest']}, any_captcha: {info['any_captcha']}") print(f"geetest_els: {info['geetest_els']}") print(f"captcha_els: {info['captcha_els']}") print(f"canvases: {info['canvas_count']} {info['canvas_classes']}") print(f"iframes: {info['iframes']}") await browser.close() print(f"\nscreenshot: {out / 'a1_after_click_v2.png'}") asyncio.run(main())