【问题标题】:How to set mock Geolocation Long/Lat in Python/Chromedriver/Selenium如何在 Python/Chromedriver/Selenium 中设置模拟地理位置 Long/Lat
【发布时间】:2020-02-19 05:06:31
【问题描述】:

我正在运行 Python/Chromedriver/GoogleChrome/Selenium 无头 在 python 上,我在弄清楚如何以编程方式设置自定义地理定位 long/lat 时遇到了一些麻烦;以下代码未更新 google.com 或 https://www.infobyip.com/browsergeolocation.php 上的位置

目前我正在使用以下选项启动 chromedriver:

chrome_options.add_experimental_option("prefs", { 
    "profile.default_content_setting_values.media_stream_mic": 1, 
    "profile.default_content_setting_values.media_stream_camera": 1,
    "profile.default_content_setting_values.geolocation": 1, 
    "profile.default_content_setting_values.notifications": 1,
    "profile.default_content_settings.geolocation": 1,
    "profile.default_content_settings.popups": 0
  })

我可以使用这些命令调用和设置/获取地理位置 long/lat:

    driver.execute_script("""navigator.geolocation.getCurrentPosition = function(success, failure) { 
      success({ 
        coords: {latitude: -43.5333, longitude: 172.633}, 
        timestamp: Date.now(), 
      }); 
    }"""); 
    time.sleep(5) 
    print(driver.execute_script("var positionStr=\"\";"+ 
                                "window.navigator.geolocation.getCurrentPosition(function(pos){positionStr=pos.coords.latitude+\":\"+pos.coords.longitude});"+
                                "return positionStr;"))

这确实会返回我设置的更新的经度/纬度。 但是当使用https://www.infobyip.com/browsergeolocation.phphttp://google.com 时,它不会抓取新的地理位置并且不起作用。

如何使用 chromedriver 配置参数、chrome 开发工具以编程方式或通过修改我的 chrome 配置文件目录中的文件来设置自定义地理位置? python selenium on stack overflow的其他答案似乎在这里不起作用。

【问题讨论】:

  • 这不是程序化的——但你试过 Chrome 开发者——传感器并改变位置吗?
  • 是的,我有并且它有效,这就是我目前正在研究的。抱歉稍微重新表述一下这个问题,但有人知道如何使用 chrome 远程开发工具从 python/selenium/chromedriver 设置自定义模拟传感器位置吗?
  • 我已经能够通过 socketio 连接到远程 devtools 调试器,我发送这个: { "id": 5, "method": "Emulation.setGeolocationOverride", "params": { " latitude": 27.1752868, "longitude": 78.040009, "accuracy": 100 } } 并得到响应:'{"id":5,"result":{}}' 然后我将页面更改为:{"id" : 6, "method": "Page.navigate", "params": { "url": "infobyip.com/browsergeolocation.php" } } 但它仍然无法识别地理位置。无头构建中是否禁用了此功能?
  • 我仍然无法让它工作
  • 我最终学习了 CDP 并使用 websockets 和 chrome 调试协议设置了模拟地理位置。它们是 chrome 中的一项功能,可让您查看 cdp 的 json 请求和响应,因为它在 devtools 中发生。在我与之交互时查看实际协议的作用,可以更轻松地找到在实际产品中使用所需的请求和响应格式

标签: python selenium google-chrome selenium-chromedriver google-chrome-devtools


【解决方案1】:

现在实际上可以使用 Chrome Devtools 协议 (cdp) 进行编程:

params = {
    "latitude": 50.1109,
    "longitude": 8.6821,
    "accuracy": 100
}

driver = webdriver.Chrome()
driver.execute_cdp_cmd("Page.setGeolocationOverride", params)
driver.get('https://www.google.com/maps')

【讨论】:

    【解决方案2】:

    Linux 发行版

    Firefox Webdriver Selenium 版本:3.14.1

    GeckoDriver : https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz

    • 使用默认配置文件并修改其设置
    • 通过 webdriver 反复使用配置文件

    默认配置文件,例如:/home/-user-/.mozilla/firefox/wg8ugmge.default

    可执行路径,例如:/home/-user-/Downloads/geckodriver

    from selenium import webdriver
    from selenium.webdriver.firefox.options import Options
    
    profile = webdriver.FirefoxProfile('<path_to_default_profile>') 
    profile.set_preference("geo.prompt.testing", True) 
    profile.set_preference("geo.prompt.testing.allow", True)
    profile.set_preference("geo.wifi.scan", True)
    executable_path='<executable-path-geckodriver>'
    profile.set_preference("geo.wifi.uri", 'data:application/json,{"location":{"lat":22.893,"lng":72.4095},"accuracy": 100.0}')
    
    driver = webdriver.Firefox(executable_path = executable_path , firefox_profile=profile)
    driver.get('https://maps.mapmyindia.com')
    

    希望它能解决您的问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-28
      • 2017-07-13
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多