练习 send_keys 输入、Ctrl+A/C/V/X 组合键、ENTER/TAB/ESC/BACKSPACE/DELETE 等常用按键。
演示 Selenium 中键盘操作的核心 API:element.send_keys() 输入文本、Keys.ENTER / TAB / ESC 触发按键、Keys.CONTROL, "a" 组合键。
💡 学习路径:
⚠️ 注意:不同浏览器对某些特殊键(如 Keys.PAUSE / Keys.SHIFT)的行为可能略有差异,脚本中建议先聚焦再按键。
element.send_keys(Keys.ENTER) —— 方式一,直接发单键,简单场景首选ActionChains(driver).send_keys(Keys.ENTER).perform() —— 方式二,链式发单键,可与 click / 其他动作串在一起ElementNotInteractableException:send_keys 前必须先 click() 聚焦,目标元素不可见或 disabled 时也会抛此异常ActionChains 忘了 .perform():链式代码写完不调 perform 就静默不执行,Selenium 不会报错但效果全无Keys.CONTROL / Keys.SHIFT 对中文输入法失效:中文输入法激活时,Ctrl/Shift 键会被系统拦截,建议用 ActionChains 或临时切换英文输入法
单键速查 — Selenium Keys 模块常用单键,send_keys / ActionChains 均适用
Keys.F4 / Keys.F7 … 常量,send_keys 和
ActionChains 均可发送,只是浏览器可能无响应。
F5、F11、F12 是 Selenium 场景高频使用的三个功能键。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://autotest-505.pages.dev/keyboard_op_tech.html") # ============================================================ # 写法 A:element.send_keys(Keys.XXX) —— 自动聚焦 + 发单键 # ============================================================ # ① TAB — 切换焦点到下一个可聚焦元素 user = driver.find_element(By.ID, "kb-user") user.click() # 先聚焦用户名 user.send_keys(Keys.TAB) # 焦点 → 密码框 pwd = driver.switch_to.active_element() print("①TAB: 当前焦点 =", pwd.get_attribute("id")) # ② ESCAPE —— 关闭搜索候选浮窗(非遮罩,直接对搜索框发 Esc) search = driver.find_element(By.ID, "kb-search") # 表单区搜索框,聚焦会弹候选浮窗 search.click() # 聚焦 → kb-search-dropdown 候选列表出现 search.send_keys("sel") # 输入几个字,候选浮窗仍显示 search.send_keys(Keys.ESCAPE) # 对搜索框发 Esc → 候选浮窗关闭 print("② ESC: 搜索候选浮窗已关闭") # ③ SPACE — 切换 checkbox 选中状态(比在 textarea 插空格更经典) agree = driver.find_element(By.ID, "kb-agree") # 表单区末尾的协议勾选框 agree.click() # 先聚焦 checkbox agree.send_keys(Keys.SPACE) # 第 1 次 SPACE → 选中 print("③SPACE 第 1 次: checkbox =", agree.is_selected()) # True agree.send_keys(Keys.SPACE) # 第 2 次 SPACE → 取消选中 print("③SPACE 第 2 次: checkbox =", agree.is_selected()) # False # ④ BACKSPACE / ⑤ DELETE — 删除前/后一个字符 area = driver.find_element(By.ID, "kb-area") area.click() area.send_keys("Hello World") # 先输入文本 area.send_keys(Keys.BACKSPACE) # 删末尾 d → "Hello Worl" area.send_keys(Keys.HOME) # 光标跳到行首(见⑦) area.send_keys(Keys.DELETE) # 删光标后 H → "ello Worl" print("④⑤BACKSPACE+DELETE: 当前文本 =", area.text) # ⑥ HOME / END — 光标跳到行首 / 行尾 area2 = driver.find_element(By.ID, "kb-area") area2.click() area2.send_keys("Python Selenium") area2.send_keys(Keys.HOME) # 光标移到 'P' 前 area2.send_keys("★") # 在行首插入标记 area2.send_keys(Keys.END) # 光标移到 'm' 后 area2.send_keys(" ✨") # 在行尾追加标记 print("⑥HOME+END: 当前文本 =", area2.text) # ★Python Selenium ✨ # ⑦ 方向键 — 在文本内移动光标 area3 = driver.find_element(By.ID, "kb-area") area3.click() area3.send_keys("ABCDE") area3.send_keys(Keys.HOME) # 光标到行首 for _ in range(3): # 右移 3 次 → 光标落在 'D' 前 area3.send_keys(Keys.ARROW_RIGHT) area3.send_keys("X") # 插入 → "ABCXDE" area3.send_keys(Keys.ARROW_LEFT) # 左移回到 'X' 前 area3.send_keys(Keys.ARROW_UP) # 上移(多行编辑时跳到上一行) area3.send_keys(Keys.ARROW_DOWN) # 下移(跳回原来的行) print("⑦方向键: 当前文本 =", area3.text) # 💡 清空文本最稳妥:area.clear() 比逐字发 BACKSPACE 高效得多 area.click() area.clear() # ============================================================ # 写法 B:ActionChains(driver).send_keys() —— 发到"当前焦点" # 适合把 click / send_keys 串在一条链上 # ⚠️ 别忘了 .perform(),否则所有动作静默不执行 # ============================================================ # 链式:聚焦密码框 → 发 TAB → 观察焦点是否跳到下一个元素 pwd_el = driver.find_element(By.ID, "kb-pwd") ActionChains(driver)\ .click(pwd_el)\ .send_keys(Keys.TAB)\ .perform() # 链式:聚焦搜索框 → 输入 → 发 ESC 关闭候选浮窗(对表单内元素发,而非 body) ActionChains(driver)\ .click(search)\ .send_keys("sel")\ .send_keys(Keys.ESCAPE)\ .perform() print("ActionChains ESC: 搜索候选浮窗已关闭") # 链式:聚焦多行区 → 输入 → HOME → 删首字 → END → 删尾字 area_b = driver.find_element(By.ID, "kb-area") ActionChains(driver)\ .click(area_b)\ .send_keys("HelloWorld")\ .send_keys(Keys.HOME)\ .send_keys(Keys.DELETE)\ .send_keys(Keys.END)\ .send_keys(Keys.BACKSPACE)\ .perform() print("⑧ActionChains 链式 HOME+DELETE+END+BACKSPACE: 已完成") # 链式:重新聚焦 kb-agree → SPACE 切换选中(和写法 A 效果一样) agree_b = driver.find_element(By.ID, "kb-agree") ActionChains(driver)\ .click(agree_b)\ .send_keys(Keys.SPACE)\ .perform() print("⑨ActionChains: 链式 SPACE 切换 checkbox 已完成") print("✅ 单键演示完成(TAB/ESC/SPACE/BACKSPACE/DELETE/HOME/END/方向键,两种写法)") driver.quit()
el.send_keys(Keys.CONTROL, "a") —— 简单组合,直接在元素上调用ActionChains(driver).key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform() —— 适合复杂链式操作,如同时按 Ctrl+Shift+T
组合键速查 — Ctrl/Shift/Alt 与字母/数字组合,send_keys 逗号传参或 ActionChains 链式
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://autotest-505.pages.dev/keyboard_op_tech.html") # ===================================================== # 组合键目标:editBox(contenteditable 富文本编辑器) # 顶部工具栏:B(加粗) / I(斜体) / U(下划线) / ↶(撤销) / ↷(重做) # 每个按钮对应一个标准 Ctrl+字母 组合键 # ===================================================== el = driver.find_element(By.ID, "editBox") # ★ contenteditable div 没有 tabindex → 默认不可 Tab 聚焦 # → 必须显式 click() 让它成为 activeElement el.click() el.send_keys("Hello Selenium 组合键练习") # 先输入文本,后续全选/格式化才有内容 # ===================================================== # 方式一:element.send_keys(Keys.CONTROL, "a") # · Selenium 自动 focus 元素 + 构造修饰键按下顺序 # · 逗号分隔多参数 = "同时按下" 效果 # · 简洁写法,适合双键组合 # ===================================================== el.send_keys(Keys.CONTROL, "a") # Ctrl+A 全选 el.send_keys(Keys.CONTROL, "b") # Ctrl+B 加粗 ← 对应工具栏 B el.send_keys(Keys.CONTROL, "i") # Ctrl+I 斜体 ← 对应工具栏 I el.send_keys(Keys.CONTROL, "u") # Ctrl+U 下划线 ← 对应工具栏 U el.send_keys(Keys.CONTROL, "c") # Ctrl+C 复制(带格式的富文本) # ===================================================== # 方式二:ActionChains 链式 —— 模拟真实按键按下/松开 # · key_down 按住修饰键 → send_keys 末键 → 逆序 key_up # · 更接近物理键盘行为 # · 三键/四键组合 必须用这种写法 # · ⚠️ 别忘了 .perform(),否则所有动作静默不执行 # ===================================================== # Ctrl+X 剪切(双键也可以用链式,演示两种写法) ActionChains(driver)\ .click(el)\ .send_keys(Keys.CONTROL, "x")\ .perform() # Ctrl+Z 撤销(回到初始文本)← 对应工具栏 ↶ Undo ActionChains(driver)\ .click(el)\ .send_keys(Keys.CONTROL, "z")\ .perform() # Ctrl+Y 重做 ← 对应工具栏 ↷ Redo ActionChains(driver)\ .click(el)\ .send_keys(Keys.CONTROL, "y")\ .perform() # === 三键组合的正确写法:显式 key_down/key_up === # Selenium 方式一的 send_keys 多参数 底层也是这个逻辑, # 这里手写出来是为了让你看清"先按的后松"的物理键盘顺序 ActionChains(driver)\ .click(el)\ .key_down(Keys.CONTROL)\ # 按住 Ctrl .key_down(Keys.SHIFT)\ # 按住 Shift(比 Ctrl 晚按) .send_keys("z")\ # 按末键 Z .key_up(Keys.SHIFT)\ # 逆序松开:先松 Shift .key_up(Keys.CONTROL)\ # 最后松 Ctrl .perform() # Ctrl+Shift+Z = 多数编辑器的"重做" print("✅ 组合键演示完成(Ctrl+A/B/I/U/C/X/Z/Y + Ctrl+Shift+Z 三键链式)") driver.quit()