Anonymous
Автоматизация тестирования мобильного приложения с использованием Appium/Android Emulator/Containers/Katalon
Сообщение
Anonymous » 29 окт 2024, 05:32
Я провел довольно много времени в Интернете в поисках удовлетворительного решения, которое до сих пор не нашел, и думаю, оно может заинтересовать несколько человек.
Я занимаюсь автоматизацией тестирования для приложение для мобильных устройств (на данный момент Android, но в будущем и iOS).
Чтобы быть независимым от базовой ОС, я бы предпочел использовать контейнеры для развертывания приложения.
Можете ли вы порекомендовать, как действовать?
Вот один из моих пробных вариантов использования
docker Compose :
Код: Выделить всё
version: "3.9"
services:
selenium_hub:
image: selenium/hub:3.14.0-curium
networks:
my_network:
aliases:
- selenium_hub
ports:
- 4444:4444
nexus_emulator:
image: budtmo/docker-android
privileged: true
scale: 1
depends_on:
- selenium_hub
networks:
my_network:
aliases:
- nexus_emulator
ports:
- 6080:6080
- 4723:4723
- 5554:5554
- 5555:5555
volumes:
- /var/lib/docker/volumes/appium-tests-e2e/src/test/resources/apps:/root/tmp/
- /var/lib/docker/volumes/video-nexus_7.1.1:/tmp/video
environment:
- DEVICE=Nexus 5
- CONNECT_TO_GRID=true
- APPIUM=true
- SELENIUM_HOST=selenium_hub
- AUTO_RECORD=true
networks:
my_network:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/24
gateway: 172.16.0.1
Для полноты:
на Windows 11 запуск завершается неудачей .
На машине с Ubuntu он запускается правильно >.
Когда я обращаюсь к порту 4444, процесс-концентратор отвечает:
Код: Выделить всё
user@machine:/home/xxxx# curl localhost:4444
var json = Object.freeze('{"consoleLink": "\u002fgrid\u002fconsole","type": "Grid Hub","class": "org.openqa.grid.web.servlet.DisplayHelpServlet$DisplayHelpServletConfig","version": "3.14.0"}');
Selenium v.
Whoops! The URL specified routes to this help page.
For more information about Selenium please see the
[url=https://github.com/SeleniumHQ/selenium/blob/master/AUTHORS]people[/url], and our
[url=http://www.seleniumhq.org/sponsors/]sponsors[/url].
user@machine:/home/xxxx# curl localhost:4444/wd/hub
{
"sessionId": null,
"status": 13,
"value": {
"class": "java.lang.NullPointerException",
"error": "unknown error",
"message": null,
"stackTrace": [
{
"className": "org.openqa.grid.internal.ExternalSessionKey",
"fileName": "ExternalSessionKey.java",
"lineNumber": 79,
"methodName": "fromWebDriverRequest"
},
{
"className": "org.openqa.grid.web.servlet.handler.WebDriverRequest",
"fileName": "WebDriverRequest.java",
"lineNumber": 58,
"methodName": "extractSession"
},
{
"className": "org.openqa.grid.web.servlet.handler.RequestHandler",
"fileName": "RequestHandler.java",
"lineNumber": 240,
"methodName": "getSession"
},
{
"className": "org.openqa.grid.web.servlet.handler.RequestHandler",
"fileName": "RequestHandler.java",
"lineNumber": 123,
"methodName": "process"
},
{
"className": "org.openqa.grid.web.servlet.DriverServlet",
"fileName": "DriverServlet.java",
"lineNumber": 85,
"methodName": "process"
},
{
"className": "org.openqa.grid.web.servlet.DriverServlet",
"fileName": "DriverServlet.java",
"lineNumber": 63,
"methodName": "doGet"
},
{
"className": "javax.servlet.http.HttpServlet",
"fileName": "HttpServlet.java",
"lineNumber": 687,
"methodName": "service"
},
{
"className": "javax.servlet.http.HttpServlet",
"fileName": "HttpServlet.java",
"lineNumber": 790,
"methodName": "service"
},
{
"className": "org.seleniumhq.jetty9.servlet.ServletHolder",
"fileName": "ServletHolder.java",
"lineNumber": 860,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.servlet.ServletHandler",
"fileName": "ServletHandler.java",
"lineNumber": 535,
"methodName": "doHandle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 143,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.security.SecurityHandler",
"fileName": "SecurityHandler.java",
"lineNumber": 548,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper",
"fileName": "HandlerWrapper.java",
"lineNumber": 132,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 190,
"methodName": "nextHandle"
},
{
"className": "org.seleniumhq.jetty9.server.session.SessionHandler",
"fileName": "SessionHandler.java",
"lineNumber": 1595,
"methodName": "doHandle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 188,
"methodName": "nextHandle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ContextHandler",
"fileName": "ContextHandler.java",
"lineNumber": 1253,
"methodName": "doHandle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 168,
"methodName": "nextScope"
},
{
"className": "org.seleniumhq.jetty9.servlet.ServletHandler",
"fileName": "ServletHandler.java",
"lineNumber": 473,
"methodName": "doScope"
},
{
"className": "org.seleniumhq.jetty9.server.session.SessionHandler",
"fileName": "SessionHandler.java",
"lineNumber": 1564,
"methodName": "doScope"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 166,
"methodName": "nextScope"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ContextHandler",
"fileName": "ContextHandler.java",
"lineNumber": 1155,
"methodName": "doScope"
},
{
"className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
"fileName": "ScopedHandler.java",
"lineNumber": 141,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper",
"fileName": "HandlerWrapper.java",
"lineNumber": 132,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.Server",
"fileName": "Server.java",
"lineNumber": 530,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.HttpChannel",
"fileName": "HttpChannel.java",
"lineNumber": 347,
"methodName": "handle"
},
{
"className": "org.seleniumhq.jetty9.server.HttpConnection",
"fileName": "HttpConnection.java",
"lineNumber": 256,
"methodName": "onFillable"
},
{
"className": "org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback",
"fileName": "AbstractConnection.java",
"lineNumber": 279,
"methodName": "succeeded"
},
{
"className": "org.seleniumhq.jetty9.io.FillInterest",
"fileName": "FillInterest.java",
"lineNumber": 102,
"methodName": "fillable"
},
{
"className": "org.seleniumhq.jetty9.io.ChannelEndPoint$2",
"fileName": "ChannelEndPoint.java",
"lineNumber": 124,
"methodName": "run"
},
{
"className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
"fileName": "EatWhatYouKill.java",
"lineNumber": 247,
"methodName": "doProduce"
},
{
"className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
"fileName": "EatWhatYouKill.java",
"lineNumber": 140,
"methodName": "produce"
},
{
"className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
"fileName": "EatWhatYouKill.java",
"lineNumber": 131,
"methodName": "run"
},
{
"className": "org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread",
"fileName": "ReservedThreadExecutor.java",
"lineNumber": 382,
"methodName": "run"
},
{
"className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool",
"fileName": "QueuedThreadPool.java",
"lineNumber": 708,
"methodName": "runJob"
},
{
"className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2",
"fileName": "QueuedThreadPool.java",
"lineNumber": 626,
"methodName": "run"
},
{
"className": "java.lang.Thread",
"fileName": "Thread.java",
"lineNumber": 748,
"methodName": "run"
}
],
"stacktrace": "java.lang.NullPointerException\n\tat org.openqa.grid.internal.ExternalSessionKey.fromWebDriverRequest(ExternalSessionKey.java:79)\n\tat org.openqa.grid.web.servlet.handler.WebDriverRequest.extractSession(WebDriverRequest.java:58)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.getSession(RequestHandler.java:240)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:123)\n\tat org.openqa.grid.web.servlet.DriverServlet.process(DriverServlet.java:85)\n\tat org.openqa.grid.web.servlet.DriverServlet.doGet(DriverServlet.java:63)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:687)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.seleniumhq.jetty9.servlet.ServletHolder.handle(ServletHolder.java:860)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doHandle(ServletHandler.java:535)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:143)\n\tat org.seleniumhq.jetty9.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doScope(ContextHandler.java:1155)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:141)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.Server.handle(Server.java:530)\n\tat org.seleniumhq.jetty9.server.HttpChannel.handle(HttpChannel.java:347)\n\tat org.seleniumhq.jetty9.server.HttpConnection.onFillable(HttpConnection.java:256)\n\tat org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)\n\tat org.seleniumhq.jetty9.io.FillInterest.fillable(FillInterest.java:102)\n\tat org.seleniumhq.jetty9.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)\n\tat org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)\n\tat java.lang.Thread.run(Thread.java:748)\n"
}
}
Эмулятор Android также ищет:
user@machine:/home/xxxx# curl localhost:4723
{"status":9,"value": {"ошибка":"неизвестная команда","сообщение":"Запрошенный ресурс не найден, или запрос был получен с использованием метода HTTP, который не поддерживается сопоставленным ресурсом","stacktrace":""}}
Мой инструмент для тестирования — Katalon Engine. Мне сложно заставить его работать с Android таким образом, используя удаленное соединение.
URL моего удаленного сервера :
http://10.1 . 100.45:4444/wd/hub
Тип удаленного сервера :
Appium
Драйвер Appium :
Драйвер Android
Код: Выделить всё
2023-12-08 17:32:44.755 ERROR c.k.katalon.core.main.TestCaseExecutor - ❌ Test Cases/Toto FAILED.
Reason:
com.kms.katalon.core.exception.StepFailedException: Unable to start app with application ID: 'my_emulator' (Root cause: org.openqa.selenium.SessionNotCreatedException: Unable to create a new remote session. Please check the server log for more details. Original error: Unable to parse remote response:
Error 500 Server Error
HTTP ERROR 500
Problem accessing /wd/hub/session. Reason:
Server Error
Caused by:
java.io.IOException: org.openqa.grid.common.exception.GridException: Cannot extract a capabilities from the request: {
"desiredCapabilities": {
"appActivity": ".Settings",
"appPackage": "com.android.settings",
"newCommandTimeout": 1800,
"autoGrantPermissions": true,
"platformName": "Android",
"platform": "ANDROID",
"systemPort": 8221
},
...
Ваши рекомендации приветствуются.
С уважением!
Подробнее здесь:
https://stackoverflow.com/questions/776 ... ator-conta
1730169135
Anonymous
Я провел довольно много времени в Интернете в поисках удовлетворительного решения, которое до сих пор не нашел, и думаю, оно может заинтересовать несколько человек. Я занимаюсь автоматизацией тестирования для приложение для мобильных устройств (на данный момент Android, но в будущем и iOS). Чтобы быть независимым от базовой ОС, я бы предпочел использовать контейнеры для развертывания приложения. Можете ли вы порекомендовать, как действовать? Вот один из моих пробных вариантов использования [b]docker Compose[/b]: [code]version: "3.9" services: selenium_hub: image: selenium/hub:3.14.0-curium networks: my_network: aliases: - selenium_hub ports: - 4444:4444 nexus_emulator: image: budtmo/docker-android privileged: true scale: 1 depends_on: - selenium_hub networks: my_network: aliases: - nexus_emulator ports: - 6080:6080 - 4723:4723 - 5554:5554 - 5555:5555 volumes: - /var/lib/docker/volumes/appium-tests-e2e/src/test/resources/apps:/root/tmp/ - /var/lib/docker/volumes/video-nexus_7.1.1:/tmp/video environment: - DEVICE=Nexus 5 - CONNECT_TO_GRID=true - APPIUM=true - SELENIUM_HOST=selenium_hub - AUTO_RECORD=true networks: my_network: driver: bridge ipam: config: - subnet: 172.16.0.0/24 gateway: 172.16.0.1 [/code] Для полноты: [b]на Windows 11 запуск завершается неудачей[/b]. [b]На машине с Ubuntu он запускается правильно[/b] >. Когда я обращаюсь к порту 4444, процесс-концентратор отвечает: [code]user@machine:/home/xxxx# curl localhost:4444 var json = Object.freeze('{"consoleLink": "\u002fgrid\u002fconsole","type": "Grid Hub","class": "org.openqa.grid.web.servlet.DisplayHelpServlet$DisplayHelpServletConfig","version": "3.14.0"}'); Selenium v. Whoops! The URL specified routes to this help page. For more information about Selenium please see the [url=https://github.com/SeleniumHQ/selenium/blob/master/AUTHORS]people[/url], and our [url=http://www.seleniumhq.org/sponsors/]sponsors[/url]. user@machine:/home/xxxx# curl localhost:4444/wd/hub { "sessionId": null, "status": 13, "value": { "class": "java.lang.NullPointerException", "error": "unknown error", "message": null, "stackTrace": [ { "className": "org.openqa.grid.internal.ExternalSessionKey", "fileName": "ExternalSessionKey.java", "lineNumber": 79, "methodName": "fromWebDriverRequest" }, { "className": "org.openqa.grid.web.servlet.handler.WebDriverRequest", "fileName": "WebDriverRequest.java", "lineNumber": 58, "methodName": "extractSession" }, { "className": "org.openqa.grid.web.servlet.handler.RequestHandler", "fileName": "RequestHandler.java", "lineNumber": 240, "methodName": "getSession" }, { "className": "org.openqa.grid.web.servlet.handler.RequestHandler", "fileName": "RequestHandler.java", "lineNumber": 123, "methodName": "process" }, { "className": "org.openqa.grid.web.servlet.DriverServlet", "fileName": "DriverServlet.java", "lineNumber": 85, "methodName": "process" }, { "className": "org.openqa.grid.web.servlet.DriverServlet", "fileName": "DriverServlet.java", "lineNumber": 63, "methodName": "doGet" }, { "className": "javax.servlet.http.HttpServlet", "fileName": "HttpServlet.java", "lineNumber": 687, "methodName": "service" }, { "className": "javax.servlet.http.HttpServlet", "fileName": "HttpServlet.java", "lineNumber": 790, "methodName": "service" }, { "className": "org.seleniumhq.jetty9.servlet.ServletHolder", "fileName": "ServletHolder.java", "lineNumber": 860, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.servlet.ServletHandler", "fileName": "ServletHandler.java", "lineNumber": 535, "methodName": "doHandle" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 143, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.security.SecurityHandler", "fileName": "SecurityHandler.java", "lineNumber": 548, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper", "fileName": "HandlerWrapper.java", "lineNumber": 132, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 190, "methodName": "nextHandle" }, { "className": "org.seleniumhq.jetty9.server.session.SessionHandler", "fileName": "SessionHandler.java", "lineNumber": 1595, "methodName": "doHandle" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 188, "methodName": "nextHandle" }, { "className": "org.seleniumhq.jetty9.server.handler.ContextHandler", "fileName": "ContextHandler.java", "lineNumber": 1253, "methodName": "doHandle" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 168, "methodName": "nextScope" }, { "className": "org.seleniumhq.jetty9.servlet.ServletHandler", "fileName": "ServletHandler.java", "lineNumber": 473, "methodName": "doScope" }, { "className": "org.seleniumhq.jetty9.server.session.SessionHandler", "fileName": "SessionHandler.java", "lineNumber": 1564, "methodName": "doScope" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 166, "methodName": "nextScope" }, { "className": "org.seleniumhq.jetty9.server.handler.ContextHandler", "fileName": "ContextHandler.java", "lineNumber": 1155, "methodName": "doScope" }, { "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler", "fileName": "ScopedHandler.java", "lineNumber": 141, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper", "fileName": "HandlerWrapper.java", "lineNumber": 132, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.Server", "fileName": "Server.java", "lineNumber": 530, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.HttpChannel", "fileName": "HttpChannel.java", "lineNumber": 347, "methodName": "handle" }, { "className": "org.seleniumhq.jetty9.server.HttpConnection", "fileName": "HttpConnection.java", "lineNumber": 256, "methodName": "onFillable" }, { "className": "org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback", "fileName": "AbstractConnection.java", "lineNumber": 279, "methodName": "succeeded" }, { "className": "org.seleniumhq.jetty9.io.FillInterest", "fileName": "FillInterest.java", "lineNumber": 102, "methodName": "fillable" }, { "className": "org.seleniumhq.jetty9.io.ChannelEndPoint$2", "fileName": "ChannelEndPoint.java", "lineNumber": 124, "methodName": "run" }, { "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill", "fileName": "EatWhatYouKill.java", "lineNumber": 247, "methodName": "doProduce" }, { "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill", "fileName": "EatWhatYouKill.java", "lineNumber": 140, "methodName": "produce" }, { "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill", "fileName": "EatWhatYouKill.java", "lineNumber": 131, "methodName": "run" }, { "className": "org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread", "fileName": "ReservedThreadExecutor.java", "lineNumber": 382, "methodName": "run" }, { "className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool", "fileName": "QueuedThreadPool.java", "lineNumber": 708, "methodName": "runJob" }, { "className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2", "fileName": "QueuedThreadPool.java", "lineNumber": 626, "methodName": "run" }, { "className": "java.lang.Thread", "fileName": "Thread.java", "lineNumber": 748, "methodName": "run" } ], "stacktrace": "java.lang.NullPointerException\n\tat org.openqa.grid.internal.ExternalSessionKey.fromWebDriverRequest(ExternalSessionKey.java:79)\n\tat org.openqa.grid.web.servlet.handler.WebDriverRequest.extractSession(WebDriverRequest.java:58)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.getSession(RequestHandler.java:240)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:123)\n\tat org.openqa.grid.web.servlet.DriverServlet.process(DriverServlet.java:85)\n\tat org.openqa.grid.web.servlet.DriverServlet.doGet(DriverServlet.java:63)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:687)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.seleniumhq.jetty9.servlet.ServletHolder.handle(ServletHolder.java:860)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doHandle(ServletHandler.java:535)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:143)\n\tat org.seleniumhq.jetty9.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doScope(ContextHandler.java:1155)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:141)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.Server.handle(Server.java:530)\n\tat org.seleniumhq.jetty9.server.HttpChannel.handle(HttpChannel.java:347)\n\tat org.seleniumhq.jetty9.server.HttpConnection.onFillable(HttpConnection.java:256)\n\tat org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)\n\tat org.seleniumhq.jetty9.io.FillInterest.fillable(FillInterest.java:102)\n\tat org.seleniumhq.jetty9.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)\n\tat org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)\n\tat java.lang.Thread.run(Thread.java:748)\n" } } [/code] Эмулятор Android также ищет: user@machine:/home/xxxx# curl localhost:4723 {"status":9,"value": {"ошибка":"неизвестная команда","сообщение":"Запрошенный ресурс не найден, или запрос был получен с использованием метода HTTP, который не поддерживается сопоставленным ресурсом","stacktrace":""}} Мой инструмент для тестирования — Katalon Engine. Мне сложно заставить его работать с Android таким образом, используя удаленное соединение. [b]URL моего удаленного сервера[/b]: http://10.1. 100.45:4444/wd/hub [b]Тип удаленного сервера[/b]: Appium [b]Драйвер Appium [/b]: Драйвер Android [code]2023-12-08 17:32:44.755 ERROR c.k.katalon.core.main.TestCaseExecutor - ❌ Test Cases/Toto FAILED. Reason: com.kms.katalon.core.exception.StepFailedException: Unable to start app with application ID: 'my_emulator' (Root cause: org.openqa.selenium.SessionNotCreatedException: Unable to create a new remote session. Please check the server log for more details. Original error: Unable to parse remote response: Error 500 Server Error HTTP ERROR 500 Problem accessing /wd/hub/session. Reason: Server Error Caused by: java.io.IOException: org.openqa.grid.common.exception.GridException: Cannot extract a capabilities from the request: { "desiredCapabilities": { "appActivity": ".Settings", "appPackage": "com.android.settings", "newCommandTimeout": 1800, "autoGrantPermissions": true, "platformName": "Android", "platform": "ANDROID", "systemPort": 8221 }, ... [/code] Ваши рекомендации приветствуются. С уважением! Подробнее здесь: [url]https://stackoverflow.com/questions/77628147/test-automation-for-a-mobile-application-using-appium-android-emulator-conta[/url]