You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:55:58