Selenium登录Canvas网页异常:无法输入账号密码及执行后续操作
问题描述
脚本可成功打开Chrome浏览器并导航至目标URL,点击“Login”进入登录页面,但停留在登录页,未执行输入账号密码及后续登录操作。
原代码
import time from getpass import getpass from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service # Constants CANVAS_URL = "https://onlinestudy.york.ac.uk" USERNAME = "<myUsername>" PASSWORD = "<myPassword" # Set up Chrome driver driver_service = Service("<pathToChromedriver>") driver = webdriver.Chrome(service=driver_service) # Open Canvas login page driver.get(f"{CANVAS_URL}") driver.find_element(By.TAG_NAME, "button").click() # Wait for the login form to load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "pseudonym_session_unique_id"))) driver.find_element(By.ID, "pseudonym_session_unique_id").send_keys(USERNAME) driver.find_element(By.ID, "pseudonym_session_password").send_keys(PASSWORD) # Click the login button on the second page WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.TAG_NAME, "button"))).click()

问题排查与修复
核心问题
- 语法错误:密码常量
PASSWORD = "<myPassword"缺少闭合引号,直接导致代码执行中断,后续操作无法运行。 - 元素定位不精准:两次使用
By.TAG_NAME, "button"定位按钮,页面中可能存在多个按钮,容易匹配到错误元素。 - 等待条件不合理:使用
presence_of_element_located仅确保元素存在于DOM,但元素可能未完全加载可见,导致输入操作失败。
修复后的代码
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service # Constants CANVAS_URL = "https://onlinestudy.york.ac.uk" USERNAME = "<myUsername>" PASSWORD = "<myPassword>" # 修复:添加闭合引号 # Set up Chrome driver driver_service = Service("<pathToChromedriver>") driver = webdriver.Chrome(service=driver_service) try: # Open Canvas login page driver.get(CANVAS_URL) # 精准定位初始Login按钮(结合文本与标签) WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Login')]")) ).click() # 等待用户名输入框可见后输入 username_field = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "pseudonym_session_unique_id")) ) username_field.send_keys(USERNAME) # 等待密码输入框可见后输入 password_field = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "pseudonym_session_password")) ) password_field.send_keys(PASSWORD) # 精准定位登录提交按钮(结合类型与文本) WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@type='submit' and contains(text(), 'Login')]")) ).click() finally: # 如需操作完成后自动关闭浏览器,可取消下方注释 # driver.quit() pass
修复说明
- 修正了密码变量的语法错误,确保代码能正常执行。
- 所有按钮均使用XPATH精准定位,避免匹配错误元素。
- 改用
visibility_of_element_located等待条件,确保元素可见后再执行输入操作,提升稳定性。 - 加入
try...finally块,方便管理浏览器资源。
内容的提问来源于stack exchange,提问作者Shaun Potts
相关产品推荐
相关产品推荐

