{"id":428033,"date":"2024-08-01T15:00:32","date_gmt":"2024-08-01T15:00:32","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=428033"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=428033","title":{"rendered":"<span>Selenoid \u0431\u0435\u0437 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430, \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e1\/b43\/218\/2e1b43218dc14c9bd9c71eac5e7e0d9c.png\" width=\"3200\" height=\"1800\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e1\/b43\/218\/2e1b43218dc14c9bd9c71eac5e7e0d9c.png\"\/><\/figure>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447<\/h2>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/773556\/\">\u043f\u0440\u043e Selenoid \u0441 Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043e\u0439 \u043f\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 Selenoid. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u044f\u0432\u0438\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0444\u0435\u043a\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u041e\u0421, \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0445\u043e\u0441\u0442\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0448\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043d\u0435\u0440\u0433\u043e\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. <\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u043b\u0443\u0447\u0448\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0447\u0435\u043c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0433\u043b\u0430\u0434\u043a\u043e. \u0423 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Selenoid \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Selenoid \u0445\u0430\u0431\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Android \u0432 USB-\u043f\u043e\u0440\u0442. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043f\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0443\u0434\u043e\u0432\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442. <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0447\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. <\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u2014 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c Selenoid \u0431\u0435\u0437 \u0414\u043e\u043a\u0435\u0440\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 Android \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 USB-\u043f\u043e\u0440\u0442.<\/p>\n<p>\u041e\u0431 \u044d\u0442\u043e\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043d\u0430 Linux \u0438 Mac \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0428\u0430\u0433 1. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/h2>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u043d\u0430\u0448\u0435\u043c Linux-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/p>\n<p>\u21161. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 BIOS. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0442, \u0436\u043c\u0451\u043c \u00abF9\u00bb \u0438\u043b\u0438 \u00abF10\u00bb.<\/p>\n<p>\u21162. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00abSecurity\u00bb \u2014 \u00abSystem Security\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/494\/0cb\/884\/4940cb88482e09f7f6fa459cef8cada5.png\" width=\"1384\" height=\"764\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/494\/0cb\/884\/4940cb88482e09f7f6fa459cef8cada5.png\"\/><\/figure>\n<p>\u21163. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u00abIntel Virtual Technology\u00bb. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00abEnabled\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448 \u00ab\u2192\u00bb, \u0430 \u0437\u0430\u0442\u0435\u043c \u0436\u043c\u0451\u043c \u00abF10\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/705\/b29\/4d7\/705b294d797c39490a2138220bc767ce.png\" width=\"1414\" height=\"768\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/705\/b29\/4d7\/705b294d797c39490a2138220bc767ce.png\"\/><\/figure>\n<p> \u21164. \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u043c\u0435\u043d\u044e \u00abFile\u00bb \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u00abSave Changes and Exit\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4b0\/69a\/a9b\/4b069aa9b6a8bdea0d3d7933ab737c06.png\" width=\"1310\" height=\"772\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b0\/69a\/a9b\/4b069aa9b6a8bdea0d3d7933ab737c06.png\"\/><\/figure>\n<h2>\u0428\u0430\u0433 2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u041f\u041e \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u21161. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Selenoid \u0438 Selenoid UI, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f Selenoid \u0438 Appium.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">mkdir selenoid<\/code><\/pre>\n<p>\u21162. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435.<\/p>\n<pre><code class=\"bash\">cd selenoid<\/code><\/pre>\n<p>\u21163. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c <a href=\"https:\/\/github.com\/aerokube\/selenoid\/releases\">\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Selenoid<\/a>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 (\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435).<\/p>\n<pre><code class=\"bash\">wget -o selenoid \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a<\/code><\/pre>\n<p>\u21164. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/github.com\/aerokube\/selenoid-ui\/releases\">\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Selenoid UI<\/a>, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a. \u0422\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<pre><code class=\"bash\">wget -o selenoid-ui \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a<\/code><\/pre>\n<p>\u21165. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nvm.<\/p>\n<pre><code class=\"bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.7\/install.sh | bash\ufffc export NVM_DIR=\"\ufffcNVM_DIR\/nvm.sh\" ] &amp;&amp; . \"\ufffcNVM_DIR\/bash_completion\" ] &amp;&amp; . \"$NVM_DIR\/bash_completion\"\u00a0 # This loadsnvm bash_completion<\/code><\/pre>\n<p>\u21166. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Node.js.<\/p>\n<pre><code class=\"bash\">sudo apt-get install -y nodejs<\/code><\/pre>\n<p>\u21167. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c npm.<\/p>\n<pre><code class=\"bash\">sudo apt install -y npm<\/code><\/pre>\n<p>\u21168. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Appium.<\/p>\n<pre><code class=\"bash\">npm install -g appium<\/code><\/pre>\n<p>\u21169. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 uiautomator.<\/p>\n<pre><code class=\"bash\">appium driver install uiautomator2<\/code><\/pre>\n<p>\u211610. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Java Azul. <a href=\"https:\/\/docs.azul.com\/core\/install\/debian\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435<\/a>. <\/p>\n<p>\u211611. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Android SDK.<\/p>\n<pre><code class=\"bash\">wget https:\/\/dl.google.com\/android\/repository\/tools_r25.2.3-linux.zip\ufffc unzip tools_r25.2.3-linux.zip -d sdk\ufffc cd \/sdk\/tools\ufffc .\/android update sdk --no-ui<\/code><\/pre>\n<p>\u211612. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0430\u043c\u0438 \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"bash\">touch $HOME\/.bash_profile<\/code><\/pre>\n<p>\u211613. \u0412 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 nano \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aab\/007\/880\/aab007880d616155b1722c79f60832d3.png\" width=\"1600\" height=\"139\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aab\/007\/880\/aab007880d616155b1722c79f60832d3.png\"\/><\/figure>\n<p> \u211614.\u00a0 \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u043d\u0432\u0430\u0439\u0440\u043e\u043d\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"bash\">source .bash_profile<\/code><\/pre>\n<p>\u211615. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c adb.<\/p>\n<pre><code class=\"bash\">sudo apt-get install adb<\/code><\/pre>\n<p>\u211616. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<pre><code class=\"bash\">git init git remote add origin &lt;\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439&gt;  git pull origin master<\/code><\/pre>\n<h2>\u0428\u0430\u0433 3. \u041b\u0438\u0441\u0442\u0438\u043d\u0433 bash \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: <\/p>\n<h4>healthCheck.sh<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 Appium \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b  <code>curl<\/code>. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e Selenoid.<\/p>\n<pre><code class=\"bash\">\u00a0\u00a0#!\/bin\/bash \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0HOST=$1 \u00a0\u00a0\u00a0PORT=$2 \u00a0\u00a0\u00a0PLATFORM_NAME=$3 \u00a0\u00a0\u00a0DEVICE_NAME=$4 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$PLATFORM_NAME\" = \"android\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0APP_PATH=\"\" \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0APP_PATH=\"\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0REQUEST_BODY=$(echo '{ \u00a0\u00a0\u00a0\"capabilities\": { \u00a0\u00a0\u00a0\"alwaysMatch\": { \u00a0\u00a0\u00a0\"browserVersion\": \"deviceNameToReplace\", \u00a0\u00a0\u00a0\"selenoid:options\": { \u00a0\u00a0\u00a0\"name\": \"Session started using curl command...\", \u00a0\u00a0\u00a0\"sessionTimeout\": \"1m\" \u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\"appium:deviceName\": \"platformNameToReplace\", \u00a0\u00a0\u00a0\"appium:app\": \"appPathToReplace\" \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0}') \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/deviceNameToReplace\/$DEVICE_NAME} \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/appPathToReplace\/$APP_PATH} \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/platformNameToReplace\/$PLATFORM_NAME} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0curl -H'Content-Type: application\/json' http:\/\/$HOST:$PORT\/wd\/hub\/session -d\"$REQUEST_BODY\"<\/code><\/pre>\n<p> \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: <\/p>\n<ul>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Selenoid \u0438 Appium. <\/p>\n<\/li>\n<li>\n<p>\u0418\u0449\u0435\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. <\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c  <code>--debug<\/code> . <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Selenoid \u0438 Appium, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. <\/p>\n<p>\u041b\u0438\u0441\u0442\u0438\u043d\u0433: <\/p>\n<pre><code class=\"bash\"> \u00a0\u00a0#!\/bin\/bash \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0get_realpath_from_egrep() { \u00a0\u00a0\u00a0search_pattern=$1 \u00a0\u00a0\u00a0search_dir=$2 \u00a0\u00a0\u00a0DIRS=$(egrep -r --include=*.sh --exclude-dir=$HOME\/Library --exclude-dir=$HOME\/.Trash \"$search_pattern\" \"$search_dir\") \u00a0\u00a0\u00a0echo $DIRS | sed \"s\/:\/\\\\n\/\" | head -n1 | xargs realpath \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0get_last_segment_from_pattern() { \u00a0\u00a0\u00a0search_pattern=$1 \u00a0\u00a0\u00a0echo \"$search_pattern\" | sed \"s\/\\\/\/\\\\n\/g\" | tail -n1 \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0FILE_NAME=\".zshrc\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f \"$HOME\/$FILE_NAME\" ]; then \u00a0\u00a0\u00a0#for mac os \u00a0\u00a0\u00a0source $HOME\/$FILE_NAME \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0FILE_NAME=\".bash_profile\" \u00a0\u00a0\u00a0#for linux \u00a0\u00a0\u00a0if [ -f \"$HOME\/$FILE_NAME\" ]; then \u00a0\u00a0\u00a0source $HOME\/$FILE_NAME \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0APPIUM_SCRIPT_FIND_BY=\"5cc2bd0d-96c5-4567-b82a-a896695af033\" \u00a0\u00a0\u00a0DEVICES_SCRIPT_FIND_BY=\"94843c3a-f128-4bb6-8819-4644156699d9\" \u00a0\u00a0\u00a0SELENOID_SCRIPT_FIND_BY=\"1b6f0b38-04e2-421c-b122-a54ab8a68bbd\" \u00a0\u00a0\u00a0SELENOID_CONFIG_SCRIPT_FIND_BY=\"660368f2-f0cc-49d8-bf2e-4a7d0f2c84d8\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_PORT=4444 \u00a0\u00a0\u00a0export CRON_SETTINGS=\"*\/15 * * * *\" \u00a0\u00a0\u00a0export SELENOID_UI_PORT=8080 \u00a0\u00a0\u00a0export SELENOID_CONFIG_NAME=devices.json \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_LIMITS=\"-disable-docker -limit 20 -retry-count 1000\" \u00a0\u00a0\u00a0SELENOID_TIMEOUTS=\"-max-timeout 20m -session-attempt-timeout 15m -timeout 10m -service-startup-timeout 10m\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_PATH=$(get_realpath_from_egrep \"$SELENOID_SCRIPT_FIND_BY\" \"$HOME\") \u00a0\u00a0\u00a0SELENOID_HOME=$(echo $SELENOID_PATH | xargs dirname) \u00a0\u00a0\u00a0APPIUM_CONFIG_PATH=$(get_realpath_from_egrep \"$APPIUM_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0SELENOID_CONFIG_PATH=$(get_realpath_from_egrep \"$SELENOID_CONFIG_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_HOME=$SELENOID_HOME \u00a0\u00a0\u00a0export SELENOID_LOGS_DIR=$SELENOID_HOME\/logs \u00a0\u00a0\u00a0export COMMON_CONFIG_DIR=$(echo $SELENOID_CONFIG_PATH | xargs dirname) \u00a0\u00a0\u00a0export APPIUM_CONFIG_DIR=$(echo $APPIUM_CONFIG_PATH | xargs dirname) \u00a0\u00a0\u00a0export DEVICES_WATCHER_PATH=$(get_realpath_from_egrep \"$DEVICES_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0export SELENOID_SCRIPT_NAME=$(get_last_segment_from_pattern \"$SELENOID_PATH\") \u00a0\u00a0\u00a0export APPIUM_CONFIG_CREATER=$(get_last_segment_from_pattern \"$APPIUM_CONFIG_PATH\") \u00a0\u00a0\u00a0export SELENOID_CONFIG_CREATER=$(get_last_segment_from_pattern \"$SELENOID_CONFIG_PATH\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0CONFIG=$COMMON_CONFIG_DIR\/$SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_ARGS=\"$SELENOID_LIMITS -listen :$SELENOID_PORT -conf $CONFIG $SELENOID_TIMEOUTS -log-output-dir $SELENOID_LOGS_DIR\" \u00a0\u00a0\u00a0export SELENOID_UI_ARGS=\"-listen :$SELENOID_UI_PORT --selenoid-uri=http:\/\/localhost:$SELENOID_PORT\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$1\" = \"--debug\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_LOGS_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $COMMON_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $APPIUM_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $DEVICES_WATCHER_PATH \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_SCRIPT_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $APPIUM_CONFIG_CREATER \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_CONFIG_CREATER \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0fi<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Selenoid \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Selenoid, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. <\/p>\n<pre><code class=\"bash\">#!\/bin\/bash #94843c3a-f128-4bb6-8819-4644156699d9 - don't delete \u00a0\u00a0\u00a0   \u00a0DIR_TO_SCRIPT=$(realpath \"$0\" | xargs dirname) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$#\" != \"1\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e .env\" \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f $1 ]; then \u00a0\u00a0\u00a0\u00a0\u00a0cd $(dirname $1) \u00a0\u00a0\u00a0\u00a0\u00a0source $1 \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0DEVICES_FILE=\"devices\" \u00a0\u00a0\u00a0DEVICES_REGISTRY_PREV=\"\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0cd $DIR_TO_SCRIPT \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f $DEVICES_FILE ]; then \u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_REGISTRY_PREV=$(cat $DEVICES_FILE) \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0touch $DEVICES_FILE \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0DEVICES=$(adb devices -l| grep -Eo \"[a-zA-Z0-9-]{4,}\\s{2,}\" | xargs -n1 echo) \u00a0\u00a0\u00a0DEVICES_COUNT=$(echo $DEVICES | wc -w) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0for ((DEVICE_INDEX=1; DEVICE_INDEX &lt;= $((DEVICES_COUNT)); DEVICE_INDEX++)) \u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0DEVICE=$(echo $DEVICES | cut -d' ' -f$DEVICE_INDEX) \u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_TO_LINE=$DEVICE,$DEVICES_TO_LINE \u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0DEVICES_TO_LINE=${DEVICES_TO_LINE:0:$((${#DEVICES_TO_LINE}-1))} \u00a0\u00a0\u00a0IS_RECONFIGURE_SELENOID=\"false\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -z \"$DEVICES_REGISTRY_PREV\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0IS_RECONFIGURE_SELENOID=\"true\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0IFS=',' read -r -a DEVICE_UDIDS &lt;&lt;&lt; \"$DEVICES_REGISTRY_PREV\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0#previously registry device was disconnected \u00a0\u00a0\u00a0\u00a0\u00a0for UDID in \"${DEVICE_UDIDS[@]}\" \u00a0\u00a0\u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE_LINE=$(echo $DEVICES | grep $UDID) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$DEVICE_LINE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_RECONFIGURE_SELENOID=\"true\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0#registry new device was connected \u00a0\u00a0\u00a0\u00a0\u00a0for ((DEVICE_INDEX=1; DEVICE_INDEX &lt;= $((DEVICES_COUNT)); DEVICE_INDEX++)) \u00a0\u00a0\u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE=$(echo $DEVICES | cut -d' ' -f$DEVICE_INDEX) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE_LINE=$(echo $DEVICES_REGISTRY_PREV | grep $DEVICE) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$DEVICE_LINE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_RECONFIGURE_SELENOID=\"true\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$IS_RECONFIGURE_SELENOID\" = \"true\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0echo \"Reconfigure selenoid\" \u00a0\u00a0\u00a0\u00a0\u00a0$SELENOID_HOME\/\"$SELENOID_SCRIPT_NAME\" reconfigure &amp; \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_TO_LINE=\"\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0for ((DEVICE_INDEX=1; DEVICE_INDEX &lt;= $((DEVICES_COUNT)); DEVICE_INDEX++)) \u00a0\u00a0\u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE=$(echo $DEVICES | cut -d' ' -f$DEVICE_INDEX) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0APPIUM_CONFIG=$(cat $APPIUM_CONFIG_DIR\/$DEVICE.json 2&gt; \/dev\/null | grep $DEVICE) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SELENOID_CONFIG=$(cat $COMMON_CONFIG_DIR\/$SELENOID_CONFIG_NAME 2&gt; \/dev\/null | grep $DEVICE) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$APPIUM_CONFIG\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$SELENOID_CONFIG\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_TO_LINE=$DEVICE,$DEVICES_TO_LINE \u00a0\u00a0\u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_TO_LINE=${DEVICES_TO_LINE:0:$((${#DEVICES_TO_LINE}-1))} \u00a0\u00a0\u00a0\u00a0\u00a0echo -n \"$DEVICES_TO_LINE\" &gt; $DEVICES_FILE \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0exit 0<\/code><\/pre>\n<p>\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Selenoid \u0438 Selenoid UI. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function getLatestVersion() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $(curl -s $1 | grep \"\/aerokube\/$2\/releases\/tag\" | grep -Eo \"[0-9]{1,}[.][0-9]{1,}[.][0-9]{1,}\" | head -n1) \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function getCurrentVersion() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $($SELENOID_HOME\/$1 --version 2&gt; \/dev\/null | grep -Eo \"[0-9]{1,}[.][0-9]{1,}[.][0-9]{1,}\" || echo $BAD_CODE) \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function downloadBinary() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Download $3\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DOWNLOAD_URL=$1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DOWNLOAD_URL=${DOWNLOAD_URL\/\"{os}\"\/$OS} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DOWNLOAD_URL=${DOWNLOAD_URL\/\"{osPlatform}\"\/$OS_PLATFORM} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DOWNLOAD_URL=${DOWNLOAD_URL\/\"{latest_version}\"\/$2} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cd \"$SELENOID_HOME\" || exit $BAD_CODE \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rm -f $3 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl -s -L -o $SELENOID_HOME\/$3 $DOWNLOAD_URL || exit $BAD_CODE \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 $3 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cd \"$CURRENT_DIR_PATH\" || exit $BAD_CODE \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$#\" != \"1\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e .env\" \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0CURRENT_DIR_PATH=$(realpath \"$0\" | xargs dirname) \u00a0\u00a0\u00a0PATH_TO_ENV=$(realpath \"$1\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f $PATH_TO_ENV ]; then \u00a0\u00a0\u00a0\u00a0\u00a0DIR=$(dirname PATH_TO_ENV) \u00a0\u00a0\u00a0\u00a0\u00a0cd $DIR || exit $BAD_CODE \u00a0\u00a0\u00a0\u00a0\u00a0source $PATH_TO_ENV \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0435\u0432\u0435\u0440\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043f\u0443\u0442\u044c \u0434\u043e .env\" \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0OS=$(uname | tr A-Z a-z) \u00a0\u00a0\u00a0OS_PLATFORM=$(uname -m) \u00a0\u00a0\u00a0BAD_CODE=\"126\" \u00a0\u00a0\u00a0SELENOID_URL=\"https:\/\/github.com\/aerokube\/selenoid\/releases\" \u00a0\u00a0\u00a0SELENOID_UI_URL=\"https:\/\/github.com\/aerokube\/selenoid-ui\/releases\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_DOWNLOAD_URL=\"https:\/\/github.com\/aerokube\/selenoid\/releases\/download\/{latest_version}\/selenoid_{os}_{osPlatform}\" \u00a0\u00a0\u00a0SELENOID_UI_DOWNLOAD_URL=\"https:\/\/github.com\/aerokube\/selenoid-ui\/releases\/download\/{latest_version}\/selenoid-ui_{os}_{osPlatform}\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_LATEST_VERSION=$(getLatestVersion $SELENOID_URL \"selenoid\") \u00a0\u00a0\u00a0SELENOID_UI_LATEST_VERSION=$(getLatestVersion $SELENOID_UI_URL \"selenoid-ui\") \u00a0\u00a0\u00a0CURRENT_SELENOID_VERSION=$(getCurrentVersion \"selenoid\") \u00a0\u00a0\u00a0CURRENT_SELENOID_UI_VERSION=$(getCurrentVersion \"selenoid-ui\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$CURRENT_SELENOID_VERSION\" = \"$BAD_CODE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CURRENT_SELENOID_VERSION=\"0.0.0\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$CURRENT_SELENOID_UI_VERSION\" = \"$BAD_CODE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CURRENT_SELENOID_UI_VERSION=\"0.0.0\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0OS_PLATFORM=${OS_PLATFORM\/\"x86_64\"\/\"amd64\"} \u00a0\u00a0\u00a0IS_START_SELENOID=\"false\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [[ \"$SELENOID_LATEST_VERSION\" != *\"$CURRENT_SELENOID_VERSION\"* ]]; then \u00a0\u00a0\u00a0\u00a0\u00a0downloadBinary $SELENOID_DOWNLOAD_URL $SELENOID_LATEST_VERSION \"selenoid\" \u00a0\u00a0\u00a0\u00a0\u00a0IS_START_SELENOID=\"true\" \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0echo \"Selenoid version latest: $SELENOID_LATEST_VERSION\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [[ \"$SELENOID_UI_LATEST_VERSION\" != *\"$CURRENT_SELENOID_UI_VERSION\"* ]]; then \u00a0\u00a0\u00a0\u00a0\u00a0downloadBinary $SELENOID_UI_DOWNLOAD_URL $SELENOID_UI_LATEST_VERSION \"selenoid-ui\" \u00a0\u00a0\u00a0\u00a0\u00a0IS_START_SELENOID=\"true\" \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0echo \"Selenoid UI version latest: $SELENOID_UI_LATEST_VERSION\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$IS_START_SELENOID\" = \"true\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0echo \"Start selenoid and selenoid ui\" \u00a0\u00a0\u00a0\u00a0\u00a0eval \"$SELENOID_HOME\/$SELENOID_SCRIPT_NAME restart\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0exit 0<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f Appium \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041e\u043d \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a UDID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e adb, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON. <\/p>\n<pre><code class=\"bash\">#!\/bin\/bash #5cc2bd0d-96c5-4567-b82a-a896695af033 - don't delete \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0IFS=\" \" \u00a0\u00a0\u00a0IDS=$(adb devices -l | grep -v 'List of devices attached' | grep -Eo '[0-9a-zA-Z-]{8,}\\s') \u00a0\u00a0\u00a0IDS=$(echo \"${IDS}\" | tr -d \"\\r\\n\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0echo \"\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:\" \u00a0\u00a0\u00a0ls *.json \u00a0\u00a0\u00a0rm -f *.json \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0read -ra UDIDS &lt;&lt;&lt; \"$IDS\" \u00a0\u00a0\u00a0for UDID in \"${UDIDS[@]}\" \u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FILE_NAME=$UDID\".json\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT=$(echo '{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"server\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"address\": \"127.0.0.1\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"allow-cors\": true, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"allow-insecure\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"get_server_logs\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"adb_shell\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"base-path\": \"\/wd\/hub\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"debug-log-spacing\": true, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"default-capabilities\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"platformName\": \"android\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:androidNaturalOrientation\": true, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:deviceName\": \"android\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:udid\": \"udidToReplace\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:automationName\": \"UiAutomator2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:enforceAppInstall\": true, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:newCommandTimeout\": 90, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:autoGrantPermissions\": false, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:noReset\": noResetToReplace, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:ignoreHiddenApiPolicyError\": true, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:appActivity\": \"ru.alfabank.mobile.android.splash.presentation.activity.SplashActivity\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"appium:appPackage\": \"ru.alfabank.mobile.android.feature\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"log-level\": \"debug\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"log-no-colors\": true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0}') \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0XIAOMI_LINE=$(adb -s $UDID shell getprop ro.vendor.build.fingerprint | sed 's\/\\\/\/\\n\/g' | head -n1 | grep \"Xiaomi\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$XIAOMI_LINE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0NO_RESET_ENABLE=\"false\"; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0NO_RESET_ENABLE=\"true\"; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT=${FILE_CONTENT\/udidToReplace\/$UDID} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT=${FILE_CONTENT\/noResetToReplace\/$NO_RESET_ENABLE} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \"${FILE_NAME} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0touch $FILE_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430:\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT_PRETTY=$(echo $FILE_CONTENT | json_reformat 2&gt; \/dev\/null) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ \"$?\" = 0 ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $FILE_CONTENT_PRETTY &gt; $FILE_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $FILE_CONTENT &gt; $FILE_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cat $FILE_NAME \u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0exit 0 createSelenoidConfig.sh <\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Bash \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 Selenoid \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041b\u0438\u0441\u0442\u0438\u043d\u0433: <\/p>\n<pre><code class=\"bash\">#!\/bin\/bash #660368f2-f0cc-49d8-bf2e-4a7d0f2c84d8 - don't delete \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$#\" != \"1\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e .env\" \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f $1 ]; then \u00a0\u00a0\u00a0\u00a0\u00a0cd $(dirname $1) \u00a0\u00a0\u00a0\u00a0\u00a0source $1 \u00a0\u00a0\u00a0\u00a0\u00a0cd $COMMON_CONFIG_DIR \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0FILE_CONTENT=$(echo '{ \u00a0\u00a0\u00a0\u00a0\u00a0\"android\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"default\": \"defaultToReplace\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"versions\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0versionsToReplace \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0}') \u00a0\u00a0\u00a0VERSION=$(echo ' \u00a0\u00a0\u00a0\"deviceNameToReplace\": { \u00a0\u00a0\u00a0\u00a0\u00a0\"image\": [\"pathToAppium\", \"--config\", \"configNameToReplace\"] \u00a0\u00a0\u00a0}') \u00a0\u00a0\u00a0VERSIONS=\"\" \u00a0\u00a0\u00a0DEVICES_COUNT=$(adb devices -l | wc -l) \u00a0\u00a0\u00a0DEVICES_DEFAULT=\"\" \u00a0\u00a0\u00a0APPIUM_PATH=$(echo $APPIUM_HOME)appium \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0for ((DEVICE_INDEX=2; DEVICE_INDEX &lt;= $((DEVICES_COUNT-1)); DEVICE_INDEX++)) \u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0ADB_LINE=$(adb devices -l | sed $DEVICE_INDEX'!D') \u00a0\u00a0\u00a0\u00a0\u00a0USB=$(echo $ADB_LINE | grep -Eo \"usb:[0-9-]{1,}\" | grep -Eo \"[0-9-]{1,}\" ) \u00a0\u00a0\u00a0\u00a0\u00a0UDID=$(echo $ADB_LINE | grep -Eo \"[0-9A-Za-z-]+\\s\" | head -n1 | xargs -n1 echo | head -n1) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$USB\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#for emulators \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MODEL=$(adb -s $UDID shell getprop ro.boot.qemu.avd_name | sed 's\/.*\/&amp;\/') \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE=$(adb -s $UDID shell getprop ro.product.vendor.manufacturer | sed 's\/.*\/&amp;\/') \u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#for real devices \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MODEL=$(adb -s $UDID shell getprop ro.product.model | sed 's\/.*\/\\u&amp;\/') \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DEVICE=$(adb -s $UDID shell getprop ro.vendor.build.fingerprint | sed 's\/\\\/\/\\n\/g' | head -n1 | sed 's\/.*\/\\u&amp;\/') \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0DEVICES_DEFAULT=\"${DEVICE\/\/_\/ } ${MODEL\/\/_\/ }\" \u00a0\u00a0\u00a0\u00a0\u00a0PATH_TO_APPIUM_CONFIG_FILE=\"$APPIUM_CONFIG_DIR\/$UDID.json\" \u00a0\u00a0\u00a0\u00a0\u00a0VER=$(echo $VERSION) \u00a0\u00a0\u00a0\u00a0\u00a0VER=${VER\/pathToAppium\/$APPIUM_PATH} \u00a0\u00a0\u00a0\u00a0\u00a0VER=${VER\/deviceNameToReplace\/$DEVICES_DEFAULT} \u00a0\u00a0\u00a0\u00a0\u00a0VER=${VER\/configNameToReplace\/$PATH_TO_APPIUM_CONFIG_FILE} \u00a0\u00a0\u00a0\u00a0\u00a0VERSIONS=$(echo -e \"$VER,$VERSIONS\") \u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0LENGTH=$(echo ${#VERSIONS}) \u00a0\u00a0\u00a0LENGTH=$((LENGTH-1)) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$LENGTH\" != \"-1\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: \"$SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0rm -f $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0VERSIONS=${VERSIONS:0:$LENGTH} \u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT=${FILE_CONTENT\/versionsToReplace\/$VERSIONS} \u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT=${FILE_CONTENT\/defaultToReplace\/$DEVICES_DEFAULT} \u00a0\u00a0\u00a0\u00a0\u00a0FILE_CONTENT_PRETTY=$(echo $FILE_CONTENT | json_reformat 2&gt; \/dev\/null) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0EXIT_CODE=$? \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: \"$SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ \"$EXIT_CODE\" = 0 ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $FILE_CONTENT_PRETTY &gt; $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $FILE_CONTENT &gt; $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430:\" \u00a0\u00a0\u00a0\u00a0\u00a0cat $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0exit 0 selenoid.sh <\/code><\/pre>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0448\u0435. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Selenoid \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash #1b6f0b38-04e2-421c-b122-a54ab8a68bbd \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function get_pids(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0PIDS=$(ps -ax | grep \"$1\" | grep -v grep | grep -v ggr | grep -Eo \"^\\s{0,6}[0-9]+\\s\" | grep -Eo \"[0-9]+\" | grep -v \"$$\") \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function kill_procs(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ -n \"$1\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"$1\" | xargs kill $2 &gt; \/dev\/null 2&gt; \/dev\/null \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function kill_appium_procs(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0get_pids \"appium\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kill_procs \"$PIDS\" -9 \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function kill_selenoid_procs(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0get_pids \".\/selenoid $SELENOID_ARGS\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kill_procs \"$PIDS\" -9 \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function kill_selenoid_ui_procs(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0get_pids \".\/selenoid-ui $SELENOID_UI_ARGS\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kill_procs \"$PIDS\" -9 \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function terminate() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0kill_appium_procs \u00a0\u00a0\u00a0\u00a0\u00a0kill_procs \"$SELENOID_PID\" -TERM \u00a0\u00a0\u00a0\u00a0\u00a0kill_procs \"$SELENOID_UI_PID\" -TERM \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function start_selenoid(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0cd $SELENOID_HOME \u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 selenoid \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ \"$VERBOSE\" = \"true\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clear_crontab \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c selenoid:\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0trap terminate SIGINT SIGTERM \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.\/selenoid $SELENOID_ARGS \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SELENOID_PID=$! \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0wait \u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SELENOID_LOG=\"$SELENOID_LOGS_DIR\/selenoid-output-$DATE_TIME.log\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0touch $SELENOID_LOG \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.\/selenoid $SELENOID_ARGS &gt; $SELENOID_LOG 2&gt; $SELENOID_LOG &amp; \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function start_selenoid_ui(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0cd $SELENOID_HOME \u00a0\u00a0\u00a0\u00a0\u00a0SELENOID_UI_LOG=\"$SELENOID_LOGS_DIR\/selenoid-ui-output-$DATE_TIME.log\" \u00a0\u00a0\u00a0\u00a0\u00a0touch $SELENOID_UI_LOG \u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 selenoid-ui \u00a0\u00a0\u00a0\u00a0\u00a0$(sleep 5; .\/selenoid-ui $SELENOID_UI_ARGS &gt; $SELENOID_UI_LOG 2&gt; $SELENOID_UI_LOG)&amp; \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function createConfigs() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cd $APPIUM_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 $APPIUM_CONFIG_CREATER \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.\/$APPIUM_CONFIG_CREATER \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cd $COMMON_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 $SELENOID_CONFIG_CREATER \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.\/$SELENOID_CONFIG_CREATER $SELENOID_HOME\/.env \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function start() { \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0createConfigs \u00a0\u00a0\u00a0\u00a0\u00a0start_selenoid_ui \u00a0\u00a0\u00a0\u00a0\u00a0start_selenoid \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function full_kill_procs(){ \u00a0\u00a0\u00a0\u00a0\u00a0kill_appium_procs \u00a0\u00a0\u00a0\u00a0\u00a0kill_selenoid_ui_procs \u00a0\u00a0\u00a0\u00a0\u00a0kill_selenoid_procs \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function help() { \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:\" \u00a0\u00a0\u00a0\u00a0\u00a0echo \"1) \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: help|stop|start|restart\" \u00a0\u00a0\u00a0\u00a0\u00a0echo \"2) \u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433: --debug\" \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function clear_crontab(){ \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 crontab:\" \u00a0\u00a0\u00a0\u00a0\u00a0crontab -l \u00a0\u00a0\u00a0\u00a0\u00a0crontab -r 2&gt; \/dev\/null \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0function add_to_crontab(){ \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0CRONTAB_CMD=\"$CRON_SETTINGS $DEVICES_WATCHER_PATH\" \u00a0\u00a0\u00a0\u00a0\u00a0CRONTAB_LINE=$(crontab -l 2&gt; \/dev\/null) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [[ \"$CRONTAB_LINE\" == *\"$CRONTAB_CMD\"* ]]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0423\u0436\u0435 \u0431\u044b\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d crontab:\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0crontab -l \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 0 \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [[ \"$CRONTAB_LINE\" == *\"$DEVICES_WATCHER_PATH\"* ]]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clear_crontab \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0chmod 766 $DEVICES_WATCHER_PATH \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 crontab:\" \u00a0\u00a0\u00a0\u00a0\u00a0TEMP_FILE=\"usbd\" \u00a0\u00a0\u00a0\u00a0\u00a0echo \"$CRON_SETTINGS $DEVICES_WATCHER_PATH $SELENOID_HOME\/.env &gt; $SELENOID_LOGS_DIR\/cron.log\" | tee $TEMP_FILE \u00a0\u00a0\u00a0\u00a0\u00a0crontab $TEMP_FILE \u00a0\u00a0\u00a0\u00a0\u00a0rm -f $TEMP_FILE \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0cd $(realpath \"$0\" | xargs dirname) \u00a0\u00a0\u00a0source .env \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0DATE_TIME=$(date +%Y_%m_%d_%H_%M_%S) \u00a0\u00a0\u00a0HELP_COMMAND=$(echo $@ | grep help) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -z \"$HELP_COMMAND\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0IS_ARG_USE=false \u00a0\u00a0\u00a0\u00a0\u00a0DEBUG_MODE=$(echo $@ | grep debug) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$DEBUG_MODE\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0export VERBOSE=false \u00a0\u00a0\u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0export VERBOSE=true \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0mkdir -p $SELENOID_LOGS_DIR \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0for flag in \"$@\" \u00a0\u00a0\u00a0\u00a0\u00a0do \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case \"${flag}\" in \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0stop) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0full_kill_procs \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rm -f $APPIUM_CONFIG_DIR\/*.json \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rm -f $COMMON_CONFIG_DIR\/$SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clear_crontab \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0;; \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0start) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0start \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_ARG_USE=true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0;; \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0restart) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0full_kill_procs \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0start \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_ARG_USE=true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0;; \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0reconfigure) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0createConfigs \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0get_pids \".\/selenoid $SELENOID_ARGS\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kill -HUP $PIDS \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0;; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0esac \u00a0\u00a0\u00a0\u00a0\u00a0done \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0if [ \"$VERBOSE\" = \"false\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ \"$IS_ARG_USE\" = \"false\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0help \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 120; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sleep 6 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_SELENOID_STARTED=$(ps -x | grep \" :$SELENOID_PORT\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$IS_SELENOID_STARTED\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Selenoid \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d:\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cat $SELENOID_LOG \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IS_SELENOID_UI_STARTED=$(ps -x | grep \" :$SELENOID_UI_PORT\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if [ -z \"$IS_SELENOID_UI_STARTED\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Selenoid UI \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d:\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cat $SELENOID_UI_LOG \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add_to_crontab \u00a0\u00a0\u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0help \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0exit 0  \u0428\u0430\u0433 4. \u0417\u0430\u043f\u0443\u0441\u043a <\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 Selenoid\u00a0\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u21161. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>.\/updateSelenoidVersion.sh<\/code>.<\/p>\n<pre><code class=\"bash\">.\/selenoid.sh start --debug<\/code><\/pre>\n<p>\u21162. \u0412 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448 <code>health_check \u00a0.\/check\/health_check.sh 127.0.0.1 4444 &lt;\u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u044b adb devices&gt;<\/code>.<\/p>\n<p>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043b\u043e\u0433\u0438:<\/p>\n<pre><code>2024\/06\/24 22:21:34 [-] [INIT] [Loading configuration files...] 2024\/06\/24 22:21:34 [-] [INIT] [Loaded configuration from config\/browsers.json]  2024\/06\/24 22:21:34 [-] [INIT] [Logs Dir: \/home\/am_user2\/selenoid\/logs]  2024\/06\/24 22:21:34 [-] [INIT] [Timezone: Local]  2024\/06\/24 22:21:34 [-] [INIT] [Listening on :4444]  2024\/06\/24 22:22:18 [-] [NEW_REQUEST] [unknown] [127.0.0.1]  2024\/06\/24 22:22:18 [-] [NEW_REQUEST_ACCEPTED] [unknown] [127.0.0.1]  2024\/06\/24 22:22:18 [7] [LOCATING_SERVICE] [android] [Google Pixel 5]  2024\/06\/24 22:22:18 [7] [USING_DRIVER] [android] [Google Pixel 5]  2024\/06\/24 22:22:18 [7] [ALLOCATING_PORT]  2024\/06\/24 22:22:18 [7] [ALLOCATED_PORT] [35659]  2024\/06\/24 22:22:18 [7] [STARTING_PROCESS] [[appium --config \/home\/am_user2\/selenoid\/config\/appium\/08221FDD4006R1.json --port=35659]]  2024\/06\/24 22:22:20 [7] [PROCESS_STARTED] [258659] [1.69s]  2024\/06\/24 22:22:20 [7] [PROXY_TO] [http:\/\/127.0.0.1:35659]  2024\/06\/24 22:22:20 [7] [SESSION_ATTEMPTED] [http:\/\/127.0.0.1:35659] [1]  2024\/06\/24 22:22:20 [7] [SESSION_ATTEMPTED] [http:\/\/127.0.0.1:35659\/wd\/hub] [2]  2024\/06\/24 22:22:31 [7] [SESSION_CREATED] [8bf1b30e-1b37-423b-9271-5423c652ba18] [2] [12.41s]<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e:<\/p>\n<pre><code>2024\/06\/24 22:22:31 [7] [SESSION_CREATED] [8bf1b30e-1b37-423b-9271-5423c652ba18] [2] [12.41s]<\/code><\/pre>\n<h2>\u041d\u044e\u0430\u043d\u0441\u044b<\/h2>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u2014 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043d\u0430 Xiaomi Mi Mix. \u0414\u043b\u044f \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Appium.<\/p>\n<pre><code>04-19 21:09:59.581 \u00a0 927 \u00a0 927 E libc\u00a0 \u00a0 : Access denied finding property \"ro.hardware.fp.fod\" 04-19 21:09:59.581 \u00a0 927 \u00a0 927 E libc\u00a0 \u00a0 : Access denied finding property \"ro.hardware.fp.sideCap\" 04-19 21:09:59.573 \u00a0 927 \u00a0 927 W surfaceflinger: type=1400 audit(0.0:3966956): avc: denied { read } for name=\"u:object_r:vendor_fp_prop:s0\" dev=\"tmpfs\" ino=22608 scontext=u:r:surfaceflinger:s0 tcontext=u:object_r:vendor_fp_prop:s0 tclass=file permissive=0 04-19 21:09:59.588\u00a0 1716 11879 I Timeline: Timeline: App_transition_ready time:704191047  04-19 21:09:59.588\u00a0 1716 11879 I Timeline: Timeline: App_transition_stopped time:704191048  04-19 21:09:59.588\u00a0 5313\u00a0 5313 D EventBus: [5313, u0] send(AppTransitionFinishedEvent)  04-19 21:09:59.588\u00a0 5313\u00a0 5313 D EventBus: [5313, u0]\u00a0 -&gt; ForcedResizableInfoActivityController [0x17a1178, P1] onBusEvent(AppTransitionFinishedEvent) 04-19 21:09:59.588\u00a0 5313\u00a0 5313 D EventBus: [5313, u0] onBusEvent(AppTransitionFinishedEvent) duration: 8 microseconds, avg: 20  04-19 21:09:59.591 24287 24287 D Launcher.Lifecycle: onResume:UserHandle{0},67eca74,true  04-19 21:09:59.591 24287 24287 D ScreenElementRoot: resume  04-19 21:09:59.591\u00a0 1716\u00a0 2230 E Pm\u00a0 \u00a0 \u00a0 : install msg : Failure [INSTALL_CANCELED_BY_USER<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Xiaomi \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043f\u043e USB. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0438\u043b\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f USB: MIUI \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 USB, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 ADB \u0438\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/609\/b01\/db6\/609b01db64472b6b3adba10439c93735.png\" width=\"809\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/609\/b01\/db6\/609b01db64472b6b3adba10439c93735.png\"\/><\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u0445 Appium \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 capabilities:<\/p>\n<p><code>autoGrantPermission=false, noReset=true<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2f2\/c99\/d47\/2f2c99d472365421dcf205d24446e073.png\" width=\"1600\" height=\"554\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f2\/c99\/d47\/2f2c99d472365421dcf205d24446e073.png\"\/><\/figure>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0445\u043e\u0441\u0442\u0430 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432. <\/p>\n<p>\u0410 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0445\u043e\u0441\u0442\u0430 \u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043e\u0431\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<hr\/>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430:<br \/>\u0414\u0410\u0420\u0420\u041f, \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0443\u0442\u044c \u00ab\u041f\u043b\u0430\u0442\u0435\u0436\u0438 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b\u00bb:<br \/><a class=\"mention\" href=\"\/users\/wanro\">@wanro<\/a>,<a class=\"mention\" href=\"\/users\/ileonteva\">@ILeonteva<\/a> \u2014 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 Selenoid.<br \/>\u0414\u0410\u0420\u0420\u041f, \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0443\u0442\u044c \u00ab\u0421\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442\u044b\u0435:<br \/><a class=\"mention\" href=\"\/users\/pbezpal\">@pbezpal<\/a>\u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/833136\/\"> https:\/\/habr.com\/ru\/articles\/833136\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447<\/h2>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/773556\/\">\u043f\u0440\u043e Selenoid \u0441 Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043e\u0439 \u043f\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 Selenoid. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u044f\u0432\u0438\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0444\u0435\u043a\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u041e\u0421, \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0445\u043e\u0441\u0442\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0448\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043d\u0435\u0440\u0433\u043e\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. <\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u043b\u0443\u0447\u0448\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0447\u0435\u043c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0433\u043b\u0430\u0434\u043a\u043e. \u0423 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Selenoid \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Selenoid \u0445\u0430\u0431\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Android \u0432 USB-\u043f\u043e\u0440\u0442. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043f\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0443\u0434\u043e\u0432\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442. <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0447\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. <\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u2014 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c Selenoid \u0431\u0435\u0437 \u0414\u043e\u043a\u0435\u0440\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 Android \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 USB-\u043f\u043e\u0440\u0442.<\/p>\n<p>\u041e\u0431 \u044d\u0442\u043e\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043d\u0430 Linux \u0438 Mac \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0428\u0430\u0433 1. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/h2>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u043d\u0430\u0448\u0435\u043c Linux-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/p>\n<p>\u21161. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 BIOS. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0442, \u0436\u043c\u0451\u043c \u00abF9\u00bb \u0438\u043b\u0438 \u00abF10\u00bb.<\/p>\n<p>\u21162. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00abSecurity\u00bb \u2014 \u00abSystem Security\u00bb.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u21163. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u00abIntel Virtual Technology\u00bb. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00abEnabled\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448 \u00ab\u2192\u00bb, \u0430 \u0437\u0430\u0442\u0435\u043c \u0436\u043c\u0451\u043c \u00abF10\u00bb.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p> \u21164. \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u043c\u0435\u043d\u044e \u00abFile\u00bb \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u00abSave Changes and Exit\u00bb.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h2>\u0428\u0430\u0433 2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u041f\u041e \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u21161. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Selenoid \u0438 Selenoid UI, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f Selenoid \u0438 Appium.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">mkdir selenoid<\/code><\/pre>\n<p>\u21162. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435.<\/p>\n<pre><code class=\"bash\">cd selenoid<\/code><\/pre>\n<p>\u21163. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c <a href=\"https:\/\/github.com\/aerokube\/selenoid\/releases\">\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Selenoid<\/a>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 (\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435).<\/p>\n<pre><code class=\"bash\">wget -o selenoid \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a<\/code><\/pre>\n<p>\u21164. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/github.com\/aerokube\/selenoid-ui\/releases\">\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Selenoid UI<\/a>, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a. \u0422\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<pre><code class=\"bash\">wget -o selenoid-ui \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a<\/code><\/pre>\n<p>\u21165. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nvm.<\/p>\n<pre><code class=\"bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.7\/install.sh | bash\ufffc export NVM_DIR=\"\ufffcNVM_DIR\/nvm.sh\" ] &amp;&amp; . \"\ufffcNVM_DIR\/bash_completion\" ] &amp;&amp; . \"$NVM_DIR\/bash_completion\"\u00a0 # This loadsnvm bash_completion<\/code><\/pre>\n<p>\u21166. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Node.js.<\/p>\n<pre><code class=\"bash\">sudo apt-get install -y nodejs<\/code><\/pre>\n<p>\u21167. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c npm.<\/p>\n<pre><code class=\"bash\">sudo apt install -y npm<\/code><\/pre>\n<p>\u21168. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Appium.<\/p>\n<pre><code class=\"bash\">npm install -g appium<\/code><\/pre>\n<p>\u21169. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 uiautomator.<\/p>\n<pre><code class=\"bash\">appium driver install uiautomator2<\/code><\/pre>\n<p>\u211610. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Java Azul. <a href=\"https:\/\/docs.azul.com\/core\/install\/debian\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435<\/a>. <\/p>\n<p>\u211611. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Android SDK.<\/p>\n<pre><code class=\"bash\">wget https:\/\/dl.google.com\/android\/repository\/tools_r25.2.3-linux.zip\ufffc unzip tools_r25.2.3-linux.zip -d sdk\ufffc cd \/sdk\/tools\ufffc .\/android update sdk --no-ui<\/code><\/pre>\n<p>\u211612. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0430\u043c\u0438 \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"bash\">touch $HOME\/.bash_profile<\/code><\/pre>\n<p>\u211613. \u0412 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 nano \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p> \u211614.\u00a0 \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u043d\u0432\u0430\u0439\u0440\u043e\u043d\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"bash\">source .bash_profile<\/code><\/pre>\n<p>\u211615. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c adb.<\/p>\n<pre><code class=\"bash\">sudo apt-get install adb<\/code><\/pre>\n<p>\u211616. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<pre><code class=\"bash\">git init git remote add origin &lt;\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439&gt;  git pull origin master<\/code><\/pre>\n<h2>\u0428\u0430\u0433 3. \u041b\u0438\u0441\u0442\u0438\u043d\u0433 bash \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: <\/p>\n<h4>healthCheck.sh<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 Appium \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b  <code>curl<\/code>. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e Selenoid.<\/p>\n<pre><code class=\"bash\">\u00a0\u00a0#!\/bin\/bash \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0HOST=$1 \u00a0\u00a0\u00a0PORT=$2 \u00a0\u00a0\u00a0PLATFORM_NAME=$3 \u00a0\u00a0\u00a0DEVICE_NAME=$4 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$PLATFORM_NAME\" = \"android\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0APP_PATH=\"\" \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0APP_PATH=\"\" \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0REQUEST_BODY=$(echo '{ \u00a0\u00a0\u00a0\"capabilities\": { \u00a0\u00a0\u00a0\"alwaysMatch\": { \u00a0\u00a0\u00a0\"browserVersion\": \"deviceNameToReplace\", \u00a0\u00a0\u00a0\"selenoid:options\": { \u00a0\u00a0\u00a0\"name\": \"Session started using curl command...\", \u00a0\u00a0\u00a0\"sessionTimeout\": \"1m\" \u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\"appium:deviceName\": \"platformNameToReplace\", \u00a0\u00a0\u00a0\"appium:app\": \"appPathToReplace\" \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0}') \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/deviceNameToReplace\/$DEVICE_NAME} \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/appPathToReplace\/$APP_PATH} \u00a0\u00a0\u00a0REQUEST_BODY=${REQUEST_BODY\/platformNameToReplace\/$PLATFORM_NAME} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0curl -H'Content-Type: application\/json' http:\/\/$HOST:$PORT\/wd\/hub\/session -d\"$REQUEST_BODY\"<\/code><\/pre>\n<p> \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: <\/p>\n<ul>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Selenoid \u0438 Appium. <\/p>\n<\/li>\n<li>\n<p>\u0418\u0449\u0435\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. <\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c  <code>--debug<\/code> . <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Selenoid \u0438 Appium, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. <\/p>\n<p>\u041b\u0438\u0441\u0442\u0438\u043d\u0433: <\/p>\n<pre><code class=\"bash\"> \u00a0\u00a0#!\/bin\/bash \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0get_realpath_from_egrep() { \u00a0\u00a0\u00a0search_pattern=$1 \u00a0\u00a0\u00a0search_dir=$2 \u00a0\u00a0\u00a0DIRS=$(egrep -r --include=*.sh --exclude-dir=$HOME\/Library --exclude-dir=$HOME\/.Trash \"$search_pattern\" \"$search_dir\") \u00a0\u00a0\u00a0echo $DIRS | sed \"s\/:\/\\\\n\/\" | head -n1 | xargs realpath \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0get_last_segment_from_pattern() { \u00a0\u00a0\u00a0search_pattern=$1 \u00a0\u00a0\u00a0echo \"$search_pattern\" | sed \"s\/\\\/\/\\\\n\/g\" | tail -n1 \u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0FILE_NAME=\".zshrc\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f \"$HOME\/$FILE_NAME\" ]; then \u00a0\u00a0\u00a0#for mac os \u00a0\u00a0\u00a0source $HOME\/$FILE_NAME \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0FILE_NAME=\".bash_profile\" \u00a0\u00a0\u00a0#for linux \u00a0\u00a0\u00a0if [ -f \"$HOME\/$FILE_NAME\" ]; then \u00a0\u00a0\u00a0source $HOME\/$FILE_NAME \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0APPIUM_SCRIPT_FIND_BY=\"5cc2bd0d-96c5-4567-b82a-a896695af033\" \u00a0\u00a0\u00a0DEVICES_SCRIPT_FIND_BY=\"94843c3a-f128-4bb6-8819-4644156699d9\" \u00a0\u00a0\u00a0SELENOID_SCRIPT_FIND_BY=\"1b6f0b38-04e2-421c-b122-a54ab8a68bbd\" \u00a0\u00a0\u00a0SELENOID_CONFIG_SCRIPT_FIND_BY=\"660368f2-f0cc-49d8-bf2e-4a7d0f2c84d8\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_PORT=4444 \u00a0\u00a0\u00a0export CRON_SETTINGS=\"*\/15 * * * *\" \u00a0\u00a0\u00a0export SELENOID_UI_PORT=8080 \u00a0\u00a0\u00a0export SELENOID_CONFIG_NAME=devices.json \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_LIMITS=\"-disable-docker -limit 20 -retry-count 1000\" \u00a0\u00a0\u00a0SELENOID_TIMEOUTS=\"-max-timeout 20m -session-attempt-timeout 15m -timeout 10m -service-startup-timeout 10m\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0SELENOID_PATH=$(get_realpath_from_egrep \"$SELENOID_SCRIPT_FIND_BY\" \"$HOME\") \u00a0\u00a0\u00a0SELENOID_HOME=$(echo $SELENOID_PATH | xargs dirname) \u00a0\u00a0\u00a0APPIUM_CONFIG_PATH=$(get_realpath_from_egrep \"$APPIUM_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0SELENOID_CONFIG_PATH=$(get_realpath_from_egrep \"$SELENOID_CONFIG_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_HOME=$SELENOID_HOME \u00a0\u00a0\u00a0export SELENOID_LOGS_DIR=$SELENOID_HOME\/logs \u00a0\u00a0\u00a0export COMMON_CONFIG_DIR=$(echo $SELENOID_CONFIG_PATH | xargs dirname) \u00a0\u00a0\u00a0export APPIUM_CONFIG_DIR=$(echo $APPIUM_CONFIG_PATH | xargs dirname) \u00a0\u00a0\u00a0export DEVICES_WATCHER_PATH=$(get_realpath_from_egrep \"$DEVICES_SCRIPT_FIND_BY\" \"$SELENOID_HOME\") \u00a0\u00a0\u00a0export SELENOID_SCRIPT_NAME=$(get_last_segment_from_pattern \"$SELENOID_PATH\") \u00a0\u00a0\u00a0export APPIUM_CONFIG_CREATER=$(get_last_segment_from_pattern \"$APPIUM_CONFIG_PATH\") \u00a0\u00a0\u00a0export SELENOID_CONFIG_CREATER=$(get_last_segment_from_pattern \"$SELENOID_CONFIG_PATH\") \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0CONFIG=$COMMON_CONFIG_DIR\/$SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0export SELENOID_ARGS=\"$SELENOID_LIMITS -listen :$SELENOID_PORT -conf $CONFIG $SELENOID_TIMEOUTS -log-output-dir $SELENOID_LOGS_DIR\" \u00a0\u00a0\u00a0export SELENOID_UI_ARGS=\"-listen :$SELENOID_UI_PORT --selenoid-uri=http:\/\/localhost:$SELENOID_PORT\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$1\" = \"--debug\" ]; then \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_LOGS_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $COMMON_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $APPIUM_CONFIG_DIR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $DEVICES_WATCHER_PATH \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_CONFIG_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_SCRIPT_NAME \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $APPIUM_CONFIG_CREATER \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $SELENOID_CONFIG_CREATER \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0fi<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Selenoid \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Selenoid, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. <\/p>\n<pre><code class=\"bash\">#!\/bin\/bash #94843c3a-f128-4bb6-8819-4644156699d9 - don't delete \u00a0\u00a0\u00a0   \u00a0DIR_TO_SCRIPT=$(realpath \"$0\" | xargs dirname) \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ \"$#\" != \"1\" ]; then \u00a0\u00a0\u00a0\u00a0\u00a0echo \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e .env\" \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f $1 ]; then \u00a0\u00a0\u00a0\u00a0\u00a0cd $(dirname $1) \u00a0\u00a0\u00a0\u00a0\u00a0source $1 \u00a0\u00a0\u00a0else \u00a0\u00a0\u00a0\u00a0\u00a0exit 120 \u00a0\u00a0\u00a0fi \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0DEVICES_FILE=\"devices\" \u00a0\u00a0\u00a0DEVICES_REGISTRY_PREV=\"\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0cd $DIR_TO_SCRIPT \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0if [ -f<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-428033","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/428033","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=428033"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/428033\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=428033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=428033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=428033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}