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.
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
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.
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.
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.
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.
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();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}`);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}`);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
Market profiles as fixtures
One profile per market, grouped by project, tagged with country and locale — the test matrix lives in the browser layer.
Preflight as a test precondition
Treat proxy preflight as step zero of the suite; a wrong exit invalidates every downstream assertion.
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
Preflight
Confirm exit IP and timezone for the market profile before any assertion.
Launch
Local API start, then connectOverCDP from the test runner.
Assert
Language, currency, banners, redirects — the user-visible signals.
Stop
Local API stop, log results per market, move to the next profile.
Geo signals worth asserting
| Signal | Where it shows | Assert via |
|---|---|---|
| Country / IP | Geo endpoints, CDN, redirects | Your own /api/geo or an IP echo page |
| Timezone | Date rendering, cron-facing UIs | Intl.DateTimeFormat().resolvedOptions().timeZone |
| Language | navigator.language, page content | page.evaluate on navigator, locator text |
| Currency | Prices, checkout | Locator 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.