我正在开发一个项目,需要使用 Chrome WebDriver 覆盖桌面和移动模拟中的地理位置。桌面模拟按预期工作,但移动模拟无法真正覆盖地理位置。
我使用以下代码来启动 Chrome 驱动程序:
chrome_options = Options()
mobile_emulation = {
"deviceMetrics": { "width": 360, "height": 640, "pixelRatio": 3.0 },
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1" }
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
params = {
"latitude": 'some lat',
"longitude": 'some lon',
"accuracy": 100
}
driver = webdriver.Chrome(service = Service(executable_path='some path'), options = chrome_options)
driver.execute_cdp_cmd(
"Browser.grantPermissions",
{
"origin": "https://www.google.cl/",
"permissions": ["geolocation"],
},
)
driver.execute_cdp_cmd("Emulation.setGeolocationOverride", params)
driver.get('https://www.google.cl/')
地理位置覆盖在桌面模拟中运行良好。但是,当我添加移动模拟时,覆盖不起作用。也就是说,移动用户界面出现了,但是当我向下滚动查看 Google 识别的位置时,它仍然是我的实际位置。
环境:Linux、Chrome v114(最新的 Chrome 版本不会覆盖桌面或移动模拟中的地理位置)
任何人都可以帮助我理解为什么地理位置覆盖在移动模拟中不起作用以及是否可以修复它?
这是用于覆盖地理位置的完整 https://github.com/seleniumbase/SeleniumBase 脚本。
pip install seleniumbase
,然后使用 pytest
运行。
对于移动版本,运行时使用
pytest --mobile
。
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)
class TestGeolocation(BaseCase):
def tearDown(self):
self.save_teardown_screenshot() # If test fails, or if "--screenshot"
if self.is_chromium() and not self._multithreaded:
# Reset Permissions and GeolocationOverride
try:
self.open("about:blank")
self.execute_cdp_cmd("Emulation.setGeolocationOverride", {})
self.execute_cdp_cmd("Browser.resetPermissions", {})
except Exception:
pass
super().tearDown()
def test_geolocation(self):
self.execute_cdp_cmd(
"Browser.grantPermissions",
{
"origin": "https://www.openstreetmap.org/",
"permissions": ["geolocation"],
},
)
self.execute_cdp_cmd(
"Emulation.setGeolocationOverride",
{
"latitude": 48.87645,
"longitude": 2.26340,
"accuracy": 100,
},
)
self.open("https://www.openstreetmap.org/")
self.click("span.geolocate")
self.assert_url_contains("48.87645/2.26340")
self.save_screenshot_to_logs()
self.sleep(2.5)
(在 Chrome 122 上测试,适用于桌面和移动格式。)