microsoft/playwright · error · Error
geolocation.latitude: precondition -90 <= LATITUDE <= 90…
Error message
geolocation.latitude: precondition -90 <= LATITUDE <= 90 failed.
What it means
`verifyGeolocation` enforces latitude within [-90, 90]. Out-of-range values throw with this precondition-style message.
Solutions
- Clamp latitude to [-90, 90] before passing
- Double-check that latitude and longitude aren't swapped
- Validate input ranges before calling setGeolocation
Example fix
// before
await context.setGeolocation({ longitude: 0, latitude: 120 });
// after
await context.setGeolocation({ longitude: 0, latitude: Math.max(-90, Math.min(90, 120)) }); Defensive patterns
Strategy: validation
Validate before calling
function validateLat(lat: number): number {
if (lat < -90 || lat > 90) throw new Error(`latitude out of range: ${lat}`);
return lat;
}
await context.setGeolocation({ longitude: lon, latitude: validateLat(lat) }); Prevention
- Clamp/validate latitude to [-90, 90]
- Double-check lat/lon aren't swapped (lon can exceed ±90)
- Validate coordinates at the data boundary
When it happens
Trigger: `context.setGeolocation({ longitude: 0, latitude: 95 })` or `newContext({ geolocation: { latitude: -120 } })`.
Common situations: Sign/typo errors in coordinates; unverified data from external sources; latitude/longitude swapped (longitude values can exceed ±90).
Related errors
- geolocation.accuracy: precondition 0 <= ACCURACY failed.
- geolocation.longitude: precondition -180 <= LONGITUDE <=…
- Browser userDataDir is not supported in isolated mode.
- Cannot use --mobile together with --device, pick one.
- clientCertificates.origin is required
AI-assisted analysis of microsoft/playwright@f1d33b5029 (2026-08-12).
Data as JSON: /api/errors/b74cd336a4adf903.
Report an issue: GitHub.
Appendix: source
Thrown at packages/playwright-core/src/server/browserContext.ts:804
if (options.recordVideo?.fps !== undefined && options.recordVideo.fps <= 0)
throw new Error(`"recordVideo.fps" must be a positive number, got ${options.recordVideo.fps}`);
verifyGeolocation(options.geolocation);
}
export function findMatchingHttpCredentials(credentials: HttpCredentials[] | undefined, url: string): HttpCredentials | undefined {
const origin = new URL(url).origin.toLowerCase();
return credentials?.find(c => !c.origin || c.origin.toLowerCase() === origin);
}
export function verifyGeolocation(geolocation?: types.Geolocation): asserts geolocation is types.Geolocation {
if (!geolocation)
return;
geolocation.accuracy = geolocation.accuracy || 0;
const { longitude, latitude, accuracy } = geolocation;
if (longitude < -180 || longitude > 180)
throw new Error(`geolocation.longitude: precondition -180 <= LONGITUDE <= 180 failed.`);
if (latitude < -90 || latitude > 90)
throw new Error(`geolocation.latitude: precondition -90 <= LATITUDE <= 90 failed.`);
if (accuracy < 0)
throw new Error(`geolocation.accuracy: precondition 0 <= ACCURACY failed.`);
}
export function verifyClientCertificates(clientCertificates?: types.BrowserContextOptions['clientCertificates']) {
if (!clientCertificates)
return;
for (const cert of clientCertificates) {
if (!cert.origin)
throw new Error(`clientCertificates.origin is required`);
if (cert.noCertificate) {
if (cert.cert || cert.key || cert.passphrase || cert.pfx)
throw new Error('noCertificate is set together with cert, key, passphrase or pfx');
continue;
}
if (!cert.cert && !cert.key && !cert.passphrase && !cert.pfx)
throw new Error('None of cert, key, passphrase or pfx is specified');
if (cert.cert && !cert.key)View on GitHub (pinned to f1d33b5029)