Selenium Python中By.Name报错及password元素定位问题求助
Selenium定位问题排查与解决
一、By.Name/By.name报错的原因
Selenium的By类中,按name属性定位的常量是全大写的NAME,不存在By.Name或小写By.name这两个属性,这就是你触发'type object 'By' has no attribute 'Name''错误的直接原因。
正确用法示例:
driver.find_element(By.NAME, 'password')
二、无法定位id="password"元素的问题分析
你遇到这个问题主要有两个核心原因:
- 页面动态加载延迟:点击「下一步」按钮后,密码输入框是异步渲染的,直接调用
find_element时元素还未完成加载,导致定位失败。 - 错误的元素定位符:YouTube登录页的密码输入框实际
id并非password,且登录按钮的id是passwordNext而非你代码中的submit;同时你把time.sleep(3)放在了元素定位之后,完全起不到等待元素加载的作用。
修正后的完整代码
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("https://www.youtube.com/signin") # 定位用户名输入框并输入内容 username = driver.find_element(By.ID, "identifierId") username.send_keys('masudalnahid0') # 点击用户名下一步按钮 next_btn = driver.find_element(By.ID, 'identifierNext') next_btn.click() # 显式等待密码输入框加载完成(优先用NAME属性定位) wait = WebDriverWait(driver, 10) password_box = wait.until(EC.visibility_of_element_located((By.NAME, 'password'))) password_box.send_keys('GoodMorning') # 等待并点击密码下一步按钮 submit_btn = wait.until(EC.element_to_be_clickable((By.ID, 'passwordNext'))) submit_btn.click() time.sleep(6) driver.quit()
关键修改说明:
- 替换错误的
By.Name为标准的By.NAME常量 - 使用
WebDriverWait显式等待元素加载,替代不可靠的后置time.sleep - 修正了登录按钮的定位符,匹配YouTube登录页的实际元素结构
内容的提问来源于stack exchange,提问作者Masud Al Nahid
相关产品推荐
相关产品推荐

