Эмуляция геолокации

Зачем использовать эмуляцию геолокации?

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

Основные моменты эмуляции

В Puppeteer можно эмулировать геолокацию с помощью API page.setGeolocation(). Это позволяет устанавливать положение для браузера, а значит, и для тестируемого сайта, на любую точку на карте. Такая возможность полезна для проверки корректности работы с картами, локализацией контента или геозависимыми сервисами (например, сервисами доставки).

Для правильной работы с геолокацией нужно также позаботиться о разрешении на доступ к местоположению. Это можно сделать с помощью API браузера, а именно — передав соответствующие настройки через navigator.geolocation.getCurrentPosition.

Настройка геолокации с помощью Puppeteer

Для начала работы с эмуляцией геолокации в Puppeteer необходимо вызвать метод page.setGeolocation(), передав ему объект с нужными параметрами: широтой, долготой и точностью.

Пример кода для настройки геолокации:

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  // Эмуляция геолокации
  await page.setGeolocation({
    latitude: 55.7558,   // широта для Москвы
    longitude: 37.6176,  // долгота для Москвы
  });

  await page.goto('https://www.example.com'); // Переход на сайт

  // Проверка геолокации
  await page.evaluate(() => {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition((position) => {
        console.log(`Latitude: ${position.coords.latitude}, Longitude: ${position.coords.longitude}`);
      });
    } else {
      console.log('Geolocation is not supported by this browser.');
    }
  });

  await browser.close();
})();

В этом примере создается экземпляр браузера и страницы, после чего с помощью page.setGeolocation() устанавливается геолокация для города Москвы. Далее на странице проверяется, что геолокация правильно настроена.

Эмуляция геолокации с использованием симуляции положения через консоль браузера

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

Пример:

await page.evaluateOnNewDocument(() => {
  navigator.geolocation.getCurrentPosition = function (cb) {
    cb({
      coords: {
        latitude: 55.7558,   // Москва
        longitude: 37.6176,
      }
    });
  };
});

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

Разрешение на доступ к геолокации

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

Для этого используется метод page.setPermission(), который позволяет симулировать разрешение на доступ к геолокации.

Пример:

await page.setPermission('geolocation', 'granted');

Этот код перед загрузкой страницы разрешит доступ к геолокации, эмулируя подтверждение пользователя. Если бы было нужно отклонить доступ, можно передать ‘denied’ вместо ‘granted’.

Установка точности геолокации

Кроме широты и долготы, параметр точности геолокации может оказать влияние на поведение веб-приложений. В Puppeteer точность задается через параметр accuracy в методе setGeolocation().

Пример:

await page.setGeolocation({
  latitude: 55.7558,
  longitude: 37.6176,
  accuracy: 100 // точность в метрах
});

Задание точности геолокации может быть полезно, если тестируемое приложение зависимо от того, насколько точно определяется местоположение пользователя (например, для служб такси или навигации).

Проверка работы геолокации

Для того чтобы убедиться, что эмуляция геолокации работает корректно, можно использовать простой скрипт, который будет выводить в консоль текущие координаты:

await page.evaluate(() => {
  navigator.geolocation.getCurrentPosition(function(position) {
    console.log(position.coords.latitude, position.coords.longitude);
  });
});

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

Эмуляция геолокации для различных стран и регионов

Для тестирования приложения в разных странах, достаточно менять параметры широты и долготы. Например, можно эмулировать местоположение в Нью-Йорке или Лондоне:

await page.setGeolocation({
  latitude: 40.7128,  // Нью-Йорк
  longitude: -74.0060
});

Или для Лондона:

await page.setGeolocation({
  latitude: 51.5074,  // Лондон
  longitude: -0.1278
});

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

Заключение

Эмуляция геолокации в Puppeteer — мощный инструмент для тестирования веб-приложений в условиях различных местоположений. Использование методов page.setGeolocation() и page.setPermission() позволяет точно имитировать поведение пользователя в разных странах и регионах. Это особенно важно для проверки геозависимых функций, таких как отображение локализованного контента, работа карт и служб доставки.