Люк, используй силу ... Если сможешь.
TL;DR
Если ваше приложение разрешает - используйте cookie для авторизации в тесте.
Давай качать!
Через какое-то время при разработке и прохождении 1000000 тестов всегда приходишь к оптимизации.
Первый и главный момент для оптимизации - авторизация приложения.
Для хранения информации для входа я буду использовать простой класс данных:
public class User { private String email; private String password; getters... setters... }
С самого начала я использую один метод авторизации в приложении через пользовательский интерфейс:
public void authorizeWithUi(final User user) { webDriver.get("https://my-supa-dupa-app.com/login"); emailField.sendKeys(user.getEmail()); passwordField.sendKeys(user.getPassword()); loginButton.click(); }
И это работает. Просто работает. Этот метод занял у меня около 8–10 секунд. И почти каждый тест требовал авторизации.
Представьте, если количество тестов равно 100? ИЛИ 1000? Вы получаете огромное количество времени.
Оптимизация. Раунд 1.
Сначала мы добавили метод для автоматического входа пользователя в приложение. Но для этого мне нужен токен авторизации пользователя, который возвращает меня из вызова API. Но это дополнительный вызов API, который потребовал некоторого времени.
public void authorizeWithToken(final User user) { String token = api.getAutoLoginToken(user); webDriver.get("https://my-supa-dupa-app.com/auto-login/" + token); }
В этом случае для первого браузера перейдите по URL-адресу автоматического входа, а затем перенаправьте меня на авторизованную страницу в приложении.
Таким образом, в этом случае действие входа в систему заняло около 6–8 секунд. Не так много. Но у нас есть некоторый прогресс.
Оптимизация. Раунд 2.
Как и авторизация магазина приложений в cookie, давайте попробуем их использовать. В этом сценарии - сначала мне пришлось сначала открыть, а потом добавить файлы cookie.
public void authorizeWithCookie(final AccessToken accessToken) { webDriver.get("https://my-supa-dupa-app.com"); Cookie token = new Cookie("token", accessToken.getToken()); Cookie userId = new Cookie("userId", accessToken.getUserId()); webDriver.manage().addCookie(token); webDriver.manage().addCookie(userId); }
В этом случае мы снова переходим на страницу индекса, ждем загрузки страницы, затем добавляем файлы cookie и переходим на целевую страницу.
Не знаю почему, но Selenium добавляет куки с некоторой задержкой (медленно). В этом случае загрузка и авторизация страницы индекса заняли у меня около 7–9 секунд.
Это был хороший план, но что-то пошло не так: C
Оптимизация. Раунд 3.
После некоторого исследования и общения в автоматическом чате Slack у меня появилась новая идея. И это снова было связано с cookie.
Два момента, связанных с этой идеей:
- Откройте максимально легкую страницу приложения
- Попробуйте добавить cookie, используя JS, а не встроенный метод селена.
Насколько я знаю, самыми светлыми страницами являются /favicon.png
или /robots.txt
, потому что там нет контента. Но какая-то страница может отсутствовать. Я использую /robots.txt
, потому что у нас есть эта страница, и она содержит несколько строк текста - сверхлегкая страница!
public class Authorization { public void authorizeWithCookie(final AccessToken accessToken) { open("https://my-supa-dupa-app.com/robots.txt"); setItemInCookie("token", accessToken.getToken()); setItemInCookie("userId", accessToken.getUserId()); } private void setItemInCookie(final String item, final String value) { final String jsCode = String.format( "document.cookie='%s=%s';", item, value); executeJavaScript(jsCode); } private void executeJavaScript(final String jsCode) { ((JavascriptExecutor) webDriver).executeScript(jsCode); } private void open(final String url) { webDriver.get(url); } }
Так. Поскольку добавление cookie через JS быстрее, чем селен, открывайте светлую страницу - быстро. В результате у меня было около 2–4 секунд на авторизацию в приложении и открытие целевой страницы. Впечатляющий. Это именно то, что мне нужно.
Всегда старайтесь найти лучшее решение, и вы его найдете! = _ =