Skip to content

Travel the World: by using the geolocation override provided by Selenium 4

30-11-2021 Roy de Kleijn

Location-based features are always a challenge to test. Of course, you can get out in the field and visit the physical location. It can be fun :) but not ideal for testing (especially automation).

In the example below we travel to Amsterdam, Mumbai, London and finally New York.

I reload https://my-location.org to check my current geolocation.

package io.testsmith.selenium.features;

import org.openqa.selenium.By;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v96.emulation.Emulation;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.time.Duration;
import java.util.Optional;

public class EmulateGeoLocationTests extends TestBase {

    private final static Number AMSTERDAM_LAT = 52.371807;
    private final static Number AMSTERDAM_LNG = 4.896029;
    private final static String AMSTERDAM_ADDRESS = "Damstraat, 1012 EW Amsterdam, Netherlands";

    private final static Number MUMBAI_LAT = 19.075983;
    private final static Number MUMBAI_LNG = 72.877655;
    private final static String MUMBAI_ADDRESS = "Santa Cruz Chamber Link Road, Halav Pool, Kurla West, Mumbai, 400070, Maharashtra, India";

    private final static Number NEW_YORK_LAT = 40.712776;
    private final static Number NEW_YORK_LNG = -74.005974;
    private final static String NEW_YORK_ADDRESS = "City Hall Park, 1 City Hall, New York, NY 10007, United States";

    private final static Number LONDON_LAT = 51.507351;
    private final static Number LONDON_LNG = -0.127758;
    private final static String LONDON_ADDRESS = "Charing Cross, London, WC2N, England";


    @Test
    public void setNewLocation() {
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        driver.get("https://my-location.org/");
        
        DevTools devTools = driver.getDevTools();
        devTools.createSession();
        devTools.send(Emulation.setGeolocationOverride(Optional.of(AMSTERDAM_LAT),
                Optional.of(AMSTERDAM_LNG),
                Optional.of(1)));
        driver.navigate().refresh();
        Assert.assertTrue(wait.until(ExpectedConditions.textToBe(By.id("address"), AMSTERDAM_ADDRESS)));

        devTools.send(Emulation.setGeolocationOverride(Optional.of(MUMBAI_LAT),
                Optional.of(MUMBAI_LNG),
                Optional.of(1)));
        driver.navigate().refresh();
        Assert.assertTrue(wait.until(ExpectedConditions.textToBe(By.id("address"), MUMBAI_ADDRESS)));

        devTools.send(Emulation.setGeolocationOverride(Optional.of(LONDON_LAT),
                Optional.of(LONDON_LNG),
                Optional.of(1)));
        driver.navigate().refresh();
        Assert.assertTrue(wait.until(ExpectedConditions.textToBe(By.id("address"), LONDON_ADDRESS)));

        devTools.send(Emulation.setGeolocationOverride(Optional.of(NEW_YORK_LAT),
                Optional.of(NEW_YORK_LNG),
                Optional.of(1)));
        driver.navigate().refresh();
        Assert.assertTrue(wait.until(ExpectedConditions.textToBe(By.id("address"), NEW_YORK_ADDRESS)));
    }
}

Delen:
Roy de Kleijn

Test Automation Expert

Met meer dan 15 jaar ervaring in software testing en test automation helpt Roy teams om hun testprocessen te verbeteren.

Wil je meer leren?

Bekijk onze trainingen en breng je test automation skills naar het volgende niveau.