Selenium send_keys函数失效:GitHub登录代码仅1/10执行成功
GitHub登录Selenium代码输入失败问题分析及修复
我写了一段用Selenium登录GitHub的代码,但只有10%的概率能正常执行。前半部分跳转登录页的操作100%没问题,但到输入账号密码的send_keys环节,90%的情况都无法成功输入内容,偶尔才能成功。
输入部分的原代码片段:
username_box = browser.find_element(By.ID, 'login_field') username_box.send_keys(username + Keys.RETURN) password_box = browser.find_element(By.ID, 'password') password_box.send_keys(password + Keys.RETURN)
问题原因
这大概率是你的代码问题,核心原因如下:
- 没有等待元素完全就绪就执行输入操作:GitHub登录页面加载可能存在延迟,元素虽然被
find_element找到,但可能还处于不可交互状态,直接调用send_keys会失效。 - 输入与回车操作绑定过于仓促:直接在
send_keys里拼接Keys.RETURN,可能导致内容还没输入完成就触发页面跳转,后续操作直接失败。
解决方案
- 使用显式等待替代直接查找元素,确保元素可见且可交互后再执行操作
- 避免使用绝对XPATH定位元素,改用更稳定的ID、CSS选择器或链接文本
- 拆分输入与登录触发动作,先完成内容输入,再单独触发登录
修改后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def github_login(username, password, github_username): browser = webdriver.Chrome() browser.get('https://github.com') # 等待登录按钮并点击,用CSS选择器替代绝对XPATH login_btn = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[href="/login"]')) ) login_btn.click() # 等待账号输入框可交互,输入账号 username_box = WebDriverWait(browser, 10).until( EC.visibility_of_element_located((By.ID, 'login_field')) ) username_box.clear() # 清空可能存在的默认内容 username_box.send_keys(username) # 等待密码输入框可交互,输入密码 password_box = WebDriverWait(browser, 10).until( EC.visibility_of_element_located((By.ID, 'password')) ) password_box.clear() password_box.send_keys(password) # 点击登录按钮(也可用password_box.send_keys(Keys.RETURN)) submit_btn = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.NAME, 'commit')) ) submit_btn.click() # 等待用户菜单按钮并点击 user_menu = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'details summary img.avatar')) ) user_menu.click() # 等待个人主页链接并点击 profile_link = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, f'details-menu a[href="/{github_username}"]')) ) profile_link.click() if browser.current_url == f'https://github.com/{github_username}': print('GitHub登录成功') return '登录成功' else: print('GitHub登录失败') return '登录失败' login = github_login(username='code7g', password='randompassword', github_username='Code7G')
内容的提问来源于stack exchange,提问作者Code7G
相关产品推荐
相关产品推荐

