Selenium Firefox驱动报TypeError: rect is undefined及密码框无法交互问题
问题根因
- 隐式等待与显式等待混合使用,触发geckodriver的等待逻辑冲突,导致元素定位时效异常
- 仅校验元素在DOM中存在,未过滤掉谷歌登录页预渲染的隐藏占位密码输入框,实际定位到的是不可交互的隐藏元素,这也是
rect is undefined报错的直接原因 - Firefox对元素交互的校验严格度远高于Chrome,要求元素必须完全可见且具备键盘焦点才可触发
send_keys,谷歌登录页的密码输入框动画未完全结束时即使可见也会被判定为不可达
解决步骤
- 移除所有
implicitly_wait调用,全程仅使用显式等待,避免等待逻辑冲突 - 定位元素时增加可见性校验,筛选出实际可交互的密码输入框
- 优先使用JS直接赋值密码,绕开Firefox的键盘可达性校验,稳定性远高于
send_keys
修正后核心代码
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait options = webdriver.FirefoxOptions() # 不需要可视化运行时可开启无头模式 # options.add_argument("--headless") driver = webdriver.Firefox(options=options) driver.maximize_window() driver.get("https://accounts.google.com/signin/v2/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&sacu=1&rip=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin") # 账号输入步骤 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'google-sign-in-title'))).click() WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'identifierId'))).send_keys('USERNAME') WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#identifierNext > div > button"))).click() # 密码输入步骤 # 等待密码输入框可见且可交互,过滤隐藏占位元素 password_ele = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='password']:not([aria-hidden='true'])")) ) # 直接用JS赋值密码,绕开键盘交互校验 driver.execute_script("arguments[0].value = arguments[1];", password_ele, password()) # 点击下一步提交 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#passwordNext > div > button"))).click()
补充说明
如果业务要求必须用send_keys实现输入,可以在定位到元素后先强制设置焦点再调用输入方法:
driver.execute_script("arguments[0].focus();", password_ele) password_ele.send_keys(password())
如果仍偶发滚动报错,可以给scrollIntoView添加对齐参数强制将元素移到视口中心:
driver.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'center'});", password_ele)
内容的提问来源于stack exchange,提问作者Tremaine Cox
相关产品推荐
相关产品推荐

