本文へスキップ

Electron APIへのアクセス

Electron APIにアクセスするには、アプリでプリロードスクリプトとメインスクリプトをインポート(またはrequire)する必要があります。

プリロードスクリプトの上部付近で、条件付きで`wdio-electron-service/preload`をロードします。例:

preload/index.ts

if (process.env.TEST === 'true') {
import('wdio-electron-service/preload');
}

メインインデックスファイル(アプリのエントリポイント)の上部付近で、条件付きで`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';
// ...

別の方法として、プリロードとメインのエントリポイントの両方に対して、別のテストインデックスファイルを使用する方法があります。例:

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 APIを含む`electron`パッケージのデフォルトエクスポートになります。

ようこそ!お手伝いできますか?

WebdriverIO AI Copilot