Люк, используй силу ... Если сможешь.

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.

Два момента, связанных с этой идеей:

  1. Откройте максимально легкую страницу приложения
  2. Попробуйте добавить 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 секунд на авторизацию в приложении и открытие целевой страницы. Впечатляющий. Это именно то, что мне нужно.

Всегда старайтесь найти лучшее решение, и вы его найдете! = _ =

Следующий рассказ о локальном хранилище: