跳至主要內容

存取 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,
);

...這會導致應用程式顯示以下警示

Execute Demo

注意: 函數的第一個參數始終是 electron 套件的預設匯出,其中包含Electron API

歡迎!我能幫上什麼忙?

WebdriverIO AI Copilot