Автоматизация тестирования мобильного приложения с использованием Appium/Android Emulator/Containers/KatalonAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Автоматизация тестирования мобильного приложения с использованием Appium/Android Emulator/Containers/Katalon

Сообщение Anonymous »

Я провел довольно много времени в Интернете в поисках удовлетворительного решения, которое до сих пор не нашел, и думаю, оно может заинтересовать несколько человек.
Я занимаюсь автоматизацией тестирования для приложение для мобильных устройств (на данный момент 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Создайте сеанс чтения с Emulator Emulator TestContainer с Apache Beam
    Anonymous » » в форуме JAVA
    0 Ответы
    74 Просмотры
    Последнее сообщение Anonymous
  • Автоматизация тестирования штрих-кодов с использованием selenium Webdriver, appium в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как переместить изображение в галерею устройств iOS перед запуском автоматизации тестирования Katalon iOS?
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • SwipeGesture не поддерживается BrowserStack – автоматизация с использованием Appium – Android
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как получить прошедшее время при запуске тестового примера в Katalon?
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»