t.me/atinfo_chat Telegram группа по автоматизации тестирования

Научился использовать потоки для запуска теста с selenium

Теги: #<Tag:0x00007f7488f54480> #<Tag:0x00007f7488f54368> #<Tag:0x00007f7488f54278> #<Tag:0x00007f7488f541b0> #<Tag:0x00007f7488f540c0>

Всем привет. Может кому-то поможет. Дня три я бился с одной проблемой, которую никак не мог понять. Нужно было проверить приём сообщений на клиенте. Для этого была написана api, которая отправляет по web socket’у сообщение клиенту, на клиенте нужно было в реальном времени проверить, пришло ли сообщение. Здесь без потоков было не обойтись. Хотя может, кто-то предложит другое решение.

Также я узнал, что в java можно реализовать это ассинхронным методом, используя класс
CompletableFuture.runAsync (как один из вариантов), но всё никак не выходило то, что мне нужно. То тест падал, потому что оказывается, если WebDriver вызвать в одном потоке, а искать элементы и выполнять другие действия, в котором нужен экземпляр Webriver, в другом потоке, то тест падает, потому как в новом потоке не инициализирован WebDriver.

И вот сегодня наконец-то нашёл решение.


Runnable getMessage = () -> {
            assertTrue(chatsPage.isGetNewMessage(CONTACT_NUMBER_7013, CLIENT_CHATS_SEND_MESSAGE));
        };
 
        Thread sendMessage = new Thread() {
            @Override
            public void run() {
                Selenide.sleep(3000);
                apiToServer.SendTextMessageToUser(
                        "user",
                        IDForReceivingMessageUser,
                        "text",
                        CLIENT_CHATS_SEND_MESSAGE,
                        60
                );
                apiToServer.disconnect();
            }
        };
 
        sendMessage.start();
        getMessage.run();

Итак, расскажу, как я понимаю, почему эта конструкция работает так, как мне надо.

Интерфейс Runnable имеет всего один метод run() и как сказано на одном из сайтов по потокам

Метод run() выполняется при запуске потока. После определения объекта Runnable он передается в один из конструкторов класса Thread

А т.к. текущий класс не наследует интерфейс Runnable, поэтому Runnable передаётся в конструктор класса основного потока main. А тут уже инициализирован WebDriver, то что нужно.

С конструкцией Thread думаю более менее понятно.

Таким же образом можно инициализировать второй экземпляр WebDriver, если например нужно проверить отправку чего-то, кому-то. Или для других целей.

Надеюсь я все правильно понял и эта информация кому-нибудь поможет. Или поправьте меня, если я написал ерунду)

я, если честно, не понимаю, что именно вы тестируете

у вас некое приложение, которое запускается локально и в себе хранит сообщения? у него есть порт для приёма сообщений, куда вы засылаете данные, а потом селениумом проверяете, что сообщение появилось?

Мы разрабатываем клиент-серверное приложение для корпоративных клиентов, в котором будут чаты, звонки, аудио и видеоконференции, рация и другие функции. Сейчас пишу тесты для проверки чатов, об этом и написал в первом сообщении)

а при чем тут потоки? у вас приложение на порту каком-то ждёт входящий траффик, вы его засылаете и селениумом проверяете

поток вы используете для синхронизации? то есть зашли в приложение, потом в этом же потоке выполнения засылаете сообщение в чат?

В главном потоке у меня работает selenium, в другом API, которое имитирует второго клиента. По сути всё верно, приложение ждёт каких-то event событий на определённом порту