Selenium运行Python自动化代码报错「'value' must be a single Unicode code point」怎么办?
报错原因与修复方案
核心错误点
- 传入
send_keys()的参数类型不满足要求:执行line.split("\n")后返回的是列表结构,并非单个字符串。Selenium的按键输入方法要求传入的内容必须是单个Unicode字符串或特殊按键常量,传入列表就会触发'value' must be a single Unicode code point的参数校验报错。 - 递归逻辑位置错误:在for循环遍历每一行的内部直接调用
Check(),会触发无限递归,既无法完整遍历test.txt的全部内容,还会造成函数调用栈溢出。 - 组合键实现逻辑错误:每执行一步按键就重新初始化
ActionChains对象,会中断Ctrl按键的按下状态,导致Ctrl+Z的组合键无法正常触发撤销操作。 - 文件读取操作存在泄漏风险:手动open/close文件的方式,一旦读取过程出现异常就会导致文件句柄长期被占用。
修正后的代码示例
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys import time def Check(): # 用上下文管理器安全读取文件,自动处理文件关闭逻辑 with open("test.txt", "r", encoding="utf-8") as afile: # 预处理所有行:去掉首尾换行符,过滤空行 lines = [line.strip() for line in afile.readlines() if line.strip()] for line in lines: # 单个ActionChains对象完成全部连贯按键操作,保证按键状态不中断 actions = ActionChains(driver) # 直接传入单行字符串执行输入,不再传入split得到的列表 actions.send_keys(line) actions.pause(1) actions.send_keys(Keys.ENTER) actions.pause(1) # 连贯执行三次Ctrl+Z撤销操作 actions.key_down(Keys.LEFT_CONTROL) actions.send_keys('z') actions.pause(1) actions.send_keys('z') actions.pause(1) actions.send_keys('z') actions.key_up(Keys.LEFT_CONTROL) actions.perform() # 函数仅在外层调用一次,避免循环内部递归导致的无限调用 Check()
修改效果说明
- 传入
send_keys()的参数从列表替换为纯字符串,直接解决抛出的InvalidArgumentException错误。 - 用
key_down/key_up维护Ctrl键的按下状态,保证三次撤销操作可以正常触发。 - 移除循环内部的递归调用,让函数可以按顺序遍历完文本所有行后正常退出,不会触发栈溢出。
- 用上下文管理器读取文件,避免文件句柄泄漏。
内容的提问来源于stack exchange,提问作者rover
相关产品推荐
相关产品推荐

