WebSocketRoute
每當使用 Page.RouteWebSocketAsync() 或 BrowserContext.RouteWebSocketAsync() 設定 WebSocket
路徑時,WebSocketRoute
物件允許像實際伺服器一樣處理 WebSocket。
模擬
預設情況下,路由的 WebSocket 不會連接到伺服器。 這樣一來,您可以模擬透過 WebSocket 的整個通訊。 以下範例示範如何回應 "request"
並傳回 "response"
。
await page.RouteWebSocketAsync("wss://example.com/ws", ws => {
ws.OnMessage(frame => {
if (frame.Text == "request")
ws.Send("response");
});
});
由於我們沒有在 WebSocket 路徑處理常式中呼叫 WebSocketRoute.ConnectToServer,Playwright 會假設 WebSocket 將被模擬,並在頁面內自動開啟 WebSocket。
以下是另一個處理 JSON 訊息的範例
await page.RouteWebSocketAsync("wss://example.com/ws", ws => {
ws.OnMessage(frame => {
using var jsonDoc = JsonDocument.Parse(frame.Text);
JsonElement root = jsonDoc.RootElement;
if (root.TryGetProperty("request", out JsonElement requestElement) && requestElement.GetString() == "question")
{
var response = new Dictionary<string, string> { ["response"] = "answer" };
string jsonResponse = JsonSerializer.Serialize(response);
ws.Send(jsonResponse);
}
});
});
攔截
或者,您可能想要連接到實際的伺服器,但在中間攔截訊息並修改或封鎖它們。 呼叫 WebSocketRoute.ConnectToServer 會傳回伺服器端 WebSocketRoute
執行個體,您可以向其傳送訊息或處理傳入訊息。
以下範例示範如何修改頁面傳送到伺服器的某些訊息。 從伺服器傳送到頁面的訊息保持不變,依賴預設轉發。
await page.RouteWebSocketAsync("/ws", ws => {
var server = ws.ConnectToServer();
ws.OnMessage(frame => {
if (frame.Text == "request")
server.Send("request2");
else
server.Send(frame.Text);
});
});
連接到伺服器後,所有訊息預設都會在頁面和伺服器之間轉發。
但是,如果您在原始路徑上呼叫 WebSocketRoute.OnMessage(),則從頁面到伺服器的訊息將不再轉發,而應由 handler 處理。
同樣地,在伺服器端 WebSocket 上呼叫 WebSocketRoute.OnMessage() 將會停止轉發從伺服器到頁面的訊息,而 handler 應負責處理這些訊息。
以下範例會封鎖兩個方向的某些訊息。 由於它在兩個方向都呼叫了 WebSocketRoute.OnMessage(),因此完全沒有自動轉發。
await page.RouteWebSocketAsync("/ws", ws => {
var server = ws.ConnectToServer();
ws.OnMessage(frame => {
if (frame.Text != "blocked-from-the-page")
server.Send(frame.Text);
});
server.OnMessage(frame => {
if (frame.Text != "blocked-from-the-server")
ws.Send(frame.Text);
});
});
方法
CloseAsync
新增於:v1.48關閉 WebSocket 連線的一端。
用法
await WebSocketRoute.CloseAsync(options);
參數
options
WebSocketRouteCloseOptions?
(選項性)
回傳
ConnectToServer
新增於:v1.48預設情況下,路由的 WebSocket 不會連接到伺服器,因此您可以模擬整個 WebSocket 通訊。 此方法會連接到實際的 WebSocket 伺服器,並傳回伺服器端 WebSocketRoute 執行個體,讓您能夠從伺服器傳送和接收訊息。
一旦連接到伺服器
- 從伺服器接收的訊息將自動轉發到頁面中的 WebSocket,除非在伺服器端
WebSocketRoute
上呼叫 WebSocketRoute.OnMessage()。 - 頁面中
WebSocket.send()
呼叫傳送的訊息將自動轉發到伺服器,除非在原始WebSocketRoute
上呼叫 WebSocketRoute.OnMessage()。
如需更多詳細資訊,請參閱頂端的範例。
用法
WebSocketRoute.ConnectToServer
回傳
OnClose
新增於:v1.48允許處理 WebSocket.close
。
預設情況下,關閉連線的一端(無論是在頁面中還是在伺服器上)都會關閉另一端。 但是,當設定 WebSocketRoute.OnClose() 處理常式時,關閉的預設轉發會停用,而處理常式應負責處理它。
用法
WebSocketRoute.OnClose(handler);
參數
OnMessage
新增於:v1.48此方法允許處理 WebSocket 發送的訊息,無論是從頁面還是伺服器。
在原始 WebSocket 路徑上呼叫時,此方法會處理從頁面傳送的訊息。 您可以透過使用 WebSocketRoute.Send() 回應這些訊息、將它們轉發到 WebSocketRoute.ConnectToServer 傳回的伺服器端連線,或執行其他操作來處理這些訊息。
一旦呼叫此方法,訊息將不會自動轉發到伺服器或頁面 - 您應透過呼叫 WebSocketRoute.Send() 手動執行此操作。 如需更多詳細資訊,請參閱頂端的範例。
再次呼叫此方法將會使用新的處理常式覆寫該處理常式。
用法
WebSocketRoute.OnMessage(handler);
參數
-
handler
Action<WebSocketFrame>#將處理訊息的函式。
Send
新增於:v1.48將訊息傳送到 WebSocket。 在原始 WebSocket 上呼叫時,會將訊息傳送到頁面。 在 WebSocketRoute.ConnectToServer 的結果上呼叫時,會將訊息傳送到伺服器。 如需更多詳細資訊,請參閱頂端的範例。
用法
WebSocketRoute.Send(message);
參數
Url
新增於:v1.48在頁面中建立的 WebSocket 的 URL。
用法
WebSocketRoute.Url
回傳