在无头Chrome中设置传感器(位置)

时间:2017-10-12 15:48:39

标签: google-chrome gps sensor headless

是否可以使用Chrome Headless设置自定义位置坐标?我找不到了 Devtools protocol API。有可用的解决方法吗?

2 个答案:

答案 0 :(得分:2)

我用Google搜索了很多方法。我一一尝试,几乎所有的都过时了。然后我找到一个解决方案,使用chrome devtools协议来实现。

下面的小示例代码,它使用最常见的工具硒执行chrome devtools协议命令。

import time

from selenium.webdriver import Chrome, ChromeOptions

options = ChromeOptions()
options.add_argument("--headless")
driver = Chrome(options=options)
driver.execute_cdp_cmd(
    "Browser.grantPermissions",
    {
        "origin": "https://www.openstreetmap.org/",
        "permissions": ["geolocation"]
    },
)
driver.execute_cdp_cmd(
    "Emulation.setGeolocationOverride",
    {
        "latitude": 35.689487,
        "longitude": 139.691706,
        "accuracy": 100,
    },
)
driver.get("https://www.openstreetmap.org/")
driver.find_element_by_xpath("//span[@class='icon geolocate']").click()
time.sleep(3)  # wait for the page full loaded
driver.get_screenshot_as_file("screenshot.png")

screenshot.png

答案 1 :(得分:0)

https://chromedevtools.github.io/devtools-protocol/tot/Emulation#method-setGeolocationOverride

https://chromedevtools.github.io/devtools-protocol/tot/Emulation#method-clearGeolocationOverride

...然后您需要确保在用户配置文件中设置正确的位置共享设置(chrome:// settings / content / location - 由于通过显示而难以访问shadow dom,因此使用预先配置的用户配置文件可能会更容易--user-data-dir)。

编辑添加:使用--headless时,上述内容似乎无效。要解决这个问题,我使用了https://chromedevtools.github.io/devtools-protocol/tot/Page#method-addScriptToEvaluateOnNewDocument以及以下代码段:

navigator.geolocation.getCurrentPosition = function(success, failure) { 
    success({
        coords: {latitude: <your_lat_float>, longitude: <your_lng_float>}, 
        timestamp: Date.now(),
    }); 
}