Всем привет. Может кому-то поможет. Дня три я бился с одной проблемой, которую никак не мог понять. Нужно было проверить приём сообщений на клиенте. Для этого была написана 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, если например нужно проверить отправку чего-то, кому-то. Или для других целей.
Надеюсь я все правильно понял и эта информация кому-нибудь поможет. Или поправьте меня, если я написал ерунду)