Автоматизация пользовательских сценариев в Telegram. Как войти?

webdriver
selenium
Теги: #<Tag:0x00007fedb8e87490> #<Tag:0x00007fedb8e87350>

(Gukobrist) #1

Всем привет! Возникла такая потребность как автоматизация пользовательских действий в telegram. По сути это тестирование бота. Необходимо описать некоторое количество тестовых сценарий, а так же протестировать оплату.

Но все тут же упирается в то, что перед входом в вебверсию месенджера, необходимо ввести номер телефона и затем код, который высылается на этот номер телефона. Так же код высылается в твой аккаунт на других устройствах где учетная запись уже авторизована.

Никакой информации в документации о настройках тестовых учетных записей я не нашел.

Может кто-то встречался с подобным? Подскажите как быть? По идеи такая же проблема должна возникать и при авторизации в других соцсетях Vk, facebook, twitter, odnoklassniki.


(Lev Yarushin) #2

Не понятно в чем вопрос. Как решить проблему с получением кода в смс либо как войти в свой аккаунт в телеграм на тестовой машине.


(Gukobrist) #3

Да, как решить проблему с вводом login code. Каждый раз когда вызывается браузер, создается новая сессия, в которой приходится авторизироваться через подтверждение login code. Но когда мы просто пользуемся вебверсией, то у нас сохраняется кука для аккаунта и сессия живет, пока мы ей пользуемся. Можно ли как-то в Pytest создать фикстуру, которая будет хранить сессию нужную или типа того?


(Lev Yarushin) #4

Сохраните данные сессии и восстанавливайте при запуске браузера.
Например так:


(Maxim Andryushchenkov) #5

Фикстура ничего не хранит. Это функция, которая готовит стенд для тестирования. В вашем случае вы можете создать фикстуру для получения уже авторизованного пользователя

Это и есть основное свойство автотестов - быть независимыми друг от друга. Это значит что вы обязаны хотябы авторизоваться перед тестом. Не говоря уже о пересоздании пользователя.


(Oleksandr Khotemskyi) #6

Я бы смотрел в сторону специализированных инструментов типа -
https://www.npmjs.com/package/telegram-test-api#full-sample

Не вижу смысла тестировать бота через UI


(Gukobrist) #7

Мой стенд подразумевает наличие precondition - залогиненный пользователь или запуск теста с определенной активной сессией. Разве нельзя сделать такую фикстуру? А есть может пример фикстуры с залагониненным пользователем или вы имеете ввиду, что просто данная фикстура будет содержать в самом начале действия по вводу учетных данных?


(Gukobrist) #8

Это следующий шаг) но все равно спасибо вам большое. Я тоже уже обратил на это внимание.


(Oleksandr Khotemskyi) #9

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


(Баранов Иван) #10

И последний. Ато получается, что тестируем сам Telegram.


(Maxim Andryushchenkov) #11

Да, фикстура в себе содержит общие для всех/нескольких тестов начальные/конечные шаги. В вашем случае фикстура может начинаться с перехода на страницу логина, затем вводятся учетные данные, пользователь логинится и его редиректит на какую то страницу. Вот куда он пришел после логина - так и назовите фикстуру. Потом при ее вызове вы будете понимать что там в ней произошло. Ну и в фикстуре верните класс страницы, на которую пришел пользователь либо ретурном, либо используйте yield_fixture.


(Gukobrist) #12

В общем я обнаружил настройки которые позволяют сохранять весь кеш и при этом при запуске каждого теста, вам не придется логиниться заново.

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

@pytest.fixture(scope='session', autouse=True)
def driver(request):
    print("\nstart SESSION")
    chrome_options = Options()
    chrome_options.add_argument("user-data-dir=selenium")
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path='bin/chromedriver')
    driver.maximize_window()
    return driver

Конкретно в моем случае, мне нужно тестить бота в веб версии телеграм. С вероятностью 99% тестировщики телеграм протестировали всю кросбраузерность и т.д. Поэтому я могу взять любой браузер (я взял chrome) и из selenium импортнуть Options для данного браузера

from selenium.webdriver.chrome.options import Options

Затем нам нужно настроить chrome на сохранение кеша и указать путь, где он будет храниться.

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium")

И при вызове драйвера указать, что его нужно вызывать с определенными настройками.

chrome_options=chrome_options

Все, теперь нужно залогиниться 1 раз и после вам не придется этого делать.


(Oleksandr Khotemskyi) #13

Как вы можете быть уверенны что бажина не в UI клиенте, а у вас? Откуда набрать кучу тестовых юзеров - каждому ведь нужна своя симка? А если юзер один, то как паралелить тогда? Как сбрасывать состояние бота?

Зачем вам вообще браузер для тестирования бота? Этих юаек для телеграмма - уже больше 9000 и официальных и неофициальных, по какому принципу тогда выбирать? На CI системах прийдется устанавливать и питон, и селениум стенделон, и хром драйвер, и хром, а еще и обновлять это все. Запуск получается тяжелым и медленным.

Все ваши проблемы можно решить просто эмуляцией событий от телеграмм сервера, и чтением состояния бота и проверки что он корректно реагирует на события сервера. Тогда все скатывается в граммотный моккинг, и эдакое подобие юнит тестов.

Боты это не сложно. Городить селениум там где он не нужен - вот это сложно


(Gukobrist) #14

Я попробую отбиться от ваших вопросов, но я конечно понимаю, что вы правы скорее всего. Я просто пока не секу в другом тестировании, кроме как selenium и page object (и то на уровне нуба). Может вы мне сможете показать простой пример тестсьюита, где например ожидаемый результат одного теста используется как предусловия следующего теста.
Например 1) пользователь вошел в телеграм - ожидаемый результат - он залогинен (проверить можно как угодно), 2) пользователь залогинен - пользователь добавляет любого бота через отправку команды /start - ожидаемый результат - бот появляется в списке conversation слева. 3) пользователь залогинен, бот с в списке conversation слева - пользователь удаляет бота из списка conversation через меню бота - ожидаемый результат - бот удален.

Попробую на ваши вопросы ответить)

  1. ui телеграма тестирует телеграм. Я пишу тесты для функционального end to end тестирования бота.
  2. нам не нужно куча пользователей. Достаточно иметь 3-5 пользователей, чтобы проверить весь функционал очень быстро (обычно боты телеги не обладают таким большим функционалом). Номера можете брать тут для телеги 3 рубля номер.
  3. Состояние бота сбрасывается удаением бота и конверсейшн, так же можно удалять пользователя из базы бота. (мне кажется я не правильно понял вопрос).
  4. юайки для телеграмм, вы имеете ввиду приложения и веббраузеры. Нас не волнует как работает приложение приложение. Мы тестируем функционал бота, нам нужно просто выполнить юзеркейсы от точки А до точки Б (например оплата).
  5. Мы используем CI TeamCity, бот на питоне и так. Собирать в проекте ничего не надо. Мы просто ловим тригер о том что что-то попало на гит в такую-то ветку и через ssh запускаем тесты.
  6. поставить библиотеку slenium не проблема
  7. следить за дравйвером гемор, согласен.
  8. ну поддерживать и обновлять придется в любом случае.
  9. Насчет запуска расскажу когда запущу)

Спасибо Олександр.


(Dmytro Kryshtopenko) #15

Он прав.
Действительно выдергивай куку сессии webDriver.manage().getCookieNamed("JSESSIONID"), храни и пользуйся.
Только не заканчивай сессию (do not log out), или она, кука, умрет.