如何使用Selenium和Python操作登录弹窗 无法输入账号密码问题求解
问题根源
- 你使用的CSS选择器包含动态生成的随机ID(比如
#login-panel-1767、#login-panel-1205),这类ID每次页面刷新都会变化,无法稳定定位元素 - 你定位的账号输入框层级是
div标签,send_keys方法只能作用于可输入的input标签,给div发送文本无效 - 没有设置等待逻辑,点击登录按钮后弹窗还未完全渲染完成就执行定位操作,会直接抛出元素不存在的错误
修正方案
核心调整点
- 替换动态ID选择器,用更稳定的属性定位:比如账号输入框的
name=user_id、密码输入框的name=password,这两个属性是固定的 - 加入显式等待,确保登录弹窗渲染完成后再执行定位操作
- 直接定位
input标签执行输入,不要定位外层的div容器
修正后可运行代码
import openpyxl from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wb = openpyxl.Workbook() chrome_options = Options() options = webdriver.ChromeOptions() #options.add_argument('headless') options.add_argument('window-size=1920x1080') options.add_argument("disable-gpu") sheet = wb.active sheet.append(["1lable", "2lable"]) wb.save("save.xlsx") path = "/Users/erer/Desktop/도구/파이썬 작업공간./chromedriver 2" # 高版本Selenium(4.x)建议用service参数指定chromedriver路径,可替换为下方写法 # from selenium.webdriver.chrome.service import Service # driver = webdriver.Chrome(service=Service(path), options=options) driver = webdriver.Chrome(path , chrome_options=options) wait = WebDriverWait(driver, 10) # 最长等待10秒,直到目标元素加载完成 driver.get('https://otr.co.kr/#!') # 点击登录按钮 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#site-header .login-window-toggle"))).click() # 输入账号 account_input = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[name='user_id']"))) account_input.clear() account_input.send_keys("你的账号") # 输入密码 pwd_input = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[name='password']"))) pwd_input.clear() pwd_input.send_keys("你的密码") # 点击登录按钮 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".login-panel .btn-block[type='submit']"))).click()
补充注意事项
- Selenium 4.0及以上版本已废弃
find_element_by_*系列方法,代码中统一使用find_element(By.定位方式, 定位值)的写法兼容性更强 - 如果输入时遇到元素不可交互的报错,可以在
send_keys前先调用click()方法激活输入框状态 - 不要使用浏览器复制的带随机后缀的ID、类名作为定位依据,优先用
name、固定ID、文本内容、业务相关的固定类名定位
内容的提问来源于stack exchange,提问作者김진우
相关产品推荐
相关产品推荐

