跳到主要內容

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 webSocketRoute.CloseAsync

關閉 WebSocket 連線的一端。

用法

await WebSocketRoute.CloseAsync(options);

參數

回傳


ConnectToServer

新增於:v1.48 webSocketRoute.ConnectToServer

預設情況下,路由的 WebSocket 不會連接到伺服器,因此您可以模擬整個 WebSocket 通訊。 此方法會連接到實際的 WebSocket 伺服器,並傳回伺服器端 WebSocketRoute 執行個體,讓您能夠從伺服器傳送和接收訊息。

一旦連接到伺服器

如需更多詳細資訊,請參閱頂端的範例。

用法

WebSocketRoute.ConnectToServer

回傳


OnClose

新增於:v1.48 webSocketRoute.OnClose

允許處理 WebSocket.close

預設情況下,關閉連線的一端(無論是在頁面中還是在伺服器上)都會關閉另一端。 但是,當設定 WebSocketRoute.OnClose() 處理常式時,關閉的預設轉發會停用,而處理常式應負責處理它。

用法

WebSocketRoute.OnClose(handler);

參數

  • handler Action<int?, string>#

    將處理 WebSocket 關閉的函式。 接收選項性的 關閉代碼 和選項性的 關閉原因


OnMessage

新增於:v1.48 webSocketRoute.OnMessage

此方法允許處理 WebSocket 發送的訊息,無論是從頁面還是伺服器。

在原始 WebSocket 路徑上呼叫時,此方法會處理從頁面傳送的訊息。 您可以透過使用 WebSocketRoute.Send() 回應這些訊息、將它們轉發到 WebSocketRoute.ConnectToServer 傳回的伺服器端連線,或執行其他操作來處理這些訊息。

一旦呼叫此方法,訊息將不會自動轉發到伺服器或頁面 - 您應透過呼叫 WebSocketRoute.Send() 手動執行此操作。 如需更多詳細資訊,請參閱頂端的範例。

再次呼叫此方法將會使用新的處理常式覆寫該處理常式。

用法

WebSocketRoute.OnMessage(handler);

參數


Send

新增於:v1.48 webSocketRoute.Send

將訊息傳送到 WebSocket。 在原始 WebSocket 上呼叫時,會將訊息傳送到頁面。 在 WebSocketRoute.ConnectToServer 的結果上呼叫時,會將訊息傳送到伺服器。 如需更多詳細資訊,請參閱頂端的範例。

用法

WebSocketRoute.Send(message);

參數


Url

新增於:v1.48 webSocketRoute.Url

在頁面中建立的 WebSocket 的 URL。

用法

WebSocketRoute.Url

回傳