リクエストの送受信
Selenium IDEは、そのメッセージングにHTTPから着想を得ています。
しかし、そのメッセージングは少し異なるアプローチをとっています(プラグインが独自のルーターを開発するのを避けるため)。
IDEへのリクエスト
リクエストは、特定のキーを持つJSONオブジェクトであり、IDEでの最終的な実行を決定します。
{
uri: "/path/to/resource",
verb: "get",
payload: {
data: "request body goes here"
}
}
uri
- IDE機能のリソースロケーター(例:コマンドの記録、ロケーターの解決)verb
- 修飾子関数(例:get
は情報を取得し、post
は新しい情報を追加します。HTTPと同じです)payload
- リクエストボディ、操作を実行するために必要な情報、uri
からuri
へと変化します。
リクエストの送信
IDEは有効なレスポンスで返信します。エラーが発生した場合は、IDEウィンドウのDevToolsを開いて確認できます。
browser.runtime.sendMessage(SIDE_ID, request).then(response => {
console.log("it worked!");
});
IDEからのリクエスト
IDEからのリクエストは、キーと構造が異なります。IDEには、ネストされたルーティングを処理するルーターがあります(例:uri: /path/to/nested/uri
)。プラグイン開発者が独自のルーターを開発または実装するのを避けるために、異なるアプローチが採用されました。
{
action || event: "an action to perform or an event to adhere",
request keys...
}
action
またはevent
- 実行するアクションまたは対応するイベント。アクションはコマンドの実行またはコードの出力であり、イベントは再生の開始、または記録の開始または終了です。追加キー
- 実行されるaction
またはevent
によって決定される追加キー。
注記:action
またはevent
のいずれかのみが定義され、両方が定義されることはありません。
リクエストの受信
browser.runtime.onMessageExternalを実装する必要があります。
browser.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
if (message.action === "execute" && message.command) {
console.log("I need to execute a command");
return sendResponse(true); // I've finished execution
}
if (message.event === "playbackStarted") {
console.log("IDE notified me a playback was started"); // Responding to events is optional
}
});
非同期リクエスト
プロミスを待機する必要がある場合や、DOMを変更するコマンドを実行する場合など、一部のリクエストは非同期です。
Selenium IDEは待機するように通知する必要があります。sendResponse
が呼び出されるまで待機します。Selenium IDEが**永遠に待機し続ける状態になるのを防ぐ**ため、エラーが発生した場合は、IDEにエラーを返すようにしてください。
Selenium IDEに待機させるには、onMessageExternal
イベントハンドラーでreturn true
にし、最終結果を返すためにsendResponse
を保持します。
browser.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
if (message.action === "execute" && message.command && message.command.command === "myAsyncCommand") {
executingSomeAsyncFunctionality(message.command).then(() => {
return sendResponse(true);
});
return true;
}
});