{"id":387491,"date":"2024-06-29T07:21:08","date_gmt":"2024-06-29T07:21:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=387491"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=387491","title":{"rendered":"<span>Selenoid: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Appium UI-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 Android. \u0427\u0430\u0441\u0442\u044c I<\/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<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/inDrive\/blog\/665892\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>\u00a0\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Appium. \u041d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0431\u043e\u043b\u0435\u0435 5 \u0442\u044b\u0441\u044f\u0447 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 iOS \u0438 Android \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e. \u0421\u0435\u043a\u0440\u0435\u0442 \u043f\u0440\u043e\u0441\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Selenoid. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d19\/a07\/ddd\/d19a07ddd5f9d6f50ce954913937fec3.png\" width=\"1560\" height=\"880\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d19\/a07\/ddd\/d19a07ddd5f9d6f50ce954913937fec3.png\"\/><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/695244\/\">\u0432\u044b\u0448\u043b\u0430\u00a0\u0441\u0442\u0430\u0442\u044c\u044f<\/a>\u00a0\u043f\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u043e\u043f\u0440\u043e\u0441\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4cd\/46e\/7d8\/4cd46e7d83b8c0c156c3bb1d9a2dc430.png\" alt=\"\u0418\u0437 \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0445 Appium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20% \u043a\u043e\u043c\u0430\u043d\u0434, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\" title=\"\u0418\u0437 \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0445 Appium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20% \u043a\u043e\u043c\u0430\u043d\u0434, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\" width=\"1560\" height=\"959\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4cd\/46e\/7d8\/4cd46e7d83b8c0c156c3bb1d9a2dc430.png\"\/><\/p>\n<div><figcaption>\u0418\u0437 \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0445 Appium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20% \u043a\u043e\u043c\u0430\u043d\u0434, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u0441 \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0432\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438: \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e Android, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e iOS.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 Android.<\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 Android<\/h2>\n<p>Selenoid \u2014 <a href=\"https:\/\/github.com\/aerokube\/selenoid#known-users\">\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>\u00a0\u0438\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435:\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/463525\/\">\u0440\u0430\u0437<\/a>,\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/478816\/\">\u0434\u0432\u0430<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/473454\/\">\u0442\u0440\u0438<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 Appium \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>Kotlin;<\/p>\n<\/li>\n<li>\n<p>JUnit 5;<\/p>\n<\/li>\n<li>\n<p>Maven.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Selenoid<\/h4>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u00a0<code>browsers.json<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         \"image\": \"browsers\/android:10.0\",         \"port\": \"4444\",         \"path\": \"\/wd\/hub\"       }     }   } }<\/code><\/pre>\n<p>\u0412\u00a0<code>image<\/code>\u00a0\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430. \u0420\u0435\u0431\u044f\u0442\u0430 \u0438\u0437 <a href=\"https:\/\/aerokube.com\/\">aerokube<\/a> \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/hub.docker.com\/r\/browsers\/android\/tags\">\u0442\u0443\u0442<\/a>\u00a0\u0438\u043b\u0438 <a href=\"https:\/\/hub.docker.com\/r\/selenoid\/android\/tags\">\u0442\u0443\u0442<\/a>. \u041e\u0431\u0440\u0430\u0437\u044b \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043e\u0431\u0440\u0430\u0437\u00a0<code>browsers\/android:10.0<\/code>. \u041e\u0431\u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c: <code>docker pull browsers\/android:10.0<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f:<\/p>\n<pre><code class=\"json\">Original error: create container: Error response from daemon: No such image: browsers\/android:10.0<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Selenoid. \u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/#_option_2_start_selenoid_container\">docker<\/a>, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/aerokube.com\/cm\/latest\/\">Configuration Manager<\/a>.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">docker run -d \\            -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\            -v \"$(pwd)\/selenoid\/config\/\":\/etc\/selenoid\/:ro \\            -p 4444:4444 \\            --name selenoid \\            aerokube\/selenoid:1.10.7<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c Selenoid \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 <em>http:\/\/localhost:4444<\/em>:<\/p>\n<pre><code class=\"bash\">You are using Selenoid 1.10.7!<\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 Selenoid \u0432 Appium-\u0442\u0435\u0441\u0442\u0430\u0445 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">... val driver = AndroidDriver(URL(\"http:\/\/localhost:4444\/wd\/hub\"), capabilities) ...<\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 <code>capabilities<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">...  capabilities.setCapability(\"appium:app\", \"https:\/\/storage.example.com\/builds\/app.apk\") ... <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n<pre><code class=\"kotlin\">... capabilities.setCapability(\"appium:app\", \"\/builds\/app.apk\") ... <\/code><\/pre>\n<p>\u0413\u0434\u0435 <code>\/builds\/app.apk<\/code> \u2014 \u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u0427\u0442\u043e\u0431\u044b \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>volumes<\/code> \u0432 <code>browsers.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         ...         \"volumes\": [           \"\/home\/username\/app.apk:\/builds\/app.apk:ro\"         ]         ...       }     }   } }<\/code><\/pre>\n<p>\u0413\u0434\u0435 <code>\/home\/username\/app.apk<\/code> \u2014 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435.<\/p>\n<p>\u0412\u0441\u0451, \u043c\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 Selenoid \u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b:<\/p>\n<pre><code class=\"bash\">.\/mvnw test<\/code><\/pre>\n<p>\u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f. \u0418\u0434\u0451\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h4>\u0412\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c<\/h4>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 Selenoid:<\/p>\n<pre><code class=\"bash\">docker logs selenoid<\/code><\/pre>\n<pre><code class=\"bash\">[INIT] [Loading configuration files...] [INIT] [Loaded configuration from \/etc\/selenoid\/browsers.json] [INIT] [Video Dir: \/opt\/selenoid\/video] [INIT] [Your Docker API version is 1.41] [INIT] [Timezone: UTC] [INIT] [Listening on :4444] [NEW_REQUEST] [unknown] [172.17.0.1] [NEW_REQUEST_ACCEPTED] [unknown] [172.17.0.1] [LOCATING_SERVICE] [android] [10.0] [USING_DOCKER] [android] [10.0] [CREATING_CONTAINER] [selenoid\/android:10.0] [STARTING_CONTAINER] [selenoid\/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [CONTAINER_STARTED] [selenoid\/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0.40s] [0] [REMOVING_CONTAINER] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [CONTAINER_REMOVED] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [SERVICE_STARTUP_FAILED] [http:\/\/172.17.0.3:4444\/wd\/hub does not respond in 30s]<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0441\u0442\u0430\u0442\u0443\u0441 SERVICE_STARTUP_FAILED. \u0418\u0434\u0451\u043c \u0432 <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/#_log_files\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<pre><code class=\"bash\">SERVICE_STARTUP_FAILED - Failed to start Docker container or driver binary<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0422\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"bash\">docker run -d \\            -p 4444:4444 \\            -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\            -v \"$(pwd)\/selenoid\/config\/\":\/etc\/selenoid\/:ro \\            -v  \"$(pwd)\/selenoid\/logs\/\":\/opt\/selenoid\/logs\/ \\            aerokube\/selenoid:1.10.7 \\            -log-output-dir \/opt\/selenoid\/logs<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043b\u043e\u0433\u0438 \u0432 capabilities:<\/p>\n<pre><code class=\"kotlin\">... capabilities.setCapability(\"enableLog\", true) ...<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 <em>http:\/\/localhost:4444\/logs\/<\/em>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">2023-04-16T13:44:43.909768530Z Waiting X server... 2023-04-16T13:44:44.009494775Z Logging to: \/tmp\/fluxbox.log 2023-04-16T13:44:44.047587277Z Waiting X server... 2023-04-16T13:44:44.151933325Z Waiting X server... 2023-04-16T13:44:44.262850410Z * daemon not running; starting now at tcp:5037 2023-04-16T13:44:44.457972956Z * daemon started successfully 2023-04-16T13:44:44.458249266Z adb: no devices\/emulators found 2023-04-16T13:44:45.463480812Z adb: no devices\/emulators found 2023-04-16T13:44:46.471547723Z adb: no devices\/emulators found 2023-04-16T13:44:47.476093515Z adb: no devices\/emulators found 2023-04-16T13:44:48.481987351Z adb: no devices\/emulators found 2023-04-16T13:44:49.486503149Z adb: no devices\/emulators found 2023-04-16T13:44:50.492757801Z adb: no devices\/emulators found 2023-04-16T13:44:51.499094108Z adb: no devices\/emulators found 2023-04-16T13:44:52.505862428Z adb: no devices\/emulators found 2023-04-16T13:44:53.513276412Z adb: no devices\/emulators found 2023-04-16T13:44:54.520642210Z adb: no devices\/emulators found 2023-04-16T13:44:55.527420189Z adb: no devices\/emulators found 2023-04-16T13:44:56.534631013Z adb: no devices\/emulators found 2023-04-16T13:44:57.316094939Z WARNING. Using fallback path for the emulator registration directory. 2023-04-16T13:44:57.335415397Z checkValid: hw configs not eq 2023-04-16T13:44:57.541959741Z adb: device offline 2023-04-16T13:44:58.547907700Z adb: device offline 2023-04-16T13:44:58.565504866Z emulator: WARNING: System image is writable 2023-04-16T13:44:58.565528396Z emulator: Cold boot: different AVD configuration 2023-04-16T13:44:58.565532576Z Your emulator is out of date, please update by launching Android Studio: 2023-04-16T13:44:58.565536346Z  - Start Android Studio 2023-04-16T13:44:58.565539506Z  - Select menu \"Tools > Android > SDK Manager\" 2023-04-16T13:44:58.565543076Z  - Click \"SDK Tools\" tab 2023-04-16T13:44:58.565546216Z  - Check \"Android Emulator\" checkbox 2023-04-16T13:44:58.565549216Z  - Click \"OK\" 2023-04-16T13:44:58.565552146Z  2023-04-16T13:44:59.554451514Z adb: device offline 2023-04-16T13:45:00.560926060Z adb: device offline 2023-04-16T13:45:01.568777440Z adb: device offline 2023-04-16T13:45:12.124226047Z emulator: INFO: boot completed 2023-04-16T13:45:12.124251007Z emulator: INFO: boot time 27848 ms 2023-04-16T13:45:12.124255077Z emulator: Increasing screen off timeout, logcat buffer size to 2M. 2023-04-16T13:45:12.152557294Z emulator: Revoking microphone permissions for Google App.<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u043b\u043e\u0433\u043e\u0432 Appium. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0445 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u00a0<a href=\"https:\/\/github.com\/aerokube\/images\/blob\/cc6c2d21601e79dadccbba3169779fb7d62a94d6\/selenium\/android\/entrypoint.sh#L15\">entrypoint.sh<\/a>:<\/p>\n<pre><code class=\"bash\">... if [ -z \"$VERBOSE\" ]; then     APPIUM_ARGS=\"$APPIUM_ARGS --log-level error\" else     EMULATOR_ARGS=\"$EMULATOR_ARGS -verbose\" fi ...<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0433\u0438 Appium, \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>VERBOSE=true<\/code> \u0438 <code>APPIUM_ARGS=--log-level debug<\/code>:<\/p>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         ...         \"env\": [           \"VERBOSE=true\",           \"APPIUM_ARGS=--log-level debug\"         ]         ...       }     }   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0435\u0431\u0430\u0436\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 Appium, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c VERBOSE, \u0430 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u0433\u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u00ab\u044d\u0444\u0438\u0440\u00bb. \u041d\u043e \u043c\u044b \u044d\u0442\u043e <a href=\"https:\/\/github.com\/aerokube\/images\/commit\/0e103e11894c408cb817b83c50522339c49b1bc4\">\u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438<\/a> \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 =) <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<code>APPIUM_ARGS=-log-level debug<\/code><\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 Appium<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">... [HTTP] --> POST \/wd\/hub\/session\/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1\/element [HTTP] {\"using\":\"id\",\"value\":\"authorization_edittext_phone\"} [debug] [W3C (c89fa9c2)] Calling AppiumDriver.findElement() with args: [\"id\",\"authorization_edittext_phone\",\" c89fa9c2-ca2b-49cd-ab31-590eeccf77d1\"] [debug] [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -and roid uiautomator [debug] [BaseDriver] Waiting up to 0 ms for condition [debug] [WD Proxy] Matched '\/element' to command name 'findElement' [debug] [WD Proxy] Proxying [POST \/element] to [POST http:\/\/127.0.0.1:8200\/wd\/hub\/session\/65943f03-3b35-4d3eb221-d6dc7988f935\/element] with body: {\"strategy\":\"id\",\"selector\": \"authorization_edittext_phone\",\"context\":\"\",\"multiple\":false} [WD Proxy] Got response with status 404: {\"sessionId\":\"65943f03-3b35-4d3e-b221-d6dc7988f935\",\"value\":{\"error\" :\"no such element\",\"message\":\"An element could not be located on the page using the given search parameters\",\"stacktrace\":\"io.appium.uiautomator2.common.exceptions.El ementNotFoundException: An element could not be located on the page using the given search parameters\\n\\tat io.appium.uiautomator2.handler.FindElement.safeHandle(Find Element.java:73)\\n\\tat io.appium.uiautomator2.handler.request.SafeRequestHandler.handle(SafeRequestHandler.java:41)\\n\\tat io.appium.uiautomator2.server.AppiumServlet. handleRequest(AppiumServlet.java:253)\\n\\tat io.appium.uiautomator2.server.AppiumServlet.handleHttpRequest(AppiumServlet.java:247)\\n\\tat io.appium.uiautomator2.http.Se rverHandler.channelRead(ServerHandler.java:68)\\n\\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)\\n\\tat io .netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)\\n\\tat io.netty.chann... [debug] [W3C] Matched W3C error code 'no such element' to NoSuchElementError [debug] [W3C (c89fa9c2)] Encountered internal error running command: NoSuchElementError: An element could not be located on the page using the given search parameters. [debug] [W3C (c89fa9c2)]     at AndroidUiautomator2Driver.findElOrEls (\/opt\/node_modules\/appium\/node_modules\/appium-android-driver\/lib\/commands\/find.js:75:11) [debug] [W3C (c89fa9c2)]     at process._tickCallback (internal\/process\/next_tick.js:68:7) [HTTP] &lt;-- POST \/wd\/hub\/session\/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1\/element 404 23 ms - 444 ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u0436\u0435 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041f\u043e \u043b\u043e\u0433\u0430\u043c \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e Appium \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0448 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Selenoid UI:<\/p>\n<pre><code class=\"bash\">docker run -d \\            --name selenoid-ui \\            -p 8080:8080 \\            --link selenoid:selenoid \\            aerokube\/selenoid-ui:1.10.4 \\            --selenoid-uri \"http:\/\/selenoid:4444\" <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435\u00a0<em>http:\/\/0.0.0.0:8080<\/em>\u00a0\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Selenoid UI:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/306\/186\/719\/3061867199cff93c429501683bc4b4f4.png\" alt=\"\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 Selenoid UI\" title=\"\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 Selenoid UI\" width=\"1845\" height=\"462\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/306\/186\/719\/3061867199cff93c429501683bc4b4f4.png\"\/><\/p>\n<div><figcaption>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 Selenoid UI<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 VNC \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<pre><code class=\"kotlin\">... capabilities.setCapability(\"enableVNC\", true) capabilities.setCapability(\"enableVideo\", true) ... <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Selenoid \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">docker run -d \\            -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\            -v \"(pwd)\/selenoid\/logs\/\":\/opt\/selenoid\/logs\/ \\            -v \/opt\/selenoid\/video\/:\/opt\/selenoid\/video\/ \\            -e OVERRIDE_VIDEO_OUTPUT_DIR=\"\/opt\/selenoid\/video\/\" \\            -p 4444:4444 \\            -name selenoid \\            aerokube\/selenoid:1.10.7 \\            -log-output-dir \/opt\/selenoid\/logs<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Selenoid UI:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e04\/ae2\/df9\/e04ae2df9885977fd252101d06d30a3c.png\" alt=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 Selenoid UI\" title=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 Selenoid UI\" width=\"1846\" height=\"407\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e04\/ae2\/df9\/e04ae2df9885977fd252101d06d30a3c.png\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 Selenoid UI<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/301\/f94\/9f9\/301f949f91a4ad60ff98ff32bf80eb9c.png\" alt=\"VNC \u0438 \u043b\u043e\u0433\u0438\" title=\"VNC \u0438 \u043b\u043e\u0433\u0438\" width=\"1848\" height=\"728\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/301\/f94\/9f9\/301f949f91a4ad60ff98ff32bf80eb9c.png\"\/><\/p>\n<div><figcaption>VNC \u0438 \u043b\u043e\u0433\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6448bba6ba194ffbd3415555\" data-style=\"\" id=\"6448bba6ba194ffbd3415555\" width=\"\"><\/div>\n<p>\u0423\u0440\u0430, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0418\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h4>\u0422\u0440\u0435\u0442\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430<\/h4>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c06\/be0\/e20\/c06be0e20140f3c2aed1aae2976c1ea8.jpeg\" alt=\"\" title=\"\" width=\"320\" height=\"480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c06\/be0\/e20\/c06be0e20140f3c2aed1aae2976c1ea8.jpeg\" data-blurred=\"true\"\/><\/figure>\n<p>\u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 Selenoid \u043d\u0435\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Google Play. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u043d\u0430\u0434\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430. \u0420\u0435\u0431\u044f\u0442\u0430 \u0438\u0437 aerokube \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435: <a href=\"https:\/\/github.com\/aerokube\/images\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u00a0\u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438<\/a> \u0438 <a href=\"https:\/\/aerokube.com\/images\/latest\/#_building_procedure\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>.<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/github.com\/aerokube\/images\">\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c<\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443\u00a0<code>selenium<\/code>. <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u00a0<code>.\/automate_android.sh<\/code>\u00a0\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">Specify Appium version: [1.18.1] >> 1.18.1 Specify Android image type (possible values: \"default\", \"google_apis\", \"google_apis_playstore\", \"android-tv\", \"android-wear\"): [default] >> google_apis Specify Application Binary Interface (possible values: \"armeabi-v7a\", \"arm64-v8a\", \"x86\", \"x86_64\"): [x86] >> x86 Specify Android version: [8.1] >> 10.0 Specify device preset name if needed (e.g. \"Nexus 4\"): >> Specify SD card size, Mb: [500] >> Specify userdata.img size, Mb: [500] >> Are you building a Chrome Mobile image (for mobile web testing): [n] >> y Specify Chromedriver version if needed (required for Chrome Mobile): >> 74.0.3729.6 Specify image tag: [selenoid\/chrome-mobile:74.0] >> android-emulator:10.0 Add Android quick boot snapshot? [y] >> n<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e Add Android quick boot snapshot?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0435\u043b \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0442\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u043e <a href=\"https:\/\/developer.android.com\/studio\/run\/emulator-snapshots\">snapshot<\/a> \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/aerokube\/images\/blob\/master\/selenium\/automate_android.sh#L236\">\u043a\u043e\u0434<\/a>, \u0442\u043e \u0442\u0430\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/aerokube\/images\/blob\/master\/selenium\/android\/emulator-snapshot.sh\">\u0441\u043a\u0440\u0438\u043f\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 APK \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043c\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c snapshot \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<\/div>\n<\/details>\n<p>4. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0437 \u0441\u043e\u0431\u0435\u0440\u0451\u0442\u0441\u044f, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0448\u0438\u0442\u044c \u0435\u0433\u043e \u0432 registry. \u041d\u0430\u043c \u043f\u043e\u043a\u0430 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u043e\u0442\u043a\u0430\u0436\u0435\u043c:<\/p>\n<pre><code class=\"bash\">Push? >> n<\/code><\/pre>\n<p>\u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 Google Play. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>image<\/code> \u0432 <code>browsers.json<\/code> \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Selenoid.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b:<\/p>\n<pre><code class=\"bash\">[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------<\/code><\/pre>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6448b962ba194ffbd341544f\" data-style=\"\" id=\"6448b962ba194ffbd341544f\" width=\"\"><\/div>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0433\u043e\u043d\u0430:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6448bb0f29dd10df7de094cc\" data-style=\"\" id=\"6448bb0f29dd10df7de094cc\" width=\"\"><\/div>\n<h2>\u0418\u0442\u043e\u0433 <\/h2>\n<p>\u0427\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 Selenoid \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Android-\u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 Google Play.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e \u0447\u0451\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0449\u0451:<\/p>\n<ul>\n<li>\n<p>\u041e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u0445 Selenoid. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441  \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u044f\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041d\u0430 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043c\u0438\u043d\u0443\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b Android, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Espresso, \u043d\u0430 Selenoid. \u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u043f\u043e\u043a\u0430 \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/inDrive\/articles\/732226\/\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 iOS.<\/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\/729774\/\"> https:\/\/habr.com\/ru\/articles\/729774\/<\/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<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/inDrive\/blog\/665892\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>\u00a0\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Appium. \u041d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0431\u043e\u043b\u0435\u0435 5 \u0442\u044b\u0441\u044f\u0447 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 iOS \u0438 Android \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e. \u0421\u0435\u043a\u0440\u0435\u0442 \u043f\u0440\u043e\u0441\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Selenoid. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/695244\/\">\u0432\u044b\u0448\u043b\u0430\u00a0\u0441\u0442\u0430\u0442\u044c\u044f<\/a>\u00a0\u043f\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u043e\u043f\u0440\u043e\u0441\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0418\u0437 \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0445 Appium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20% \u043a\u043e\u043c\u0430\u043d\u0434, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u0441 \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0432\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438: \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e Android, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e iOS.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 Android.<\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 Android<\/h2>\n<p>Selenoid \u2014 <a href=\"https:\/\/github.com\/aerokube\/selenoid#known-users\">\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>\u00a0\u0438\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435:\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/463525\/\">\u0440\u0430\u0437<\/a>,\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/478816\/\">\u0434\u0432\u0430<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/473454\/\">\u0442\u0440\u0438<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 Appium \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>Kotlin;<\/p>\n<\/li>\n<li>\n<p>JUnit 5;<\/p>\n<\/li>\n<li>\n<p>Maven.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Selenoid<\/h4>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u00a0<code>browsers.json<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         \"image\": \"browsers\/android:10.0\",         \"port\": \"4444\",         \"path\": \"\/wd\/hub\"       }     }   } }<\/code><\/pre>\n<p>\u0412\u00a0<code>image<\/code>\u00a0\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430. \u0420\u0435\u0431\u044f\u0442\u0430 \u0438\u0437 <a href=\"https:\/\/aerokube.com\/\">aerokube<\/a> \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b Android-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/hub.docker.com\/r\/browsers\/android\/tags\">\u0442\u0443\u0442<\/a>\u00a0\u0438\u043b\u0438 <a href=\"https:\/\/hub.docker.com\/r\/selenoid\/android\/tags\">\u0442\u0443\u0442<\/a>. \u041e\u0431\u0440\u0430\u0437\u044b \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043e\u0431\u0440\u0430\u0437\u00a0<code>browsers\/android:10.0<\/code>. \u041e\u0431\u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c: <code>docker pull browsers\/android:10.0<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f:<\/p>\n<pre><code class=\"json\">Original error: create container: Error response from daemon: No such image: browsers\/android:10.0<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Selenoid. \u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/#_option_2_start_selenoid_container\">docker<\/a>, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/aerokube.com\/cm\/latest\/\">Configuration Manager<\/a>.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">docker run -d \\            -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\            -v \"$(pwd)\/selenoid\/config\/\":\/etc\/selenoid\/:ro \\            -p 4444:4444 \\            --name selenoid \\            aerokube\/selenoid:1.10.7<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c Selenoid \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 <em>http:\/\/localhost:4444<\/em>:<\/p>\n<pre><code class=\"bash\">You are using Selenoid 1.10.7!<\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 Selenoid \u0432 Appium-\u0442\u0435\u0441\u0442\u0430\u0445 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">... val driver = AndroidDriver(URL(\"http:\/\/localhost:4444\/wd\/hub\"), capabilities) ...<\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 <code>capabilities<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">...  capabilities.setCapability(\"appium:app\", \"https:\/\/storage.example.com\/builds\/app.apk\") ... <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n<pre><code class=\"kotlin\">... capabilities.setCapability(\"appium:app\", \"\/builds\/app.apk\") ... <\/code><\/pre>\n<p>\u0413\u0434\u0435 <code>\/builds\/app.apk<\/code> \u2014 \u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u0427\u0442\u043e\u0431\u044b \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>volumes<\/code> \u0432 <code>browsers.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         ...         \"volumes\": [           \"\/home\/username\/app.apk:\/builds\/app.apk:ro\"         ]         ...       }     }   } }<\/code><\/pre>\n<p>\u0413\u0434\u0435 <code>\/home\/username\/app.apk<\/code> \u2014 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435.<\/p>\n<p>\u0412\u0441\u0451, \u043c\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 Selenoid \u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b:<\/p>\n<pre><code class=\"bash\">.\/mvnw test<\/code><\/pre>\n<p>\u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f. \u0418\u0434\u0451\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h4>\u0412\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c<\/h4>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 Selenoid:<\/p>\n<pre><code class=\"bash\">docker logs selenoid<\/code><\/pre>\n<pre><code class=\"bash\">[INIT] [Loading configuration files...] [INIT] [Loaded configuration from \/etc\/selenoid\/browsers.json] [INIT] [Video Dir: \/opt\/selenoid\/video] [INIT] [Your Docker API version is 1.41] [INIT] [Timezone: UTC] [INIT] [Listening on :4444] [NEW_REQUEST] [unknown] [172.17.0.1] [NEW_REQUEST_ACCEPTED] [unknown] [172.17.0.1] [LOCATING_SERVICE] [android] [10.0] [USING_DOCKER] [android] [10.0] [CREATING_CONTAINER] [selenoid\/android:10.0] [STARTING_CONTAINER] [selenoid\/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [CONTAINER_STARTED] [selenoid\/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0.40s] [0] [REMOVING_CONTAINER] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [CONTAINER_REMOVED] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [SERVICE_STARTUP_FAILED] [http:\/\/172.17.0.3:4444\/wd\/hub does not respond in 30s]<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0441\u0442\u0430\u0442\u0443\u0441 SERVICE_STARTUP_FAILED. \u0418\u0434\u0451\u043c \u0432 <a href=\"https:\/\/aerokube.com\/selenoid\/latest\/#_log_files\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<pre><code class=\"bash\">SERVICE_STARTUP_FAILED - Failed to start Docker container or driver binary<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0422\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"bash\">docker run -d \\            -p 4444:4444 \\            -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\            -v \"$(pwd)\/selenoid\/config\/\":\/etc\/selenoid\/:ro \\            -v  \"$(pwd)\/selenoid\/logs\/\":\/opt\/selenoid\/logs\/ \\            aerokube\/selenoid:1.10.7 \\            -log-output-dir \/opt\/selenoid\/logs<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043b\u043e\u0433\u0438 \u0432 capabilities:<\/p>\n<pre><code class=\"kotlin\">... capabilities.setCapability(\"enableLog\", true) ...<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 <em>http:\/\/localhost:4444\/logs\/<\/em>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">2023-04-16T13:44:43.909768530Z Waiting X server... 2023-04-16T13:44:44.009494775Z Logging to: \/tmp\/fluxbox.log 2023-04-16T13:44:44.047587277Z Waiting X server... 2023-04-16T13:44:44.151933325Z Waiting X server... 2023-04-16T13:44:44.262850410Z * daemon not running; starting now at tcp:5037 2023-04-16T13:44:44.457972956Z * daemon started successfully 2023-04-16T13:44:44.458249266Z adb: no devices\/emulators found 2023-04-16T13:44:45.463480812Z adb: no devices\/emulators found 2023-04-16T13:44:46.471547723Z adb: no devices\/emulators found 2023-04-16T13:44:47.476093515Z adb: no devices\/emulators found 2023-04-16T13:44:48.481987351Z adb: no devices\/emulators found 2023-04-16T13:44:49.486503149Z adb: no devices\/emulators found 2023-04-16T13:44:50.492757801Z adb: no devices\/emulators found 2023-04-16T13:44:51.499094108Z adb: no devices\/emulators found 2023-04-16T13:44:52.505862428Z adb: no devices\/emulators found 2023-04-16T13:44:53.513276412Z adb: no devices\/emulators found 2023-04-16T13:44:54.520642210Z adb: no devices\/emulators found 2023-04-16T13:44:55.527420189Z adb: no devices\/emulators found 2023-04-16T13:44:56.534631013Z adb: no devices\/emulators found 2023-04-16T13:44:57.316094939Z WARNING. Using fallback path for the emulator registration directory. 2023-04-16T13:44:57.335415397Z checkValid: hw configs not eq 2023-04-16T13:44:57.541959741Z adb: device offline 2023-04-16T13:44:58.547907700Z adb: device offline 2023-04-16T13:44:58.565504866Z emulator: WARNING: System image is writable 2023-04-16T13:44:58.565528396Z emulator: Cold boot: different AVD configuration 2023-04-16T13:44:58.565532576Z Your emulator is out of date, please update by launching Android Studio: 2023-04-16T13:44:58.565536346Z  - Start Android Studio 2023-04-16T13:44:58.565539506Z  - Select menu \"Tools > Android > SDK Manager\" 2023-04-16T13:44:58.565543076Z  - Click \"SDK Tools\" tab 2023-04-16T13:44:58.565546216Z  - Check \"Android Emulator\" checkbox 2023-04-16T13:44:58.565549216Z  - Click \"OK\" 2023-04-16T13:44:58.565552146Z  2023-04-16T13:44:59.554451514Z adb: device offline 2023-04-16T13:45:00.560926060Z adb: device offline 2023-04-16T13:45:01.568777440Z adb: device offline 2023-04-16T13:45:12.124226047Z emulator: INFO: boot completed 2023-04-16T13:45:12.124251007Z emulator: INFO: boot time 27848 ms 2023-04-16T13:45:12.124255077Z emulator: Increasing screen off timeout, logcat buffer size to 2M. 2023-04-16T13:45:12.152557294Z emulator: Revoking microphone permissions for Google App.<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u043b\u043e\u0433\u043e\u0432 Appium. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0445 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u00a0<a href=\"https:\/\/github.com\/aerokube\/images\/blob\/cc6c2d21601e79dadccbba3169779fb7d62a94d6\/selenium\/android\/entrypoint.sh#L15\">entrypoint.sh<\/a>:<\/p>\n<pre><code class=\"bash\">... if [ -z \"$VERBOSE\" ]; then     APPIUM_ARGS=\"$APPIUM_ARGS --log-level error\" else     EMULATOR_ARGS=\"$EMULATOR_ARGS -verbose\" fi ...<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0433\u0438 Appium, \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>VERBOSE=true<\/code> \u0438 <code>APPIUM_ARGS=--log-level debug<\/code>:<\/p>\n<pre><code class=\"json\">{   \"android\": {     \"default\": \"10.0\",     \"versions\": {       \"10.0\": {         ...         \"env\": [           \"VERBOSE=true\",           \"APPIUM_ARGS=--log-level debug\"         ]         ...       }     }   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0435\u0431\u0430\u0436\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 Appium, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c VERBOSE, \u0430 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u0433\u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u00ab\u044d\u0444\u0438\u0440\u00bb. \u041d\u043e \u043c\u044b \u044d\u0442\u043e <a href=\"https:\/\/github.com\/aerokube\/images\/commit\/0e103e11894c408cb817b83c50522339c49b1bc4\">\u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438<\/a> \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 =) <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<code>APPIUM_ARGS=-log-level debug<\/code><\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 Appium<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">... [HTTP] --> POST \/wd\/hub\/session\/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1\/element [HTTP] {\"using\":\"id\",\"value\":\"authorization_edittext_phone\"} [debug] [W3C (c89fa9c2)] Calling AppiumDriver.findElement() with args: [\"id\",\"authorization_edittext_phone\",\" c89fa9c2-ca2b-49cd-ab31-590eeccf77d1\"] [debug] [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -and roid uiautomator [debug] [BaseDriver] Waiting up to 0 ms for condition [debug] [WD Proxy] Matched '\/element' to command name 'findElement' [debug] [WD Proxy] Proxying [POST \/element] to [POST http:\/\/127.0.0.1:8200\/wd\/hub\/session\/65943f03-3b35-4d3eb221-d6dc7988f935\/element] with body: {\"strategy\":\"id\",\"selector\": \"authorization_edittext_phone\",\"context\":\"\",\"multiple\":false} [WD Proxy] Got response with status 404: {\"sessionId\":\"65943f03-3b35-4d3e-b221-d6dc7988f935\",\"value\":{\"error\" :\"no such element\",\"message\":\"An element could not be located on the page using the given search parameters\",\"stacktrace\":\"io.appium.uiautomator2.common.exceptions.El ementNotFoundException: An element could not be located on the page using the given search parameters\\n\\tat io.appium.uiautomator2.handler.FindElement.safeHandle(Find Element.java:73)\\n\\tat io.appium.uiautomator2.handler.request.SafeRequestHandler.handle(SafeRequestHandler.java:41)\\n\\tat io.appium.uiautomator2.server.AppiumServlet. handleRequest(AppiumServlet.java:253)\\n\\tat io.appium.uiautomator2.server.AppiumServlet.handleHttpRequest(AppiumServlet.java:247)\\n\\tat io.appium.uiautomator2.http.Se rverHandler.channelRead(ServerHandler.java:68)\\n\\tat<\/code><\/pre>\n<\/div>\n<\/details>\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-387491","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/387491","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=387491"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/387491\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=387491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=387491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=387491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}