Комплексное тестирование расширений Chrome

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

См. руководство «Тестирование расширений Chrome с помощью Puppeteer» и модульное тестирование для получения подробной информации о написании модульных тестов для расширений Chrome.

Использование библиотек тестирования браузера

Расширения поддерживаются рядом библиотек тестирования.

Библиотека Руководство
Кукольник/Драматург См. Расширения Chrome ( Кукловод / Драматург ).
Селен Используйте объект ChromeOptions для загрузки расширений. Более подробная информация доступна здесь .
ВебДрайверИО См. Тестирование веб-расширений .

Запуск тестов в Headless Chrome

При запуске тестов в рамках автоматизированного рабочего процесса часто необходимо загрузить расширение на машину, не имеющую экрана. Новый безгласный режим Chrome позволяет запускать Chrome в такой автоматической среде. Запустите Chrome, используя флаг --headless=new (в настоящее время для headless установлено значение «старый», который не поддерживает загрузку расширений). В зависимости от выбранного вами инструмента автоматизации может быть настройка, автоматически добавляющая этот флаг.

Установка идентификатора расширения

Часто желательно иметь фиксированный идентификатор расширения в тестах. Это упрощает многие распространенные задачи, такие как внесение источника расширения в список разрешенных на сервере, с которым ему необходимо взаимодействовать, или открытие страниц расширения в тестах. Для этого выполните действия, описанные в разделе «Сохранение постоянного идентификатора расширения» .

Тестирование страниц расширения

Доступ к страницам расширений можно получить, используя соответствующий URL-адрес, например chrome-extension://<id>/index.html . Используйте обычные методы навигации, доступные в выбранном вами инструменте автоматизации, чтобы перейти к этим URL-адресам.

Тестирование всплывающего окна расширения

Открытие всплывающего окна расширения в контексте другой страницы в настоящее время невозможно. Вместо этого откройте URL-адрес всплывающего окна в новой вкладке. Если ваше всплывающее окно использует активную вкладку, рассмотрите возможность реализации переопределения, при котором идентификатор вкладки может быть явно передан вашему всплывающему окну. Например:

const URL_PARAMS  = new URLSearchParams(window.location.search);

async function getActiveTab() {
  // Open popup.html?tab=5 to use tab ID 5, etc.
  if (URL_PARAMS.has("tab")) {
    return parseInt(URL_PARAMS.get("tab"));
  }

  const tabs = await chrome.tabs.query({
    active: true,
    currentWindow: true
  });

  return tabs[0];
}

Проверка состояния расширения

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

В «Кукловоде»:

const workerTarget = await browser.waitForTarget(
  target => target.type() === 'service_worker'
);
const worker = await workerTarget.worker();

const value = await worker.evaluate(() => {
  chrome.storage.local.get('foo');
});

В Селене:

// Selenium doesn't allow us to access the service worker, so we need to open an extension page where we can execute the code
await driver.get('chrome-extension://<id>/popup.html');
await driver.executeAsyncScript(
  'const callback = arguments[arguments.length - 1];' +
  'chrome.storage.local.get(\'foo\').then(callback);'
);

Завершение работы работника службы тестирования

Чтобы узнать о тестировании завершения Service Worker, см. Тестирование завершения Service Worker с помощью Puppeteer . У нас также есть образец для Puppeteer и Selenium.

Обратите внимание, что при использовании некоторых платформ тестирования сервис-воркеры могут не завершать работу автоматически, как при обычном использовании. Так обстоит дело в Selenium. Он опирается на ChromeDriver, который подключает отладчик ко всем сервисным работникам, предотвращая их остановку.