Playwright-Python点击登录按钮无响应问题求助
问题:Playwright-Python登录按钮点击无响应
我用Playwright-Python编写了自动化登录脚本,目标网站带有reCAPTCHA回调,已完成验证绕过,登录按钮(Sign In)已显示启用状态,但脚本执行点击操作后并未跳转至首页(手动点击该按钮可正常跳转)。尝试在page.click后直接调用page.goto跳转首页,会被强制退回登录页。
自动化脚本
with sync_playwright() as p: browser = p.chromium.launch(headless=False, slow_mo=50) page = browser.new_page() page.goto('https://ctrl.unruly.co/auth/login') page.fill('input[id="email"]', username) page.fill('input[id="password"]',password) result = solveRecaptcha( sitekey=sitekey, url=url ) code = result['code'] page.evaluate(f"""() => {{ var token = '{code}'; var callbackFunction = ___grecaptcha_cfg.clients['0']['F']['F']['callback']; callbackFunction(token); }}""") page.wait_for_selector("button#submit:not([disabled]):not([tabindex])",state='attached') page.screenshot(path="debug_screenshot.png") page.click('button#submit:not([disabled]):not([tabindex])') page.screenshot(path="debug_screenshot2.png")
登录按钮HTML变化
- 启用前:
<button _ngcontent-ng-c3870558994="" nz-button="" nzsize="large" nztype="primary" nzblock="" id="submit" class="ant-btn primary-button ng-tns-c630436078-2 ant-btn-primary ant-btn-lg ant-btn-block" tabindex="-1" disabled="true"><!----><span class="ng-star-inserted"> Sign In </span></button>
- 启用后:
<button _ngcontent-ng-c3870558994="" nz-button="" nzsize="large" nztype="primary" nzblock="" id="submit" class="ant-btn primary-button ng-tns-c630436078-2 ant-btn-primary ant-btn-lg ant-btn-block"><!----><span class="ng-star-inserted"> Sign In </span></button>
解决方案建议
1. 等待按钮完全可交互
当前仅用state='attached'检查元素是否存在于DOM,可替换为更严格的状态判断,确保按钮真正可交互:
# 等待按钮处于启用且可见状态 page.wait_for_selector("button#submit:not([disabled])", state='enabled') # 或者用函数精准判断属性 page.wait_for_function("document.getElementById('submit').disabled === false && !document.getElementById('submit').hasAttribute('tabindex')")
2. 模拟真实用户点击行为
直接调用page.click可能触发反爬检测,试试模拟用户操作流程:
button = page.locator('button#submit:not([disabled])') # 先 hover 再点击,模拟用户行为 button.hover() page.wait_for_timeout(100) # 模拟短暂停留 button.click() # 或者直接触发原生点击事件 button.dispatch_event('click')
3. 确保reCAPTCHA回调完全生效
手动调用reCAPTCHA的callback后,前端可能还有状态未同步,可增加等待或检查验证字段:
page.evaluate(f"""() => {{ var token = '{code}'; var callbackFunction = ___grecaptcha_cfg.clients['0']['F']['F']['callback']; callbackFunction(token); }}""") # 等待验证状态同步 page.wait_for_timeout(500) # 检查reCAPTCHA响应字段是否已填充 page.wait_for_function("document.querySelector('input[name=\"g-recaptcha-response\"]')?.value !== ''")
4. 规避浏览器自动化检测
网站可能通过浏览器特征识别自动化工具,启动浏览器时添加以下配置:
browser = p.chromium.launch( headless=False, slow_mo=50, args=[ '--disable-blink-features=AutomationControlled', '--no-sandbox' ] ) # 设置真实用户代理和视口 context = browser.new_context( viewport={'width': 1280, 'height': 720}, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ) page = context.new_page()
5. 检查点击后的导航状态
点击后等待页面完成导航,同时捕获控制台错误排查问题:
# 等待导航完成 with page.expect_navigation(wait_until='networkidle'): page.click('button#submit:not([disabled])') # 捕获控制台输出,排查是否有前端错误 def handle_console(msg): print(f"[{msg.type}] {msg.text}") page.on('console', handle_console)
内容的提问来源于stack exchange,提问作者Zulkifli Arshad
相关产品推荐
相关产品推荐

