Geo testing guide

Test geo-specific pages from real regional profiles.

Geo pages react to IP, timezone, and locale together. A browser profile pins all three per market, so what you test is what your users in that market see.

Guide updated 2026-09-01. Follow the steps in order.

Direct answer

Create one AliasMode profile per market with a proxy in that region, then launch it through the Local API in your test runs and assert on the geo signals you care about.

What you will accomplish

Before you start

  • The list of markets you must verify: country, language, currency
  • One residential proxy per market
  • AliasMode installed on Windows, Local API on 127.0.0.1:50400
  • A Playwright test suite or a simple check script

Step-by-step

  1. Build the market matrix

    List each market with its expected signals: country, language, currency, tax or legal banner, and any redirect behavior. This matrix is the spec your profiles will verify.

  2. One profile per market

    Create a profile per market: geo·de·berlin, geo·jp·tokyo. Fixed fingerprint seed per profile so each market also has a stable device.

  3. Match proxy, timezone, and locale

    Attach the market's residential proxy and run the preflight — it reports exit IP and timezone. Set the browser's locale to the market language so navigator.language and Accept-Language agree with the IP.

  4. Baseline the signals

    Open a geo-signal page (search 'my ip', currency display, or your own /api/geo endpoint) from each profile and record what the market really presents before you assert anything.

  5. Automate the launch per run

    Your CI or test script starts the market's profile and connects over CDP, exactly as an agent would.

    const res = await fetch(`http://127.0.0.1:50400/api/v1/browser/start?user_id=${profileId}`);
    const { data } = await res.json();
    const browser = await chromium.connectOverCDP(data.ws.puppeteer);
    const page = await browser.contexts()[0].newPage();
  6. Assert on user-visible geo facts

    Check what users actually experience, not just HTTP layer redirects.

    await page.goto('https://yourshop.example/');
    const currency = await page.locator('.price').first().textContent();
    const lang = await page.evaluate(() => navigator.language);
    if (!currency.includes('€')) throw new Error(`DE market shows ${currency}`);
  7. Stop and rotate

    Stop each profile after its run and loop to the next market. Keep run output tagged per profile so failures name the market.

    await browser.close();
    await fetch(`http://127.0.0.1:50400/api/v1/browser/stop?user_id=${profileId}`);
  8. Review drift monthly

    Proxy exits move and sites change geo logic. Re-run the baseline step monthly and update the matrix before trusting old assertions.

The AliasMode workflow

  1. Market profiles as fixtures

    One profile per market, grouped by project, tagged with country and locale — the test matrix lives in the browser layer.

  2. Preflight as a test precondition

    Treat proxy preflight as step zero of the suite; a wrong exit invalidates every downstream assertion.

  3. Local API for CI

    start/stop per market keeps runs isolated and repeatable, with no browser state leaking between markets.

Verify it worked

  • Each profile's preflight reports exit IP and timezone in the intended market.
  • navigator.language and the page's rendered language agree in every market profile.
  • Currency and legal banners match the market matrix on the money pages.
  • A full market loop completes from CI with per-market pass/fail output.

Cautions

  • Geo results reflect your proxy's exit, so a rotated exit inside the wrong country silently falsifies tests — preflight every run.
  • CDN edge behavior varies by city, not just country; add a second market profile for critical regions.
  • Respect target-site terms when testing against third-party properties; this workflow is for sites you own or are permitted to test.

The geo-test loop

  1. Preflight

    Confirm exit IP and timezone for the market profile before any assertion.

  2. Launch

    Local API start, then connectOverCDP from the test runner.

  3. Assert

    Language, currency, banners, redirects — the user-visible signals.

  4. Stop

    Local API stop, log results per market, move to the next profile.

Geo signals worth asserting

Signals per market profile
SignalWhere it showsAssert via
Country / IPGeo endpoints, CDN, redirectsYour own /api/geo or an IP echo page
TimezoneDate rendering, cron-facing UIsIntl.DateTimeFormat().resolvedOptions().timeZone
Languagenavigator.language, page contentpage.evaluate on navigator, locator text
CurrencyPrices, checkoutLocator text against the market matrix

Geo testing FAQ

Why profiles instead of one browser with proxy flags?

A profile pins fingerprint, locale, cookies, and proxy together per market — and the preflight plus Local API make the launch repeatable from CI.

Do cookies interfere between markets?

No. Each profile has its own user-data directory, so DE never sees JP's consent choices or currency cookies.

How is this different from VPN-based testing?

A VPN moves the IP but not the timezone, locale, or device. Profiles align all four, which is what geo pages actually read.

Sources and verification

  • IANA · Time Zone Database (checked September 2026)
  • MDN Web Docs · Navigator.language API (checked September 2026)
  • Playwright · Browser.connectOverCDP API reference (checked September 2026)

Public product details can change after the check date. Facts are re-checked on a monthly cycle.