IME 自动化测试开源方案
测试自动化··11 min read
IME 自动化测试方案总结
现状:IME 测试自动化是个业界难题
核心困难在于:浏览器自动化工具(Playwright/Puppeteer)运行在浏览器外部,而 IME 是操作系统级别的服务。自动化工具无法直接调用操作系统的输入法,因为:
- Headless 模式下没有操作系统 IME 可用
- 即使有 GUI 环境,程序化控制 IME 候选词选择非常困难
- CDP(Chrome DevTools Protocol)只提供了
Input.insertText,直接跳过组合过程
现有开源方案
| 方案 | 说明 | 适合你的场景? |
|---|---|---|
| Adobe IMPACT | Adobe 开源的 IME 自动化框架,专为 CJK 输入测试设计,通过 Python + Selenium 控制系统级 IME | 最接近需求,但依赖 GUI 环境和系统 IME |
| puppeteer-text-typer | 通过手动构造 CompositionEvent 并注入页面来模拟 IME 组合过程 | 轻量,但不触发浏览器真实的 IME 状态 |
Playwright keyboard.insertText() | 内置方法,直接插入文本(跳过组合过程) | 只能测最终结果,无法测组合中间状态 |
Playwright pressSequentially() | 逐字符按键,触发 keydown/keyup 事件 | 不触发 composition 事件,无法模拟 IME |
对于项目,推荐两种自动化策略
策略1:事件注入测试(轻量,不需要真实 IME)
用 Playwright + 手动构造 CompositionEvent 来模拟 IME 行为。虽然不是真实 IME,但能验证你的代码是否正确处理了 isComposing、compositionstart、compositionend 事件:
// Playwright 测试:模拟 IME 组合过程
test('IME composition should not trigger router.push', async ({ page }) => {
await page.goto('http://localhost:3000/blog');
const input = page.locator('input[placeholder*="搜索"]');
// 模拟 compositionstart
await input.evaluate(el => {
el.dispatchEvent(new CompositionEvent('compositionstart', { bubbles: true }));
});
// 模拟组合中输入(isComposing = true)
await input.fill('a'); // 拼音
// 验证 URL 没有变化(router.push 不应触发)
expect(page.url()).not.toContain('search=');
// 模拟 compositionend
await input.evaluate(el => {
el.dispatchEvent(new CompositionEvent('compositionend', {
bubbles: true,
data: '啊'
}));
});
// 验证 URL 在组合结束后才更新
await page.waitForURL(/search=/);
});
策略2:Adobe IMPACT(重量级,需要 GUI 环境) 如果你需要测试真实 IME 的完整行为(包括候选词窗口、多步选择等),IMPACT 是目前最专业的方案。但它需要:
-
Windows/macOS GUI 环境(不能 headless)
-
安装对应语言的系统 IME
-
Python + Selenium 环境
对于个人网站,策略1(事件注入)就够了。原因:
- 你要测的不是"IME 本身是否正常",而是"你的代码是否正确处理了 IME 事件"
- 事件注入测试可以在 CI 中 headless 运行
- 成本低,维护简单 需要我帮你写一套 Playwright IME 测试用例吗? Sources: