Selenium/Python报错「Element is not reachable by keyboard」求助
解决Selenium选择JS自动补全选项时的「Element is not reachable by keyboard」错误
嘿,我完全理解你卡了一个月的烦躁感!咱们来拆解一下这个问题,帮你搞定这个自动补全的选择操作。
首先,你遇到的「Element is not reachable by keyboard」错误,本质是你尝试给一个无法接收键盘输入的元素发送回车键——也就是那个<li>标签。这类自动补全列表的选项通常是通过点击来触发选择的,而不是键盘事件,因为它们默认没有设置可聚焦的属性(比如tabindex),所以Selenium会判定它“不可被键盘触及”。
接下来结合你的代码和HTML结构,咱们调整一下思路:
修正后的代码方案
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains # 1. 清空输入框并输入邮政编码前缀(避免原有内容干扰) location_input = driver.find_element_by_id("location_p") location_input.clear() location_input.send_keys("75") # 2. 等待自动补全列表完全可见,然后定位第一个可点击的选项 wait = WebDriverWait(driver, 10) first_option = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".location-list li:first-child")) ) # 3. 点击选项完成选择(两种方式选其一即可) # 方式一:直接点击(优先尝试) first_option.click() # 方式二:如果直接点击无效,用ActionChains模拟鼠标移动后点击(应对元素被遮挡或需要hover的情况) # ActionChains(driver).move_to_element(first_option).click().perform()
为什么原来的代码会出错?
你之前的代码定位了带有selected类的<li>然后发送回车键,但这里有两个核心问题:
<li>元素本身不是为键盘输入设计的,Selenium无法向它发送键盘事件;- 自动补全列表的
selected类可能是动态添加的(比如输入后需要一点时间才会给第一个选项加上这个类),你的等待条件可能不够稳定。
额外的小提示
- 如果点击时遇到「元素不可点击」的问题,可以先滚动到元素位置:
driver.execute_script("arguments[0].scrollIntoView();", first_option),然后再点击; - 用
CSS_SELECTOR定位.location-list li:first-child比依赖selected类更可靠,因为它直接指向列表的第一个选项,不管有没有高亮样式。
内容的提问来源于stack exchange,提问作者Olivier Hoen
相关产品推荐
相关产品推荐

