{"id":95689,"date":"2025-02-02T13:09:42","date_gmt":"2025-02-02T09:39:42","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/"},"modified":"2025-02-02T13:09:42","modified_gmt":"2025-02-02T09:39:42","slug":"beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/","title":{"rendered":"Beyond Cypress `Cy.Intercept`: \u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0648\u0628 \u0633\u0627\u06cc\u062a \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u062f\u0631 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628\u06cc \u0633\u0631\u0648"},"content":{"rendered":"<div data-article-id=\"2254894\" id=\"article-body\">\n<p>\u062f\u0631 \u0628\u062e\u0634 \u0627\u0648\u0644 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u060c \u0645\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u06cc\u0645 <code>cy.intercept<\/code> \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 WebSocket \u0648 \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u062a\u0631\u06a9\u06cc\u0628\u06cc Cyprid \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062a\u0639\u0627\u0645\u0644 WebSocket \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0645\u0639\u0631\u0641\u06cc \u06a9\u0631\u062f. \u062d\u0627\u0644 \u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u062a\u0633\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0634\u06cc\u0631\u062c\u0647 \u0628\u0632\u0646\u06cc\u0645 \u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0648\u0628 \u0633\u0627\u06cc\u062a \u0647\u0627 \u0646\u0642\u0634 \u0645\u0647\u0645\u06cc \u062f\u0631 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062f\u0642\u06cc\u0642 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u060c \u0631\u062f\u06cc\u0627\u0628\u06cc \u062a\u0639\u0627\u062f\u0644 \u0632\u0646\u062f\u0647 \u0648 \u062a\u062c\u0631\u0628\u06cc\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u062f\u0648\u0646 \u062f\u0631\u0632 \u062f\u0627\u0631\u0646\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/#%DA%86%D8%B1%D8%A7_WebSockets_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA_%D9%85%D9%87%D9%85_%D8%A7%D8%B3%D8%AA%D8%9F\" >\u0686\u0631\u0627 WebSockets \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0645\u0647\u0645 \u0627\u0633\u062a\u061f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/#%D8%A7%D8%AA%D8%B5%D8%A7%D9%84_%D8%B3%DB%8C%DA%AF%D9%86%D8%A7%D9%84_%D8%AF%D8%B1_%D8%B2%D9%85%D8%A7%D9%86_%D9%88%D8%A7%D9%82%D8%B9%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_%D9%85%D8%A7%D9%86%D8%AF%D9%87_%D9%88_%D9%88%D8%B6%D8%B9%DB%8C%D8%AA_%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA\" >\u0627\u062a\u0635\u0627\u0644 \u0633\u06cc\u06af\u0646\u0627\u0644 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u0627\u0646\u062f\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/#%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%D8%AA%D8%B9%D8%A7%D8%AF%D9%84_WebSocket\" >\u0627\u062c\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u062a\u0639\u0627\u062f\u0644 WebSocket<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/#%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_WebSockets_%D8%AF%D8%B1_%DB%8C%DA%A9_%D9%85%D9%88%D8%B1%D8%AF_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D8%B3%D8%B1%D9%88\" >\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WebSockets \u062f\u0631 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0631\u0648<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/beyond-cypress-cyintercept-real-time-signalr-websocket-payments-testing-in-cypress-hybrid-2he5\/#%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\" >\u067e\u0627\u06cc\u0627\u0646<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%D8%B1%D8%A7_WebSockets_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA_%D9%85%D9%87%D9%85_%D8%A7%D8%B3%D8%AA%D8%9F\"><\/span>\n<p>  \u0686\u0631\u0627 WebSockets \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0645\u0647\u0645 \u0627\u0633\u062a\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a \u062f\u0627\u062e\u0644\u06cc \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0648\u0628 \u063a\u0627\u0644\u0628\u0627\u064b \u0628\u0647 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0645\u062a\u06a9\u06cc \u0647\u0633\u062a\u0646\u062f \u062a\u0627 \u0628\u0627\u0632\u062e\u0648\u0631\u062f \u0641\u0648\u0631\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u0646\u062f. \u0628\u0631 \u062e\u0644\u0627\u0641 \u0646\u0638\u0631\u0633\u0646\u062c\u06cc \u0633\u0646\u062a\u06cc HTTP \u060c \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u06a9\u0631\u0631 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0627\u0632 \u0633\u0631\u0648\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc \u06a9\u0646\u062f \u060c WebSockets \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u0641\u0634\u0627\u0631 \u0641\u0648\u0631\u06cc \u0631\u0627 \u0641\u0639\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc: \u0627\u06cc\u062f\u0647 \u0622\u0644 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<ul>\n<li>\u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0648\u0636\u0639\u06cc\u062a \u0645\u0639\u0627\u0645\u0644\u0647 \u0632\u0646\u062f\u0647 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c &#8220;\u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0631\u062f\u0627\u062e\u062a&#8221; \u060c &#8220;\u067e\u0631\u062f\u0627\u062e\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632&#8221; \u060c &#8220;\u067e\u0631\u062f\u0627\u062e\u062a \u0634\u06a9\u0633\u062a \u062e\u0648\u0631\u062f&#8221;).<\/li>\n<li>\u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u062a\u0639\u0627\u062f\u0644 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u067e\u0633 \u0627\u0632 \u0633\u067e\u0631\u062f\u0647 \u0647\u0627 \u060c \u0628\u0631\u062f\u0627\u0634\u062a \u0647\u0627 \u06cc\u0627 \u0628\u0627\u0632\u067e\u0631\u062f\u0627\u062e\u062a.<\/li>\n<li>\u0647\u0634\u062f\u0627\u0631\u0647\u0627\u06cc \u062a\u0642\u0644\u0628 \u0641\u0648\u0631\u06cc \u0648 \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc.<\/li>\n<\/ul>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 Cypress \u0628\u0647 \u0637\u0648\u0631 \u0628\u0648\u0645\u06cc \u0627\u0632 \u0622\u0632\u0645\u0627\u06cc\u0634 WebSocket \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f \u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0633\u0641\u0627\u0631\u0634\u06cc \u0648 \u0634\u0646\u0648\u0646\u062f\u06af\u0627\u0646 \u0631\u0648\u06cc\u062f\u0627\u062f WebSocket \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0622\u0646 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u062a\u0633\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u062e\u0627\u0635 \u060c \u0627\u0632 \u062c\u0645\u0644\u0647:<\/p>\n<ul>\n<li>\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc.<\/li>\n<li>\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u062a\u0639\u0627\u062f\u0644 \u067e\u0633 \u0627\u0632 \u0645\u0639\u0627\u0645\u0644\u0627\u062a.<\/li>\n<li>\u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u062e\u0637\u0627 \u060c \u0642\u0637\u0639 \u0627\u0631\u062a\u0628\u0627\u0637 \u0648 \u0627\u062d\u06cc\u0627.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AA%D8%B5%D8%A7%D9%84_%D8%B3%DB%8C%DA%AF%D9%86%D8%A7%D9%84_%D8%AF%D8%B1_%D8%B2%D9%85%D8%A7%D9%86_%D9%88%D8%A7%D9%82%D8%B9%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_%D9%85%D8%A7%D9%86%D8%AF%D9%87_%D9%88_%D9%88%D8%B6%D8%B9%DB%8C%D8%AA_%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA\"><\/span>\n<p>  \u0627\u062a\u0635\u0627\u0644 \u0633\u06cc\u06af\u0646\u0627\u0644 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u0627\u0646\u062f\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 <code>connectWStoListen<\/code> \u06cc\u06a9 \u062f\u0633\u062a\u0648\u0631 Cypress \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 WebSocket \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SignalR \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0627\u0646\u062f\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0641\u0648\u0631\u06cc \u0645\u062a\u06a9\u06cc \u0647\u0633\u062a\u0646\u062f \u060c \u06af\u0648\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>Cypress.Commands.add(\n  \"connectWStoListen\",\n  (url, { onBalanceUpdate, onPaymentStatusUpdate }) =&gt; {\n    return new Promise((resolve, reject) =&gt; {\n      const ws = new WebSocket(url);\n      Cypress.env(\"currentWebSocket\", ws); \/\/ Store WebSocket instance globally\n...\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0645\u0639\u0631\u0641\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062f\u0633\u062a\u06cc<\/strong><\/p>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u062a\u0635\u0627\u0644 SignalR \u060c \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0633\u062a\u06cc \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0647\u0631 \u062f\u0648 \u0645\u0634\u062a\u0631\u06cc \u0648 \u0633\u0631\u0648\u0631 \u0642\u0628\u0644 \u0627\u0632 \u062a\u0628\u0627\u062f\u0644 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0628\u0627 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0647\u0627\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u062a\u0648\u0627\u0641\u0642 \u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u0642\u0627\u0644\u0628 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062f\u0631 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0633\u0648\u06a9\u062a \u0647\u0627\u06cc \u0648\u0628 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>...     \n      const handshakeData=\"{\"protocol\":\"json\",\"version\":1}\\x1e\";\n      let receivedEmptyResponse = false; \/\/ Track server's empty {} response\n      let readyToListen = false; \/\/ Track when we're ready to listen for custom messages\n...\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>\\x1e<\/code> \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 <code>handshakeData<\/code> \u06cc\u06a9 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u0646\u062f\u0647 \u0633\u06cc\u06af\u0646\u0627\u0644 \u0648\u06cc\u0698\u0647 \u0627\u0633\u062a \u06a9\u0647 \u067e\u0627\u06cc\u0627\u0646 \u067e\u06cc\u0627\u0645 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u062a\u0645\u0627\u0645 \u062f\u0633\u062a \u062f\u0627\u062f\u0646 \u062f\u0633\u062a \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 <strong>\u0634\u0631\u0648\u0639 \u0628\u0647 \u06af\u0648\u0634 \u062f\u0627\u062f\u0646 \u0628\u0647 \u067e\u06cc\u0627\u0645 \u0647\u0627<\/strong> \u0648\u062a <strong>\u062e\u0637\u0627\u0647\u0627\u06cc \u062f\u0633\u062a \u0632\u062f\u0646 \u0628\u0647<\/strong>\u0628\u0634\u0631<\/p>\n<p><strong>\u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u067e\u06cc\u0627\u0645 \u0647\u0627 \u0648 \u062e\u0637\u0627\u0647\u0627\u06cc WebSocket<\/strong><\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u062a\u0635\u0627\u0644 \u060c SignalR \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0627\u0632 \u0633\u0631\u0648\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0633\u062a\u0648\u0631 Cypress \u0645\u0627 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645 \u0647\u0627 \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0633\u0631\u0648\u0631 \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>ws.onopen = () =&gt; {\n        console.log(\"SignalR WebSocket connection established\");\n        ws.send(handshakeData); \/\/ Step 1: Send handshake message\n\n        ws.onmessage = (event) =&gt; {\n          const rawMessage = event.data;\n          const messages = rawMessage.split(\"\\x1e\").filter((m) =&gt; m);\n\n          messages.forEach((message) =&gt; {\n            try {\n              const parsedMessage = JSON.parse(message);\n\n              \/\/ Step 2: Check for initial empty response {}\n              if (\n                Object.keys(parsedMessage).length === 0 &amp;&amp;\n                !receivedEmptyResponse\n              ) {\n                console.log(\"Received empty response {} from server.\");\n                receivedEmptyResponse = true;\n                ws.send('{\"type\":6}\\x1e'); \/\/ Step 3: Send type after  empty server response\n              }\n              \/\/ Step 4: Wait for server to respond with {\"type\":6}\n              else if (\n                parsedMessage.type === 6 &amp;&amp;\n                receivedEmptyResponse &amp;&amp;\n                !readyToListen\n              ) {\n                console.log(\n                  \"Received server confirmation type 6. Ready for further messages.\",\n                );\n                readyToListen = true;\n                resolve(); \/\/ Signal that we're ready for payment deposit request\n              }\n              \/\/ Only listen for custom messages \n              \/\/ ReceivePaymentStatusUpdate and ReceiveBalanceUpdate\n              \/\/ after setup is complete\n              if (\n                readyToListen &amp;&amp;\n                parsedMessage.type === 1 &amp;&amp;\n                parsedMessage.target\n              ) {\n                if (\n                  parsedMessage.target === \"ReceivePaymentStatusUpdate\" &amp;&amp;\n                  onPaymentStatusUpdate\n                ) {\n                  onPaymentStatusUpdate(parsedMessage.arguments[0]);\n                }\n                if (\n                  parsedMessage.target === \"ReceiveBalanceUpdate\" &amp;&amp;\n                  onBalanceUpdate\n                ) {\n                  onBalanceUpdate(parsedMessage.arguments[0]);\n                }\n              }\n            } catch (error) {\n              console.error(\"Failed to parse SignalR message:\", error);\n            }\n          });\n        };\n        ws.onerror = (error) =&gt; {\n          console.log(WebSocket error: ${error.message});\n          reject(error);\n        };\n        ws.onclose = () =&gt; {\n          console.log(\"SignalR WebSocket connection closed\");\n        };\n      };\n    });\n  },\n);\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627:<\/strong> WebSocket \u062e\u0637\u0627\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0637\u0631\u0632 \u0641\u062c\u06cc\u0639\u06cc \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0646\u0634\u062a \u0645\u0646\u0627\u0628\u0639 \u0628\u0633\u062a\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><strong>\u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062c\u062f\u062f \u062e\u0648\u062f\u06a9\u0627\u0631:<\/strong> \u0627\u06af\u0631 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u062f\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u062d\u0644 \u0646\u0634\u062f\u0647 \u0628\u0627\u0642\u06cc \u0628\u0645\u0627\u0646\u0646\u062f \u060c \u0633\u0631\u0648 \u062a\u0627 \u0632\u0645\u0627\u0646 \u062f\u0631\u06cc\u0627\u0641\u062a \u062a\u0623\u06cc\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%D8%AA%D8%B9%D8%A7%D8%AF%D9%84_WebSocket\"><\/span>\n<p>  \u0627\u062c\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u062a\u0639\u0627\u062f\u0644 WebSocket<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 WebSocket \u0645\u0627 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u06cc\u06a9 \u0631\u0648\u0634 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u062a\u0639\u0627\u062f\u0644 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>connectWStoVerifyBalance() {\n      \/\/ Construct your WebSocket SignalR URL\n      \/\/ The URL is based on configuration for specific testing \n      \/\/ environment\n      const urlWS = `${envConfig.webSocketAPI}${bearerToken}`;\n      cy.connectWStoListen(urlWS, {\n        onPaymentStatusUpdate: (paymentStatus) =&gt; {\n          const parsedStatus = JSON.parse(paymentStatus);\n          \/\/ Wait and retry if payment status is still 'pending'\n          if (parsedStatus.status === \"pending\") {\n            console.warn(\"Payment status is pending. Retrying...\");\n          }\n          \/\/ Do an assertion that status is updated to Success\n          expect(parsedStatus.status).to.equal(\"success\");\n          console.log(\"Payment status updated successfully:\", parsedStatus);\n        },\n        onBalanceUpdate: (updatedBalance) =&gt; {\n          \/\/ Do required assertions for a balance update\n          \/\/ Save new balance value if it is necessary\n          console.log(\"Balance updated successfully:\", updatedBalance);\n          \/\/ Close WebSocket connection\n          const ws = Cypress.env(\"currentWebSocket\");\n          if (ws) ws.close();\n        },\n      });\n    });\n  }\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_WebSockets_%D8%AF%D8%B1_%DB%8C%DA%A9_%D9%85%D9%88%D8%B1%D8%AF_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D8%B3%D8%B1%D9%88\"><\/span>\n<p>  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WebSockets \u062f\u0631 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0631\u0648<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062d\u0627\u0644 \u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc WebSocket \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0631\u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u0647\u0627 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u062a\u0639\u0627\u062f\u0644 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>describe(\"Deposit Feature - Real-Time WebSocket Validation\", () =&gt; {\n\n  it(`Verify that a user can deposit min amount and payment is successful`, () =&gt; {\n    \/\/ Step 1: User Registration &amp; Setup\n    cy.registerNewUser();\n    cy.confirmUserIsRegistered();\n\n    \/\/ Step 2: Establish WebSocket Connection for Balance Monitoring\n    \/\/ using our created method\n    cy.connectWStoVerifyBalance();\n\n    \/\/ Step 3: Navigate to payments and do required actions to\n    \/\/ initiate a deposit transaction\n    cy.navigateToPayments();\n    cy.accessDepositTab();\n    cy.verifyMinimumDepositAmount();\n    cy.validatePendingPaymentStatus();\n\n    \/\/ Step 4: Simulate payment process via API\/webhook\/UI\n    cy.updateDepositStatusViaAPI();\n\n    \/\/ Step 5: Verify successful payment update on UI\n    cy.validateSuccessfulPaymentMessage();\n  });\n});\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><em>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0645\u0627 \u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u06a9\u0646\u0633\u0648\u0644 \u0631\u0627 \u0628\u0647 \u062f\u0633\u062a\u0648\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc Cypress \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645 <code>connectWStoListen<\/code>\u060c \u0645\u0627 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0648\u0636\u0639\u06cc\u062a \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u062f\u0631 \u06a9\u0646\u0633\u0648\u0644 Cypress \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u062f\u06cc\u062f \u06a9\u0627\u0645\u0644\u06cc \u062f\u0631 \u0646\u062d\u0648\u0647 \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0648\u0628 \u0633\u0627\u06cc\u062a SignalR \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0645\u0639\u0627\u0645\u0644\u0647 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<\/em><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\"><\/span>\n<p>  \u067e\u0627\u06cc\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>WebSockets \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a \u0645\u062f\u0631\u0646 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u060c \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0627\u0632\u062e\u0648\u0631\u062f \u0641\u0648\u0631\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0628\u0627 \u06af\u0633\u062a\u0631\u0634 Cypress \u0628\u0627 \u062f\u0633\u062a\u0648\u0631\u0627\u062a WebSocket \u0633\u0641\u0627\u0631\u0634\u06cc \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645:<\/p>\n<ol>\n<li>\u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u062a\u0639\u0627\u062f\u0644 \u0641\u0648\u0631\u06cc \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u0632 UX \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0648 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0645\u0627\u0644\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ol>\n<p>\u0622\u06cc\u0627 \u062f\u0648\u0633\u062a \u062f\u0627\u0631\u06cc\u062f \u062f\u0631\u0628\u0627\u0631\u0647 Cypress \u0648 QA Insights \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u06a9\u0633\u0628 \u06a9\u0646\u06cc\u062f\u061f \u0645\u0631\u0627 \u062f\u0631 LinkedIn\ud83d\ude80 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 TG \u0645\u0646 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u0628\u062e\u0634 \u0627\u0648\u0644 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u060c \u0645\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u06cc\u0645 cy.intercept \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 WebSocket \u0648 \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u062a\u0631\u06a9\u06cc\u0628\u06cc Cyprid \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062a\u0639\u0627\u0645\u0644 WebSocket \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0645\u0639\u0631\u0641\u06cc \u06a9\u0631\u062f. \u062d\u0627\u0644 \u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u062a\u0633\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0634\u06cc\u0631\u062c\u0647 \u0628\u0632\u0646\u06cc\u0645 \u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0648\u0628 \u0633\u0627\u06cc\u062a \u0647\u0627 \u0646\u0642\u0634 \u0645\u0647\u0645\u06cc \u062f\u0631 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":95690,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-95689","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/95689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=95689"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/95689\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/95690"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=95689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=95689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=95689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}