{"id":306113,"date":"2020-06-29T15:01:14","date_gmt":"2020-06-29T15:01:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=306113"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=306113","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434 \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/508772\/\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043e\u0432\u0430, \u044f \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434\u0435\u0440 \u0432 \u0422\u0438\u043d\u044c\u043a\u043e\u0444\u0444. \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u0432\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0434\u043b\u044f \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u0446. \u041e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u044f \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0446\u0438\u0444\u0440\u0430\u043c\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u0432\u0443\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u0442\u0440\u0435\u0445 \u0434\u043d\u0435\u0439 (\u0431\u0435\u0437 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432).<\/p>\n<p>  \u0421\u0440\u043e\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u0440\u044c\u0431\u0443 \u0441 \u043d\u0438\u043c\u0438. \u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0431\u043e\u0440\u044c\u0431\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445:  <\/p>\n<ul>\n<li>\u0420\u0430\u0441\u043f\u0438\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438.  <\/li>\n<li>\u041f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 <a href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">\u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u043e\u0439.<\/a>  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0438 \u0441\u0442\u0430\u043b \u0442\u0435\u043c\u043e\u0439 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/991\/c5a\/be1\/991c5abe1cf4e709d8179040de086c0e.png\" alt=\"image\"><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h1>\u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h1>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f: unit-\u0442\u0435\u0441\u0442\u044b, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 e2e-\u0442\u0435\u0441\u0442\u044b. \u0414\u0443\u043c\u0430\u044e, \u0441 \u044e\u043d\u0438\u0442\u0430\u043c\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u043c\u043d\u043e\u0433\u0438\u0435, \u043a\u0430\u043a \u0438 \u0441 e2e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445.<\/p>\n<p>  \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 UI, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 e2e-\u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0431\u044d\u043a. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e e2e-\u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.cypress.io\/guides\/overview\/why-cypress.html#In-a-nutshell\">Cypress.<\/a> \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438, \u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443 \u043d\u0430\u0441:<\/p>\n<ol>\n<li>\u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f.  <\/li>\n<li>\u041b\u0435\u0433\u043a\u0438\u0439 debugging \u0442\u0435\u0441\u0442\u043e\u0432 (\u0443 Cypress \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 GUI \u0441 time-travel \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u0432 \u0442\u0435\u0441\u0442\u0435).  <\/li>\n<\/ol>\n<p>  \u042d\u0442\u0438 \u043f\u0443\u043d\u043a\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043f\u044b\u0442 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0443 \u043d\u0430\u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438 \u0431\u044b\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0442\u0430\u0440\u0442. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043f\u0443\u0442\u044c, \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 \u0448\u0438\u0448\u043a\u0438 \u043d\u0430\u0431\u0438\u043b\u0438, \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0446\u0435\u043f\u0442\u0430\u043c\u0438 \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e.<\/p>\n<h1>\u041d\u0430\u0447\u0430\u043b\u043e \u043f\u0443\u0442\u0438<\/h1>\n<p>  \u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Angular Workspace \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 Cypress \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u043f\u043a\u0430 cypress \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0432 package.json \u0441\u043a\u0440\u0438\u043f\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432, \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\u0412 index.html \u0431\u044b\u043b\u0438 \u0437\u0430\u0448\u0438\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445.  <\/li>\n<li>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0443\u0449\u0435\u043d.  <\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 index.html \u0440\u0435\u0448\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0435 \u0441ypress, \u2014 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 index.html. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432 angular.json \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u043a\u0446\u0438\u044e build, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f Cypress \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f serve-\u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f build:<\/p>\n<pre><code class=\"json\">&quot;build&quot;: { \u00a0... \u00a0&quot;configurations&quot;: { \u00a0\u00a0\u00a0\u2026 \/\/ \u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u00a0\u00a0\u00a0&quot;cypress&quot;: { \u00a0\u00a0\u00a0\u00a0\u00a0&quot;aot&quot;: true, \u00a0\u00a0\u00a0\u00a0\u00a0&quot;index&quot;: &quot;projects\/main-app-integrations\/src\/fixtures\/index.html&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0&quot;fileReplacements&quot;: [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;replace&quot;: &quot;projects\/main-app\/src\/environments\/environment.ts&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;with&quot;: &quot;projects\/main-app\/src\/environments\/environment.prod.ts&quot; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0] \u00a0\u00a0\u00a0} \u00a0} }<\/code><\/pre>\n<p>  \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 serve:<\/p>\n<pre><code class=\"json\">&quot;serve&quot;: { \u00a0... \u00a0&quot;configurations&quot;: { \u00a0\u00a0\u00a0\u2026 \/\/ \u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u00a0\u00a0\u00a0&quot;cypress&quot;: { \u00a0\u00a0\u00a0\u00a0\u00a0&quot;browserTarget&quot;: &quot;main-app:build:cypress&quot; \u00a0\u00a0\u00a0} \u00a0} }<\/code><\/pre>\n<p>  \u0418\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e: \u0434\u043b\u044f cypress \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c aot \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441 environment \u2014 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f prod-like \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0441 index.html \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <b>start-server-and-test<\/b> \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u044b:<\/p>\n<pre><code class=\"json\">\u00a0&quot;main-app:cy:run&quot;: &quot;cypress run&quot;, \u00a0&quot;main-app:cy:open&quot;: &quot;cypress open&quot;, \u00a0&quot;main-app:integrations&quot;: &quot;start-server-and-test main-app:serve:cypress http:\/\/localhost:8808\/app\/user\/ main-app:cy:run&quot;, \u00a0&quot;main-app:integrations:open&quot;: &quot;start-server-and-test main-app:serve:cypress http:\/\/localhost:8808\/app\/user\/ main-app:cy:open&quot;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0442\u0443\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432: open \u0438 run. \u0420\u0435\u0436\u0438\u043c open \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 GUI \u0441\u0430\u043c\u043e\u0433\u043e Cypress, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c time-travel. \u0420\u0435\u0436\u0438\u043c run \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0433\u043e\u043d \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 CI.<\/p>\n<p>  \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0435\u0433\u043e \u0432 CI.<\/p>\n<h1>\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h1>\n<p>  \u0423 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0435\u0441\u043b\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0432\u0430 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u043e\u0439 \u043d\u0435\u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d. \u0422\u0430\u043a \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0443 \u043d\u0430\u0441. \u041d\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Cypress \u043c\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u043b\u0438 \u043d\u0430 NX, \u0430 \u044d\u0442\u043e\u0442 \u043a\u0440\u0430\u0441\u0430\u0432\u0435\u0446 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Cypress. \u041a\u0430\u043a\u043e\u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043d\u0435\u043c:<\/p>\n<ol>\n<li>\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 main-app, \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 main-app-e2e.  <\/li>\n<li>\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0439\u0442\u0435 main-app-e2e \u0432 main-app-integrations \u2014 \u0432\u044b \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b.  <\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u2014 <b>ng e2e main-app-integrations.<\/b> NX \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 main-app, \u0434\u043e\u0436\u0434\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0442\u0435, \u043a\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Angular Workspace, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0440\u0435\u0446\u0435\u043f\u0442 \u0438 \u0434\u043b\u044f \u0432\u0430\u0441. \u0424\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0438 \u0443 NX:<\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043f\u043a\u0443 main-app-integrations.  <\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 \u043d\u0435\u0439 \u043f\u0430\u043f\u043a\u0443 src \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u043c \u0432 \u043d\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043f\u043a\u0438 cypress.  <\/li>\n<li>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 cypress.json (\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u043d\u0435) \u0432 \u043f\u0430\u043f\u043a\u0443 main-app-integrations.  <\/li>\n<li>\u041f\u0440\u0430\u0432\u0438\u043c cypress.json, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043f\u0443\u0442\u0438 \u0434\u043e \u043d\u043e\u0432\u044b\u0445 \u043f\u0430\u043f\u043e\u043a \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b integrationFolder, pluginsFile \u0438 supportFile).  <\/li>\n<li>Cypress \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 \u043b\u044e\u0431\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445, \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0430\u043f\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <br \/>  project, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 cypress run\/open \u043d\u0430 <b>cypress run\/open -\u2013project .\/projects\/main-app-integrations\/src<\/b>.  <\/li>\n<\/ol>\n<p>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 Angular Workspace \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f NX, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0430\u043f\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u0438 \u043e\u043d\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u0432\u0430\u0448\u0435\u043c \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/nrwl\/nx\/tree\/master\/packages\/cypress\">\u0431\u0438\u043b\u0434\u0435\u0440 \u043e\u0442 NX \u0434\u043b\u044f Cypress<\/a> (<a href=\"https:\/\/github.com\/nrwl\/nx-examples\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 NX \u0441 Cypress, \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 nx-cypress \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u2014 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 angular.json \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 <br \/>  cart-e2e \u0438 products-e2e).<\/p>\n<h1>Visual Regressing<\/h1>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u044f\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u044b \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0438\u0441\u044c \u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0432\u0435\u0434\u044c, \u043f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0441\u043b\u043e\u0432\u043e \u00ab\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00bb \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u043e\u043b\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0443\u0442\u044c \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u044b\u043b \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c. \u0414\u0430\u043b\u0435\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <b>cypress-image-snapshot<\/b>. \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0442\u043d\u044f\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u0432\u043e\u0442 \u0441\u043f\u0443\u0441\u0442\u044f 20 \u043c\u0438\u043d\u0443\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 1000 \u00d7 600 px. \u0420\u0430\u0434\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e, \u0432\u0435\u0434\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438, \u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u0430 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u044f\u0442\u0438 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 CI, \u043a\u0430\u043a \u0438\u0442\u043e\u0433 \u2014 \u0431\u0438\u043b\u0434 \u0440\u0430\u0437\u0432\u0430\u043b\u0438\u043b\u0441\u044f. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434 open \u0438 run, <a href=\"https:\/\/github.com\/cypress-io\/cypress\/issues\/2102\">\u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/a> \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c: \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 CI-\u0440\u0435\u0436\u0438\u043c\u0435, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0431\u0440\u0430\u043b\u0438 \u0441\u043d\u044f\u0442\u0438\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0432 local-\u0440\u0435\u0436\u0438\u043c\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">Cypress.Commands.overwrite( \u00a0\u00a0\u00a0'matchImageSnapshot', \u00a0\u00a0\u00a0(originalFn, subject, fileName, options) =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Cypress.env('ci')) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return originalFn(subject, fileName, options); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return subject; \u00a0\u00a0\u00a0}, );<\/code><\/pre>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 env \u0432 Cypress, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 <a href=\"https:\/\/docs.cypress.io\/guides\/guides\/environment-variables.html#Setting\">\u043f\u0443\u0442\u044f\u043c\u0438.<\/a><\/p>\n<h2>\u0428\u0440\u0438\u0444\u0442\u044b<\/h2>\n<p>  \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 CI. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438\u0436\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c47\/871\/7c9\/c478717c9f575e7c1fcd6e1282a27a02.png\"><\/p>\n<p>  \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0432 \u0448\u0440\u0438\u0444\u0442\u0430\u0445 \u043d\u0430 diff-\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435. \u042d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0431\u044b\u043b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 macOS, \u0430 \u0432 CI \u043d\u0430 \u0430\u0433\u0435\u043d\u0442\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Linux.<\/p>\n<h3>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041f\u043e\u0434\u043e\u0431\u0440\u0430\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 (\u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e \u0431\u044b\u043b Ubuntu Font), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0432\u0430\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 diff, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u0448\u0440\u0438\u0444\u0442 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 (\u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <br \/>  index.html, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f cypress-\u0442\u0435\u0441\u0442\u043e\u0432). \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u044b\u0441\u0438\u043b\u0438 \u043e\u0431\u0449\u0438\u0439 diff \u0434\u043e 0,05% \u0438 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 diff \u0434\u043e 20%. \u0421 \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u044b \u043f\u0440\u043e\u0436\u0438\u043b\u0438 \u043d\u0435\u0434\u0435\u043b\u044e \u2014 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0431\u0438\u043b\u0434 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0437\u0435\u043b\u0435\u043d\u044b\u043c, \u0445\u043e\u0442\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043c\u044b \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c.<\/p>\n<h3>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u2014 Docker. \u0414\u043b\u044f Cypress \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/cypress-io\/cypress-docker-images\">\u0433\u043e\u0442\u043e\u0432\u044b\u0435 docker-\u043e\u0431\u0440\u0430\u0437\u044b.<\/a> \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 included, \u0442\u0430\u043a \u043a\u0430\u043a Cypress \u0432 \u043d\u0435\u043c \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u043e\u0431\u0440\u0430\u0437 \u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 Cypress binary (GUI Cypress \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/docs.cypress.io\/guides\/getting-started\/installing-cypress.html#Installing\">\u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/a>, \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 docker-\u043e\u0431\u0440\u0430\u0437\u0430).<br \/>  \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 included docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0439 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u0441\u0435\u0431\u044f \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0444\u0430\u0439\u043b integration-tests.Dockerfile \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"bash\">FROM cypress:included:4.3.0 COPY package.json \/app\/ COPY package-lock.json app\/ WORKDIR \/app RUN npm ci COPY \/ \/app\/ ENTRYPOINT []<\/code><\/pre>\n<p>  \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 ENTRYPOINT, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u0434\u0430\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 cypress\/included \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 cypress run, \u0447\u0442\u043e \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448 dockerfile \u043d\u0430 <a href=\"https:\/\/docs.docker.com\/storage\/storagedriver\/\">\u0441\u043b\u043e\u0438<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e npm ci.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c .dockerignore \u0444\u0430\u0439\u043b (\u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442) \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0432 \u043d\u0435\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c node-modules\/ \u0438 *\/node-modules\/.<\/p>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 Docker \u043d\u0430\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0448\u0435\u043c <b>bash-\u0441\u043a\u0440\u0438\u043f\u0442 integration-tests.sh<\/b> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"bash\">docker build -t integrations -f integration-tests.Dockerfile . docker run --rm -v $PWD\/projects\/main-app-integrations\/src:\/app\/projects\/main-app-integrations\/src integrations:latest npm run main-app:integrations<\/code><\/pre>\n<p>  \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0431\u0438\u043b\u0434\u0438\u043c \u043d\u0430\u0448 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 integration-tests.Dockerfile \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c volume \u043d\u0430 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438\u0437 Docker.<\/p>\n<h3>\u0421\u043d\u043e\u0432\u0430 \u0448\u0440\u0438\u0444\u0442\u044b<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435, \u0432 \u0431\u0438\u043b\u0434\u0430\u0445 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0437\u0430\u0442\u0438\u0448\u044c\u0435, \u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 (\u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2b4\/1b9\/f22\/2b41b9f22ccc8e2206d7571074318753.png\"><\/p>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u0441\u0430\u043c\u044b\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432 \u043f\u043e\u043f\u0430\u043f\u0435. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0448\u0440\u0438\u0444\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u0447\u0435\u0440\u0435\u0437 assets, \u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u043d\u0430 CDN.<\/p>\n<h3>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0448\u0440\u0438\u0444\u0442\u044b \u0441 CDN, \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 assets \u0434\u043b\u044f cypress-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c <br \/>  index.html \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u0445. \u0421 \u0442\u0430\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u043f\u0440\u043e\u0436\u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442. \u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<h3>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0432 <br \/>  index.html \u0434\u043b\u044f cypress-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"css\">&lt;link\t \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rel=&quot;preload&quot; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0href=&quot;....&quot;\t \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0as=&quot;font&quot;\t \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=&quot;font\/woff2&quot;\t \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0crossorigin=&quot;anonymous&quot; \/&gt;<\/code><\/pre>\n<p>  \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437-\u0437\u0430 \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0448\u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430, \u043d\u043e \u043d\u0435 \u0434\u043e \u043d\u0443\u043b\u044f: \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0448\u0440\u0438\u0444\u0442 \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f. \u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437 KitchenSink \u0441\u0430\u043c\u043e\u0433\u043e Cypress \u2014 <a href=\"https:\/\/github.com\/cypress-io\/cypress-example-recipes\/tree\/master\/examples\/testing-dom__wait-for-resource\">waitForResource.<\/a><br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 visit \u0432 Cypress, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u043d\u043e \u0438 \u0436\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u0447\u0442\u043e waitForResource \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u043d\u043e \u0438 \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a (\u0438\u0437-\u0437\u0430 \u043d\u0438\u0445 \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0436\u0435 \u043b\u043e\u043c\u0430\u043b\u0438\u0441\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b, \u0438 waitForResource \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e). \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0448\u0440\u0438\u0444\u0442\u0430\u043c\u0438 \u0438 \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<h3>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u0438<\/h3>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0437 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 \u0433\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0439 \u0434\u0435\u043d\u044c. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043b\u0438\u0431\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u0434\u0435\u043b\u0430\u043d \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0422\u0430\u043a\u0438\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b, \u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u044f. \u0422\u0430\u043a \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u043c\u044b \u0448\u043b\u0438 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438?<\/p>\n<h4>\u041f\u0435\u0440\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435: \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0443\u0441\u043f\u0435\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f. \u0428\u043b\u0438 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 100ms, 200ms, 500ms \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 1000ms. \u041e\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430\u0437\u0430\u0434, \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0436\u0430\u0441\u043d\u044b\u043c, \u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0447\u044c \u0432\u0430\u0441 \u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u0447\u0435\u043c\u0443 \u0443\u0436\u0430\u0441\u043d\u044b\u043c? \u0412\u0440\u0435\u043c\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0440\u0430\u0437\u043d\u043e\u0435, \u0430\u0433\u0435\u043d\u0442\u044b \u0432 CI \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u0442\u0443\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u043e\u0433\u0434\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0442 \u0440\u0430\u0437\u0430 \u043a \u0440\u0430\u0437\u0443 \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043d\u044b\u043c.<\/p>\n<h4>\u0412\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0414\u0430\u0436\u0435 \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0432 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0441\u043f\u0435\u0432\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0435\u0441\u0435\u0440\u0447\u0430 \u043d\u0430\u0448\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0443 Angular \u2014 <a href=\"https:\/\/angular.io\/api\/core\/Testability\">Testability.<\/a> \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 ZoneJS:<\/p>\n<pre><code class=\"javascript\">Cypress.Commands.add('waitStableState', () =&gt; { \u00a0\u00a0\u00a0return cy.window().then(window =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const [testability]: [Testability] = window.getAllAngularTestabilities();  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return new Cypress.Promise(resolve =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0testability.whenStable(() =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resolve(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, 3000); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0}); });<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: cy.wait(1000) \u0438 cy.waitStableState().<\/p>\n<p>  \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u0443\u043f\u0430\u0432\u0448\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0432 \u0442\u0435\u0441\u0442\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f 5 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c 1,5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c (\u044f \u043d\u0435 \u0437\u0430\u043c\u0435\u0440\u044f\u043b \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0437\u044f\u043b \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043f\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f\u043c). \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0432 \u0442\u0435\u0441\u0442\u0435 \u043c\u044b \u0442\u0440\u0430\u0442\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e 12,5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 20 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 5 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c ~4 \u043c\u0438\u043d\u0443\u0442\u044b \u043f\u0440\u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f 20 \u0442\u0435\u0441\u0442\u0430\u0445.\u00a0<\/p>\n<p>  \u041d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435, \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043d\u0435 \u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f, \u0430 \u0432 CI \u2014 \u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f, \u0438 \u0438\u0437-\u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043b\u0431\u0435\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 debounce Time, \u0447\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0442\u0435\u0441\u0442\u0430\u0445, \u0432\u0435\u0434\u044c \u0432 CI \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.<\/p>\n<h4>\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 Angular-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439. \u041d\u0430\u0448 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 DOM \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 ng-animating. \u042d\u0442\u043e \u0438 \u0441\u0442\u0430\u043b\u043e \u043a\u043b\u044e\u0447\u043e\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0432\u0435\u0434\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432 \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"javascript\">export function waitAnimation(element: Chainable&lt;JQuery&gt;): Chainable&lt;JQuery&gt; { \u00a0\u00a0 return element.should('be.visible').should('not.have.class', 'ng-animating'); }<\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043b\u0435\u0433\u043b\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0443 \u043d\u0430\u0448\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041d\u0430 \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435: \u0434\u0435\u043b\u0430\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0430\u0448 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c, \u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c assertion, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u043d\u0430 CSS. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c Cypress, \u043b\u044e\u0431\u044b\u0435 assertion \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0436\u0434\u0443\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043d\u0435\u043c \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 <a href=\"https:\/\/docs.cypress.io\/guides\/core-concepts\/interacting-with-elements.html#Animations\">\u0442\u0443\u0442<\/a> \u0438 <a href=\"https:\/\/docs.cypress.io\/faq\/questions\/using-cypress-faq.html#Some-of-my-elements-animate-in-how-do-I-work-around-that\">\u0442\u0443\u0442<\/a>. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e assertion \u2014 <b>should(\u2018be.visible\u2019)\/should(\u2018not.be.visible\u2019)<\/b> \u2014 \u0438 Cypress \u0441\u0430\u043c \u0434\u043e\u0436\u0434\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 ng-animating \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a Cypress, \u043d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 waitAnimation).<\/p>\n<p>  \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, Cypress \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 fadeIn\/fadeOut-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u043e\u0442 \u0436\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \/ \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\u00a0<\/p>\n<p>  \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0435 \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f cy.wait(1000) + cy.waitStableState() \u043d\u0430 waitAnimation \u0438 Cypress Assertion \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c ~2 \u0447\u0430\u0441\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u0440\u044b\u0445 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043d\u043e \u043a\u0430\u043a \u0438\u0442\u043e\u0433 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 +20\u201430 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u043c\u0435\u0441\u0442\u043e +4 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432.\u00a0\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0432\u044c\u044e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043d\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 DOM \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u0442\u0435\u0441\u0442\u0435 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u00ab\u0441\u043a\u0435\u043b\u0435\u0442\u043e\u043d\u043e\u0432\u00bb \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0432 DOM \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0435\u043b\u0435\u0442\u043e\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043e\u0434\u043d\u0430: \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 \u0438 \u043e\u043d \u0432\u0441\u0435 \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c \u0432 CI. \u0421\u043f\u043e\u0441\u043e\u0431 \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u044d\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u2014 \u0438\u0434\u0442\u0438 \u0438 \u0442\u0443\u0442 \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430, \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0441\u043d\u0435\u0436\u043d\u044b\u0439 \u043a\u043e\u043c \u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<h4>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432<\/h4>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 1000 \u00d7 600 px. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043e\u043a\u043d\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 Docker: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0447\u0435\u0440\u0435\u0437 Cypress \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 viewport\u2019\u0430, \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u041c\u044b \u043d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome (\u0434\u043b\u044f Electron \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c <a href=\"https:\/\/github.com\/cypress-io\/cypress\/issues\/3324\">issue<\/a> \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0437\u0430\u0432\u0435\u043b\u043e\u0441\u044c). \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 Chrome:<\/p>\n<ol>\n<li>\u041d\u0435 \u0434\u043b\u044f NX \u0434\u0435\u043b\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 &#8212;browser chrome \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b cypress open\/run \u0438 \u0434\u043b\u044f run-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#8212;headless.  <\/li>\n<li>\u0414\u043b\u044f NX \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 angular.json \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 browser: chrome, \u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 CI, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c headless: true.  <\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 plugins \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 1440 \u00d7 900 px:<\/p>\n<pre><code class=\"javascript\">module.exports = (on, config) =&gt; { \u00a0\u00a0\u00a0on('before:browser:launch', (browser, launchOptions) =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (browser.name === 'chrome' &amp;&amp; browser.isHeadless) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0launchOptions.args.push('--disable-dev-shm-usage'); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0launchOptions.args.push('--window-size=1440,1200');  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return launchOptions; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return launchOptions; \u00a0\u00a0\u00a0}); };<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0414\u0430\u0442\u044b<\/h4>\n<p>  \u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439, \u0441\u043d\u044f\u0442\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0432\u0442\u0440\u0430 \u0443\u043f\u0430\u0434\u0435\u0442. \u0424\u0438\u043a\u0441\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"javascript\">cy.clock(new Date(2025, 11, 22, 0).getTime(), ['Date']);<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u0439\u043c\u0435\u0440\u044b. \u041c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u043f\u0446\u0438\u044e blackout \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">cy.matchImageSnapshot('salary_signing-several-payments', { \u00a0\u00a0\u00a0blackout: ['.timer'], });<\/code><\/pre>\n<p>  <\/p>\n<h4>Flaky-\u0442\u0435\u0441\u0442\u044b<\/h4>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u043d\u0435 100%, \u0432\u0435\u0434\u044c \u043d\u0430 \u0442\u0435\u0441\u0442\u044b \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u043a\u043e\u0434, \u043d\u043e \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0440\u0435\u0434\u043a\u0430 \u043f\u0430\u0434\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 CI. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u0441\u0442 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 assertion \u043f\u0435\u0440\u0435\u0434 \u0441\u043d\u044f\u0442\u0438\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043d\u043e \u043d\u0430 \u043f\u0435\u0440\u0438\u043e\u0434 \u043f\u043e\u0447\u0438\u043d\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c retry \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/Bkucera\/cypress-plugin-retries\">cypress-plugin-retries.<\/a><\/p>\n<h1>\u041f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c CI<\/h1>\n<p>  \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0433\u043b\u0430\u0432\u0430\u0445 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0438 \u0443\u0437\u043d\u0430\u043b\u0438 \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 CI. \u0412 \u043d\u0430\u0448\u0435\u043c \u0431\u0438\u043b\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f:<\/p>\n<ol>\n<li>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 npm ci.<\/li>\n<li>\u041f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 aot-\u0440\u0435\u0436\u0438\u043c\u0435.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/li>\n<\/ol>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u043d\u043a\u0442 \u0438 \u043f\u043e\u0439\u043c\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0448\u0430\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0430\u0448\u0435\u043c \u0431\u0438\u043b\u0434\u0435 \u0432 CI \u2014 \u0431\u0438\u043b\u0434 \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435 ng serve, \u0430 ng build. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0431\u0438\u043b\u0434\u0435 \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043d\u0438\u043c, \u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u043b\u0434\u0430 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c? \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 <br \/>  npm ci + npm start \u0432 aot-\u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0430 \u0430\u0433\u0435\u043d\u0442\u0435 \u0432 CI \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e ~15 \u043c\u0438\u043d\u0443\u0442, \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430, \u0438 \u0435\u0449\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e 20+ \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043d\u0430 19-\u043c \u0442\u0435\u0441\u0442\u0435 \u0443 \u0432\u0430\u0441 \u043f\u0430\u0434\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u044b, \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0430\u0433\u0435\u043d\u0442. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0438\u043b\u0434\u0430 \u2014 \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0441\u043a\u0430\u043c\u0438 \u0432 CI, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0434\u0435\u0440\u0436\u0438\u043c, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0431\u0438\u043b\u0434 \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441 \u0442\u0430\u0441\u043a\u0438 \u043f\u043e \u0431\u0438\u043b\u0434\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439<\/h2>\n<p>  \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0430 ng serve \u043f\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u043d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u2014 <b>angular-http-server<\/b>. \u0412 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e: \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0448\u0430 \u0441\u0442\u0430\u0442\u0438\u043a\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f.<\/p>\n<p>  \u042d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043d\u0430 \u0446\u0435\u043b\u044b\u0445 20 \u043c\u0438\u043d\u0443\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f angular-http-server \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 <b>Express<\/b>. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0430\u043c express \u0438 express-http-proxy. \u0420\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0441\u0442\u0430\u0442\u0438\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <br \/>  express.static, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u044d\u0442\u043e\u0442:<\/p>\n<pre><code class=\"javascript\">const express = require('express'); const appStaticPathFolder = '.\/dist'; const appBaseHref = '.\/my\/app'; const port = 4200; const app = express();  app.use((req, res, next) =&gt; { \u00a0\u00a0\u00a0const accept = req \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.accepts() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.join() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.replace('*\/*', '');  \u00a0\u00a0\u00a0if (accept.includes('text\/html')) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0req.url = baseHref; \u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0next(); }); app.use(appBaseHref, express.static(appStaticPathFolder)); app.listen(port);<\/code><\/pre>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u043e\u0443\u0442\u0430 \u043f\u043e baseHref \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 index.html. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 baseHref. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u044e\u043a, \u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u0440\u043e\u043c\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439, \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0442\u044c 404 \u043e\u0448\u0438\u0431\u043a\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0449\u0435\u043f\u043e\u0442\u043a\u0443 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">const proxy = require('express-http-proxy');  app.use( \u00a0\u00a0\u00a0'\/common', \u00a0\u00a0\u00a0proxy('https:\/\/qa-stand.ru', { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0proxyReqPathResolver: req =&gt; '\/common' + req.url, \u00a0\u00a0\u00a0}), );<\/code><\/pre>\n<p>  \u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435. \u0415\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b:<\/p>\n<ol>\n<li>appStaticForlderPath \u2014 \u043f\u0430\u043f\u043a\u0430, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/li>\n<li>appBaseHref \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c baseHref, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u2018\/\u2019.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0436\u0435 \u043c\u044b \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \/common, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0440\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u043f\u0443\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 proxyReqPathResolver. \u0415\u0441\u043b\u0438 \u0435\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0442\u0438 \u043d\u0430<a href=\"https:\/\/qa-stand.ru.\/\">https:\/\/qa-stand.ru.<\/a><\/p>\n<h2>\u041a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f index.html<\/h2>\n<p>  \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c index.html, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0438 ng serve \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Cypress. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 node.js. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b index.modern.html, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 index.html \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b:<\/p>\n<pre><code class=\"javascript\">const fs = require('fs'); const appStaticPathFolder = '.\/dist';  fs.copyFileSync(appStaticPathFolder + '\/index.modern.html', appStaticPathFolder + '\/index.html');  fs.readFile(appStaticPathFolder + '\/index.html', 'utf-8', (err, data) =&gt; { \u00a0\u00a0\u00a0const newValue = data \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.replace( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'&lt;script type=&quot;text\/javascript&quot; src=&quot;\/auth.js&quot;&gt;&lt;\/script&gt;', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.replace( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'&lt;script type=&quot;text\/javascript&quot; src=&quot;\/analytics.js&quot;&gt;&lt;\/script&gt;', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0);  \u00a0\u00a0\u00a0fs.writeFileSync(appStaticPathFolder + '\/index.html', newValue, 'utf-8'); });<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u043a\u0440\u0438\u043f\u0442\u044b<\/h2>\n<p>  \u041e\u0447\u0435\u043d\u044c \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 CI \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u0440\u0430\u0437 npm ci \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (\u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432 \u0442\u0430\u0441\u043a\u0435 \u0441 \u0431\u0438\u043b\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u043f\u043e\u0434 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c package.json. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, integration-tests-scripts \u0438 \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0442\u0443\u0434\u0430 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430: server.js, create-index.js, package.json. \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u044b\u0448\u0435, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 package.json:<\/p>\n<pre><code class=\"json\">{ \u00a0&quot;name&quot;: &quot;cypress-tests&quot;, \u00a0&quot;version&quot;: &quot;0.0.0&quot;, \u00a0&quot;private&quot;: true, \u00a0&quot;scripts&quot;: { \u00a0\u00a0\u00a0&quot;create-index&quot;: &quot;node .\/create-index.js&quot;, \u00a0\u00a0\u00a0&quot;main-app:serve&quot;: &quot;node .\/server.js&quot;, \u00a0\u00a0\u00a0&quot;main-app:cy:run&quot;: &quot;cypress run --project .\/projects\/main-app-integrations &quot;, \u00a0\u00a0\u00a0&quot;main-app:integrations&quot;: &quot;npm run create-index &amp;&amp; start-server-and-test main-app:serve http:\/\/localhost:4200\/my\/app\/ main-app:cy:run&quot; \u00a0}, \u00a0&quot;devDependencies&quot;: { \u00a0\u00a0\u00a0&quot;@cypress\/webpack-preprocessor&quot;: &quot;4.1.0&quot;, \u00a0\u00a0\u00a0&quot;@types\/express&quot;: &quot;4.17.2&quot;, \u00a0\u00a0\u00a0&quot;@types\/mocha&quot;: &quot;5.2.7&quot;, \u00a0\u00a0\u00a0&quot;@types\/node&quot;: &quot;8.9.5&quot;, \u00a0\u00a0\u00a0&quot;cypress&quot;: &quot;4.1.0&quot;, \u00a0\u00a0\u00a0&quot;cypress-image-snapshot&quot;: &quot;3.1.1&quot;, \u00a0\u00a0\u00a0&quot;express&quot;: &quot;4.17.1&quot;, \u00a0\u00a0\u00a0&quot;express-http-proxy&quot;: &quot;^1.6.0&quot;, \u00a0\u00a0\u00a0&quot;start-server-and-test&quot;: &quot;1.10.8&quot;, \u00a0\u00a0\u00a0&quot;ts-loader&quot;: &quot;6.2.1&quot;, \u00a0\u00a0\u00a0&quot;typescript&quot;: &quot;3.8.3&quot;, \u00a0\u00a0\u00a0&quot;webpack&quot;: &quot;4.41.6&quot; \u00a0} }<\/code><\/pre>\n<p>  \u0412 package.json \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 (<a href=\"https:\/\/github.com\/cypress-io\/cypress-example-recipes\/tree\/better-ts-webpack-recipe\/examples\/preprocessors__typescript-webpack\">\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 typescript <\/a>\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e index.html \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0438\u0437 \u0433\u043b\u0430\u0432\u044b \u043f\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 Angular Workspace start-server-and-test.<\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a<\/h2>\n<p>  \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u043d\u043e\u0432\u044b\u0439 Dockerfile \u2014 <b>integration-tests-ci.Dockerfile<\/b>:<\/p>\n<pre><code class=\"bash\">FROM cypress\/included:4.3.0 COPY integration-tests-scripts \/app\/ WORKDIR \/app RUN npm ci COPY projects\/main-app-integrations \/app\/projects\/main-app-integrations COPY dist \/app\/dist COPY tsconfig.json \/app\/ ENTRYPOINT []<\/code><\/pre>\n<p>  \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 integration-tests-scripts \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 (\u0443 \u0432\u0430\u0441 \u044d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f). \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u044c docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 CI.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <b>integration-tests-ci.sh<\/b> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"bash\">docker build -t integrations -f integration-tests-ci.Dockerfile . docker run --rm -v $PWD\/projects\/main-app-integrations\/src:\/app\/projects\/main-app-integrations\/src integrations:latest npm run main-app:integrations<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c \u0441\u0442\u0430\u043d\u0435\u0442 package.json \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 integration-tests-scripts \u0438 \u0432 \u043d\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 main-app:integrations. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u043f\u0430\u043f\u043a\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u0435\u043d\u044c, \u0442\u043e \u0438 \u043f\u0443\u0442\u0438 \u0434\u043e \u043f\u0430\u043f\u043a\u0438 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441 \u043c\u044b\u0441\u043b\u044c\u044e, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043d\u044f, \u0430 \u043d\u0435 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 integration-tests-scripts.<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443: \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 bash-\u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e \u043c\u0435\u0440\u0435 \u0435\u0433\u043e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u0422\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0423 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 integration-tests.sh, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-remove-docker-images-containers-and-volumes\">\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 bash<\/a>, \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h1>\u0418\u0442\u043e\u0433<\/h1>\n<p>  \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u2014 \u0434\u0443\u043c\u0430\u044e, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0438\u0442\u043e\u0433 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.<br \/>  \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u0449\u0435\u043f\u043e\u0442\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\u0421\u0442\u0430\u0432\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f Cypress.<\/li>\n<li>\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438:<br \/> \n<ol>\n<li>Angular Single Application \u2014 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435 cypress.<\/li>\n<li>Angular Workspace \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0438\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f-integrations \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u0435\u0441\u0442\u044b, \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0432 \u043d\u0435\u0435 \u0432\u0441\u0435 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 cypress.<\/li>\n<li>NX \u2014 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437 \u0438\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f-e2e \u0432 \u0438\u043c\u044f-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f-integrations.<\/li>\n<\/ol>\n<p>  <\/li>\n<li>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f cypress-\u0441\u0431\u043e\u0440\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 build-\u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Cypress, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u043c aot, \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u043d\u0430 \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 index.html, \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u0444\u0430\u0439\u043b\u0430 environment \u043d\u0430 prod-\u0444\u0430\u0439\u043b \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 serve-\u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0443 Cypress (\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 prod-\u0441\u0431\u043e\u0440\u043a\u0438, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c).<\/li>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0443 \u0442\u0435\u0441\u0442\u043e\u0432:<br \/> \n<ol>\n<li>Angular Single Application \u2014 \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 serve-\u043e\u043c cypress-\u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e start-server-and-test.<\/li>\n<li>Angular Workspace \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 Angular Single Application, \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0434\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 cypress run\/open.<\/li>\n<li>NX \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434 ng e2e.<\/li>\n<\/ol>\n<p>  <\/li>\n<li>\u041f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<br \/> \n<ol>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c cypress-image-snapshot.<\/li>\n<li>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 CI.<\/li>\n<li>\u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u043d\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u0435. \u0415\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0443 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0434\u0435\u043c \u0435\u0435 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Cypress Assertion \u043d\u0430 \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/li>\n<li>\u0414\u0430\u0442\u0443 \u043c\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 cy.clock \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u043f\u0446\u0438\u044e blackout \u043f\u0440\u0438 \u0441\u043d\u044f\u0442\u0438\u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430.<\/li>\n<li>\u041b\u044e\u0431\u0443\u044e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u043a\u0443 \u0432 runtime \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 cy.waitForResource (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0448\u0440\u0438\u0444\u0442\u044b \u0438 \u0442. \u0434.).<\/li>\n<\/ol>\n<p>  <\/li>\n<li>\u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 Docker:<br \/> \n<ol>\n<li>\u0413\u043e\u0442\u043e\u0432\u0438\u043c Dockerfile.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c bash-\u0444\u0430\u0439\u043b.<\/li>\n<\/ol>\n<p>  <\/li>\n<\/ol>\n<p>  \u00a0\u041f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\u0412 CI \u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u043b\u0434\u0430\u043c\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0430\u0441).<\/li>\n<li>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0430\u043f\u043a\u0443 integration-tests-scripts:<br \/> \n<ol>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e index.html (\u0435\u0441\u043b\u0438 \u0432\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 index.html \u2014 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0438\u043f\u0430\u0442\u044c).<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 package.json \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/li>\n<li>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 Dockerfile.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c bash-\u0444\u0430\u0439\u043b.<\/li>\n<\/ol>\n<p>  <\/li>\n<\/ol>\n<p>  <\/p>\n<h1>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h1>\n<p>  <\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/vladiag\/cypress-example\">Angular Workspace + Cypress + CI<\/a> \u2014 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0431\u0430\u0437\u0443 \u0434\u043b\u044f Angular Workspace \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043d\u0430\u043a\u0440\u0443\u0447\u0435\u043d\u043d\u044b\u043c CI \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 (\u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 typescript).  <\/li>\n<li><a href=\"https:\/\/docs.cypress.io\/guides\/overview\/why-cypress.html#In-a-nutshell\">Cypress<\/a> \u2014 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b <a href=\"https:\/\/docs.cypress.io\/guides\/references\/trade-offs.html#Permanent-trade-offs-1\">trade-offs.<\/a>  <\/li>\n<li><a href=\"https:\/\/github.com\/bahmutov\/start-server-and-test\">Start-server-and-test<\/a> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432.  <\/li>\n<li><a href=\"https:\/\/github.com\/palmerhq\/cypress-image-snapshot\">Cypress-image-snapshot<\/a> \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.  <\/li>\n<li><a href=\"https:\/\/docs.cypress.io\/examples\/examples\/recipes.html#Other-Cypress-Recipes\">Cypress recipes<\/a> \u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e Cypress, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u044b.  <\/li>\n<li><a href=\"https:\/\/medium.com\/@ilkemerogul\/flaky-tests-retrying-failed-tests-with-cypress-81bbdb630748\">Flaky Tests<\/a> \u2014 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 <a href=\"https:\/\/testing.googleblog.com\/2016\/05\/flaky-tests-at-google-and-how-we.html\">\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e \u043e\u0442 Google.<\/a>  <\/li>\n<li><a href=\"https:\/\/github.com\/cypress-io\/github-action\">Github Action<\/a> \u2014 Cypress \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0434\u043b\u044f GitHub Action, \u0432 README \u043a\u0443\u0447\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 wait-on. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/bahmutov\/cypress-gh-action-included\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 docker.<\/a>  <\/li>\n<\/ol>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/508772\/\"> https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/508772\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/508772\/\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043e\u0432\u0430, \u044f \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434\u0435\u0440 \u0432 \u0422\u0438\u043d\u044c\u043a\u043e\u0444\u0444. \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u0432\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0434\u043b\u044f \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u0446. \u041e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u044f \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0446\u0438\u0444\u0440\u0430\u043c\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u0432\u0443\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u0442\u0440\u0435\u0445 \u0434\u043d\u0435\u0439 (\u0431\u0435\u0437 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432).<\/p>\n<p>  \u0421\u0440\u043e\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u0440\u044c\u0431\u0443 \u0441 \u043d\u0438\u043c\u0438. \u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0431\u043e\u0440\u044c\u0431\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445:  <\/p>\n<ul>\n<li>\u0420\u0430\u0441\u043f\u0438\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438.  <\/li>\n<li>\u041f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 <a href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">\u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u043e\u0439.<\/a>  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0438 \u0441\u0442\u0430\u043b \u0442\u0435\u043c\u043e\u0439 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/991\/c5a\/be1\/991c5abe1cf4e709d8179040de086c0e.png\" alt=\"image\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-306113","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/306113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=306113"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/306113\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=306113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=306113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=306113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}