尝试使用 Playwright 将地理位置设置为特定的经纬度(例如纽约、伦敦或马德里)时,提供的经纬度输入未设置为页面/上下文,并且仅显示默认位置
我正在尝试使用此文档与剧作家模拟地理位置。已授予地理位置权限,但浏览器不会模拟提供的位置,而是仅显示我当前的位置。
首先我使用 test.use 默认设置页面对象的参数,但它不起作用,然后我尝试在测试中手动设置它的上下文,但这也不起作用。
这是我的测试用例
import { test, expect } from "@playwright/test";
test.use({
geolocation: { longitude: 41.890221, latitude: 12.492348 },
permissions: ['geolocation'],
});
test("Change Locale Concept", async ({ page, context }) => {
// Go to the location-checking website
//await page.goto('https://mylocation.org/');
await context.setGeolocation({ longitude: 48.858455, latitude: 2.294474 });
await page.goto("https://www.bing.com/maps");
// Take a screenshot to verify settings
await page.screenshot({ path: 'screenshot-us.png' });
// Inject a script to log the geolocation
const geolocation = await page.evaluate(() => {
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
position => resolve(position.coords),
error => reject(error)
);
});
});
// Log the geolocation
console.log(`Latitude: ${geolocation.latitude}, Longitude: ${geolocation.longitude}`);
// Check the permissions of the page
const permissions = await page.evaluate(async () => {
const permissionNames = ['geolocation', 'notifications', 'camera', 'microphone'];
const results = {};
for (const name of permissionNames) {
try {
const result = await navigator.permissions.query({ name });
results[name] = result.state;
} catch (e) {
results[name] = 'permission not available';
}
}
return results;
});
// Log the permissions
console.log('Permissions:', permissions);
// Validate the geolocation permission
expect(permissions.geolocation).toBe('granted');
});
然后我尝试查看我拥有什么权限以及向页面/上下文授予了地理位置权限。但长纬度似乎没有按照提供的数据设置。
这是我根据上述测试用例得到的输出
Latitude: undefined, Longitude: undefined
Permissions: {
geolocation: 'granted',
notifications: 'denied',
camera: 'denied',
microphone: 'denied'
}
核心问题是有很多方法可以以不同的精度确定或粗略地推断一个人的地理位置:
第二个问题是不同的服务会使用不同的技术,更糟糕的是 - 它们可能随时发生变化!
自动化脚本可能会设置地理位置,但谷歌地图(或其他服务)将考虑其他因素或其组合。
尽管如此,这是一个截至本答案时有效的脚本。关键是将 userAgent 设置为移动设备。其他移动设备可以使用。但“桌面 Chrome”或其他桌面设备不会。
你必须进一步实验。
import { test, chromium, devices } from '@playwright/test';
test('Test Geolocation', async () => {
const iPad = devices['iPad (gen 7) landscape'];
const browser = await chromium.launch({ headless: false, slowMo: 2000 });
const context = await browser.newContext({
userAgent: iPad.userAgent, // here!
locale: 'en_GB',
geolocation: { longitude: -0.118092, latitude: 51.509865 }, // London
permissions: ['geolocation']
});
const page = await context.newPage();
await page.goto('https://maps.google.com');
await page.getByRole('button', { name: 'Accept all' }).click();
await page.getByRole('button', { name: 'Stay on web' }).click();
await page.screenshot({ path: 'London-iPad.png' });
});