使用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
相关产品推荐
相关产品推荐

