傳送和接收請求
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...
}
動作或事件- 要執行的動作或要回應的事件,動作可以是執行指令或發出其程式碼,而事件可以是播放已開始,或錄製已開始或結束。其他鍵- 由要執行的動作或事件決定的其他鍵。
注意:只會定義動作或事件,絕不會同時定義兩者。
接收要求
若要接收要求,您必須實作 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;
}
});
