存取 Electron API
如果您希望存取 Electron API,您需要匯入(或 require)應用程式中的 preload 和 main 腳本。
在 preload 腳本的頂部附近,有條件地載入 wdio-electron-service/preload
,例如:
preload/index.ts
if (process.env.TEST === 'true') {
import('wdio-electron-service/preload');
}
在您的 main index 檔案(應用程式進入點)頂部附近,有條件地載入 wdio-electron-service/main
,例如:
main/index.ts
if (process.env.TEST === 'true') {
import('wdio-electron-service/main');
}
基於安全考量,建議確保 Electron 主進程的存取權僅在應用程式正在測試時可用。
這就是上述動態匯入包裹在條件語句中的原因。您需要在 WDIO 設定檔頂部指定 TEST 環境變數。
wdio.conf.ts
// ...
process.env.TEST = 'true';
// ...
另一種方法是為您的 preload 和 main 進入點使用單獨的測試 index 檔案,例如:
main/index.test.ts
import('wdio-electron-service/main');
import('./index.js');
preload/index.test.ts
import('wdio-electron-service/preload');
import('./index.js');
然後,您可以根據 TEST 環境變數是否存在,切換應用程式的測試和生產進入點。
例如,對於基於 Vite 的應用程式
vite.config.ts
export default defineConfig(({ mode }) => {
const isProd = mode === 'production';
const isTest = process.env.TEST === 'true';
return {
main: {
// ...
entry: { main: isTest ? 'src/main/index.test.ts' : 'src/main/index.ts' },
// ...
},
preload: {
// ...
entry: { preload: isTest ? 'src/preload/index.test.ts' : 'src/preload/index.ts' },
// ...
},
};
});
非捆綁預載腳本的額外步驟
如果您沒有捆綁預載腳本,您將無法在 preload.js
中匯入第三方套件 (node_modules)。在這種情況下,您必須確保在 BrowserWindow
設定中禁用沙箱。
不建議在生產環境中禁用沙箱模式;為了控制此行為,您可以在執行 WDIO 時設定 NODE_ENV
環境變數。
package.json
// ...
"scripts": {
// ...
"wdio": "TEST=true wdio run wdio.conf.js",
// ...
}
// ...
在您的 BrowserWindow 設定中,根據 TEST 變數設定沙箱選項
main/index.ts
const isTest = process.env.TEST === 'true';
new BrowserWindow({
webPreferences: {
sandbox: !isTest
preload: path.join(__dirname, 'preload.js'),
}
// ...
});
執行腳本
可以使用 browser.electron.execute(...)
在 Electron 應用程式主進程的上下文中執行任意腳本。如果您希望在執行期間操作應用程式或觸發某些事件,這允許以流暢的方式存取 Electron API。
例如,可以從測試中觸發訊息彈出視窗,透過
await browser.electron.execute(
(electron, param1, param2, param3) => {
const appWindow = electron.BrowserWindow.getFocusedWindow();
electron.dialog.showMessageBox(appWindow, {
message: 'Hello World!',
detail: `${param1} + ${param2} + ${param3} = ${param1 + param2 + param3}`,
});
},
1,
2,
3,
);
...這會導致應用程式顯示以下警示
注意: 函數的第一個參數始終是 electron
套件的預設匯出,其中包含Electron API。