发送和接收请求
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
- 要执行的操作或要响应的事件,操作可以是执行命令或发出其代码,而事件可以是播放已开始,或录制已开始或结束。additional keys
- 由要执行的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
}
});
异步请求
一些请求本质上是异步的,当我们需要等待一个 Promise 或执行一个改变 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;
}
});