如何在Python中更改Chrome硒驱动程序的地理位置?

时间:2018-12-14 02:22:34

标签: python selenium

我正在尝试欺骗chromedriver,使其相信它正在其他城市中运行。在正常情况下,如快速图表所示,可以轻松地手动完成此操作

Here

然后,当完成google搜索时,将使用新坐标,并显示通常从该位置开始的结果。您可以确认当您查看Google搜索页底部时

是否可行

Here

但是,Selenium只能控制浏览器显示的内容,而不能控制浏览器本身。我不能告诉Selenium自动单击更改坐标所需的按钮。我尝试了发布于here的解决方案,但这并不适合Python,即使在尝试修改脚本后,似乎也没有任何反应。

是否存在可以使用的browser.execute_script()参数,或者这是更改地理位置的错误方法吗?

4 个答案:

答案 0 :(得分:1)

您可以通过导入Selenium DevTools软件包来完成此操作。请参考以下完整的Java代码示例:

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;

public void geoLocationTest(){
  ChromeDriver driver = new ChromeDriver();
  Map coordinates = new HashMap()
  {{
      put("latitude", 50.2334);
      put("longitude", 0.2334);
      put("accuracy", 1);
  }};    
  driver.executeCdpCommand("Emulation.setGeolocationOverride", coordinates);
  driver.get("<your site url>");
}  

参考:Selenium Documentation

答案 1 :(得分:0)

在下面尝试以下代码:

driver.execute_script("window.navigator.geolocation.getCurrentPosition=function(success){"+
                                        "var position = {\"coords\" : {\"latitude\": \"555\",\"longitude\": \"999\"}};"+
                                        "success(position);}");

    print(driver.execute_script("var positionStr=\"\";"+
                                    "window.navigator.geolocation.getCurrentPosition(function(pos){positionStr=pos.coords.latitude+\":\"+pos.coords.longitude});"+
                                    "return positionStr;"))

答案 2 :(得分:0)

在寻找解决同一问题的方法时,我还遇到了已经存在的postet脚本。虽然我尚未找到解决方案,但我认为这些脚本无法正常工作,因为它们不会永久更改传感器。仅针对window.navigator.geolocation.getCurrentPosition的一个特定调用更改传感器。

该网站(在本例中为google)稍后将调用相同的功能,但具有常规的(不变的)地理位置。很高兴听到永久更换传感器的解决方案,从而影响以后的地理位置要求。

答案 3 :(得分:0)

这可以使用硒4完成。

HashMap<String ,Object> coordinate = new HashMap<String ,Object>();
        coordinate.put("latitude", 39.913818);
        coordinate.put("longitude", 116.363625);
        coordinate.put("accuracy", 1);
    ((ChromeDriver)driver).executeCdpCommand("Emulation.setGeolocationOverride",coordinate);
        driver.navigate().to("URL");