VSCode 扩展测试服务
测试环境:
WebdriverIO 服务,用于测试 VSCode 扩展。
这个 WebdriverIO 服务允许你在 VSCode 桌面 IDE 或作为 Web 扩展无缝测试你的 VSCode 扩展。你只需提供扩展的路径,服务会完成剩下的工作:
- 🏗️ 安装 VSCode(可以是
stable、insiders或指定版本) - ⬇️ 下载特定 VSCode 版本对应的 Chromedriver
- 🚀 使你能够从测试中访问 VSCode API
- 🖥️ 使用自定义用户设置启动 VSCode(支持 Ubuntu、MacOS 和 Windows 上的 VSCode)
- 🌐 或从服务器提供 VSCode 以供任何浏览器访问,从而测试网页扩展
- 📔 引导页面对象,使其定位器与你的 VSCode 版本匹配
这个项目受到基于 Selenium 的 vscode-extension-tester 项目的高度启发。这个包采用了这个想法并将其适配到 WebdriverIO。
从 VSCode v1.86 开始,需要使用 webdriverio v8.14 或更高版本来安装 Chromedriver,无需任何配置。如果你需要测试早期版本的 VSCode,请参阅下面的 Chromedriver 配置 部分。
安装
要初始化一个新的 WebdriverIO 项目,运行:
npm create wdio ./
安装向导将引导你完成该过程。确保你选择 TypeScript 作为编译器,并且不要让它为你生成页面对象,因为这个项目已经包含了所有需要的页面对象。然后确保在服务列表中选择 vscode:

关于如何安装 WebdriverIO 的更多信息,请查看项目文档。
示例配置
要使用该服务,你需要将 vscode 添加到你的服务列表中,后面可以跟一个可选的配置对象。这将使 WebdriverIO 下载指定的 VSCode 二进制文件和相应的 Chromedriver 版本:
// wdio.conf.ts
export const config = {
outputDir: 'trace',
// ...
capabilities: [{
browserName: 'vscode',
browserVersion: '1.86.0', // "insiders" 或 "stable" 用于最新的 VSCode 版本
'wdio:vscodeOptions': {
extensionPath: __dirname,
userSettings: {
"editor.fontSize": 14
}
}
}],
services: ['vscode'],
/**
* 可选地定义 WebdriverIO 存储所有 VSCode 二进制文件的路径,例如:
* services: [['vscode', { cachePath: __dirname }]]
*/
// ...
};
如果你在 browserName 不是 vscode 而是其他值(如 chrome)的情况下定义 wdio:vscodeOptions,服务将把扩展作为网页扩展提供。如果你在 Chrome 上测试,不需要额外的驱动服务,例如:
// wdio.conf.ts
export const config = {
outputDir: 'trace',
// ...
capabilities: [{
browserName: 'chrome',
'wdio:vscodeOptions': {
extensionPath: __dirname
}
}],
services: ['vscode'],
// ...
};
注意: 在测试网页扩展时,你只能在 stable 或 insiders 之间选择作为 browserVersion。
TypeScript 设置
在你的 tsconfig.json 中,确保将 wdio-vscode-service 添加到你的类型列表中:
{
"compilerOptions": {
"types": [
"node",
"webdriverio/async",
"@wdio/mocha-framework",
"expect-webdriverio",
"wdio-vscode-service"
],
"target": "es2019",
"moduleResolution": "node",
"esModuleInterop": true
}
}
使用方法
你可以使用 getWorkbench 方法来访问与你所需 VSCode 版本匹配的定位器的页面对象:
describe('WDIO VSCode Service', () => {
it('should be able to load VSCode', async () => {
const workbench = await browser.getWorkbench()
expect(await workbench.getTitleBar().getTitle())
.toBe('[Extension Development Host] - README.md - wdio-vscode-service - Visual Studio Code')
})
})
访问 VSCode API
如果你想通过 VSCode API 执行某些自动化操作,你可以通过自定义 executeWorkbench 命令运行远程命令。此命令允许你从测试中远程执行代码到 VSCode 环境中,并使你能够访问 VSCode API。你可以将任意参数传递给该函数,这些参数将传递给函数。vscode 对象将始终作为第一个参数传入,后跟外部函数参数。请注意,你不能访问函数作用域之外的变量,因为回调是远程执行的。示例如下:
const workbench = await browser.getWorkbench()
await browser.executeWorkbench((vscode, param1, param2) => {
vscode.window.showInformationMessage(`I am an ${param1} ${param2}!`)
}, 'API', 'call')
const notifs = await workbench.getNotifications()
console.log(await notifs[0].getMessage()) // 输出:「I am an API call!」