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

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()

Canvas登录界面

问题排查与修复

核心问题

  1. 语法错误:密码常量PASSWORD = "<myPassword"缺少闭合引号,直接导致代码执行中断,后续操作无法运行。
  2. 元素定位不精准:两次使用By.TAG_NAME, "button"定位按钮,页面中可能存在多个按钮,容易匹配到错误元素。
  3. 等待条件不合理:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:13:21