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

使用Selenium登录Twitter失败:凭证验证通过但无法跳转首页

Selenium登录Twitter后无法跳转首页的问题分析

问题描述

使用Selenium登录Twitter时,输入有效凭证后系统完成验证,但页面始终停留在登录流程页(https://twitter.com/i/flow/login),无法跳转到首页。

核心登录代码

email = 'twitter_email'
username = 'twitter_username'
password = 'twitter_password'
try:
    login_button = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'a[data-testid = loginButton]')))
    login_button.click()

    if driver.current_url == login_url:
        print('Login Page')
    else:
        print(f'Still at {base_url}')

    username_field = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[autocomplete = username]')))
    username_field.send_keys(username, Keys.RETURN)
    print('Username is valid')
    password_field = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[type = password]')))
    password_field.send_keys(password, Keys.RETURN)
    print('Password is valid')

    if wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[data-testid = ocfEnterTextTextInput]'))):
        email_field = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[data-testid = ocfEnterTextTextInput]')))
        email_field.send_keys(email, Keys.RETURN)
        print('Email verified')
    else:
        print('Email verification not required')

    # wait.until(lambda driver: driver.current_url != login_url)
    if driver.current_url == home_url:
        print('Logged in successfully!')
    else:
        print(f"Login failed! Current page: {driver.current_url}")

except TimeoutException:
    print('Login Failed due to timeout!')

执行输出

Login Page
Username is valid
Password is valid
Email verified
Login failed! Current page: https://twitter.com/i/flow/login

URL定义代码

base_url = 'https://twitter.com/'
login_element = 'i/flow/login'
home_element = 'home'
search_query = 'Random Query'
login_url = base_url + login_element
home_url = base_url + home_element
driver = gs.Chrome()
driver.get(base_url)
wait = WebDriverWait(driver, 30)

代码中的问题及改进方案

  • 缺少页面跳转的等待逻辑:完成邮箱验证后直接判断URL,此时页面可能还在跳转过程中,拿到的仍是旧URL。应启用注释掉的等待逻辑,甚至优化为等待首页标志性元素出现(比如首页时间线元素By.CSS_SELECTOR, 'div[data-testid="HomeTimeline"]'),比单纯判断URL更可靠:

    # 等待跳转到非登录页,或直接等待首页元素
    wait.until(lambda driver: not login_url in driver.current_url)
    # 或者
    wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="HomeTimeline"]')))
    
  • 凭证提交方式不稳定:使用Keys.RETURN提交凭证可能触发未预期的页面行为,Twitter登录流程中每个步骤都有对应的提交按钮(如输入用户名后的"Next"按钮、输入密码后的"Login"按钮),优先点击按钮提交更稳定:

    # 输入用户名后点击Next按钮
    username_field.send_keys(username)
    next_button = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="ocfNextButton"]')))
    next_button.click()
    # 输入密码后点击Login按钮
    password_field.send_keys(password)
    login_submit_button = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="LoginForm_Login_Button"]')))
    login_submit_button.click()
    
  • URL判断逻辑不准确:定义的home_url为https://twitter.com/home,但实际登录后可能直接跳转到https://twitter.com/(不带home后缀),直接判断URL完全相等会导致误判。可改为判断URL是否包含主域名且不包含登录流程路径:

    if base_url in driver.current_url and login_element not in driver.current_url:
        print('Logged in successfully!')
    
  • 邮箱验证的判断逻辑错误:wait.until(ec.presence_of_element_located(...))会等待元素出现,若元素不存在会直接抛出TimeoutException,导致else分支永远无法执行。应改用driver.find_elements判断元素是否存在:

    email_fields = driver.find_elements(By.CSS_SELECTOR, 'input[data-testid = ocfEnterTextTextInput]')
    if len(email_fields) > 0:
        email_field = wait.until(ec.element_to_be_clickable(email_fields[0]))
        email_field.send_keys(email, Keys.RETURN)
        print('Email verified')
    else:
        print('Email verification not required')
    

内容的提问来源于stack exchange,提问作者Siddhesh Pangam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:09:59