[Bug]: keyboard.type() inserts unwanted space between CJK characters and digits (e.g. "小米14" → "小米 14")
### Version
```sh
System:
OS: macOS 15.6.1
CPU: (14) arm64 Apple M4 Pro
Memory: 115.31 MB / 24.00 GB
Shell: 5.9 - /bin/zsh
Browsers:
Chrome: 146.0.7680.80
Safari: 18.6
```
### Details
使用 Chrome 插件执行输入操作时,如果输入内容包含中文紧跟数字的字符串(例如 `小米14`),实际插入到输入框中的文本会变成 `小米 14`,中间多出一个空格。
<img width="1356" height="752" alt="Image" src="https://github.com/user-attachments/assets/2e6b89c9-65be-4250-bb21-8c72c777e47d" />
<img width="1340" height="930" alt="Image" src="https://github.com/user-attachments/assets/adc2c893-cc6b-455d-ad5e-7809feb3b22e" />
**复现步骤**
在搜索框中输入 `小米14`,实际输入框中得到的是 `小米 14`。
**期望行为**
输入框中应得到 `小米14`,不应有多余空格。
**根本原因**
问题出在 `packages/web-integration/src/chrome-extension/cdpInput.ts` 的 `type()` 方法中。
该方法对每个字符逐一判断,根据字符是否存在于 `_keyDefinitions` 来选择不同的 CDP 输入方式:
```typescript
// 原始逻辑
for (const char of text) {
if (this.charIsKey(char)) {
await this.press(char, { delay }); // → Input.dispatchKeyEvent(模拟真实按键)
} else {
await this.sendCharacter(char); // → Input.insertText(直接插入文本)
}
}
```
`_keyDefinitions` 中包含了数字 `0`–`9` 和空格,因此这些字符会走 `Input.dispatchKeyEvent`(模拟物理按键)。而中文字符不在其中,走的是 `Input.insertText`(直接插入,绕过输入法)。
两种方式混合使用时,浏览器/输入法检测到从"直接文本插入"切换到"物理按键模拟"的边界,IME 会在此时自动提交前面的 composition 并插入一个分隔空格,导致 `小米14` 变成 `小米 14`。
**建议的修复方案**
对所有可打印字符统一使用 `Input.insertText`。只有 `\r` 和 `\n` 需要走真实按键事件,因为浏览器需要物理 Enter 事件来提交表单或换行。
```typescript
for (const char of text) {
if (char === '\r' || char === '\n') {
await this.press(char as KeyInput, { delay }); // 必须用真实按键事件
} else {
await this.sendCharacter(char); // 其他所有字符用 Input.insertText
}
}
```
这样 `小米14` 整个字符串会作为统一的文本插入操作处理,IME 不会感知到模式切换,也就不会插入多余的空格。
**如果维护者认可这个方案的话, 我愿意提交 PR** 来完成这个修复。
### Reproduce link
No
### Reproduce Steps
在搜索框中输入 小米14,实际输入框中得到的是 小米 14。
关闭于 2026-03-19 0 条评论