文本

SELENIUM 4 模拟地理位置信息

SELENIUM 4处于alpha模式,我已经尝试了一些新功能。在这个即将发布的版本中,他们提供了访问Chrome DevTools和Chrome DevTools协议(CDP)。由于我已经因为COVID-19被困在家里2个月了,我至少要用这个新功能去德克萨斯州奥斯汀市购物!下面是用编程方式覆盖浏览器的地理位置的诀窍。 在CHROME浏览器中改变地理位置的方法 Selenium WebDriver 4+

Chrome浏览器

模拟位置的坐标 步骤 创建ChromeDriver的实例

调用executeCdpCommand方法 Selenium WebDriver 4+

Selenium 4中添加了对Chrome DevTools协议的访问权限,因此您至少需要该版本。 在撰写本文时,Selenium 4处于Alpha状态,因此请注意,这目前仍处于试验阶段。 使用Maven,将依赖项添加到pom.xml文件中。

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>4.0.0-alpha-5</version>
</dependency>
  1. Chrome浏览器

当然,由于我们使用的是Chrome DevTools,因此我们需要使用Chrome浏览器。 我还没有看到对Firefox的类似支持,也不确定它是否在计划中。 模拟位置坐标

要覆盖浏览器的实际位置,您需要提供模拟位置的经度和纬度。 要查找此信息,可以使用Google地图。 https://i0.wp.com/angiejones.tech/wp-content/uploads/2020/05/maps.png?w=2120&ssl=1 注意URL中的纬度和经度。 第一个数字是纬度(30.3079823),第二个数字是经度(-97.893803)。

创建ChromeDriver的实例

我通常将实例创建为WebDriver driver = new ChromeDriver(); 但是,这样做时,我的对象的类型是WebDriver而不是ChromeDriver,这意味着我的对象无权访问ChromeDriver特有的方法。 因此,为了使用CDP方法,我必须将驱动程序声明为ChromeDriver。

ChromeDriver driver = new ChromeDriver();

调用executeCdpCommand方法

Selenium 4在ChromeDriver类中引入了executeCdpCommand作为新方法。 此方法采用命令名称和参数映射。 为了找到要使用的确切命令,我访问了DevTools协议网站并搜索地理位置。 https://i2.wp.com/angiejones.tech/wp-content/uploads/2020/05/geolocation.png?w=1481&ssl=1 我在这里看到两个setGeolocationOverride命令。 我单击了Page中的那个,它已被弃用,所以我知道可以使用Emulation。 我将整个String复制为命令。

现在,我需要executeCdpCommand方法的参数。 我单击了Chrome DevTools协议网站上的Emulation.setGeolocationOverride方法,以获取更多信息。 https://i1.wp.com/angiejones.tech/wp-content/uploads/2020/05/method_params.png?w=1472&ssl=1 鉴于此,我可以看到我需要在地图中添加三个条目:纬度,经度和精度。

Map coordinates = Map.of(
        "latitude", 30.3079823,
        "longitude", -97.893803,
        "accuracy", 1
);

坦白:我不知道准确度的范围是多少,但是当我使用0时它不起作用,而当我使用1或更大的值时它会起作用。 driver.executeCdpCommand("Emulation.setGeolocationOverride", coordinates);

现在有了命令和参数,我终于可以调用executeCdpCommand方法了。

//Refresh if already on the page
driver.navigate().refresh();

//OR navigate to new URL
driver.navigate().to("https://oldnavy.gap.com/stores");

在什么地方有用?

这项新功能使我们能够测试依赖于用户地理位置的应用程序功能。 例如,如果我去Old Navy的商店定位器,它将检测我的地理位置并向我显示附近的商店。

package geolocation;

import base.BaseTests;
import org.junit.jupiter.api.Test;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class LocationTests extends BaseTests {

    @Test
    public void goShoppingInAustin(){

        Map coordinates = Map.of(
                "latitude", 30.3079823,
                "longitude", -97.893803,
                "accuracy", 1
        );
        
        driver.executeCdpCommand("Emulation.setGeolocationOverride", coordinates);

        driver.navigate().to("https://oldnavy.gap.com/stores");

        var addresses = driver.findElementsByClassName("address");
        assertTrue(addresses.size() > 0, "No addresses found");
        assertTrue(addresses.
                stream()
                .allMatch(a -> a.getText().contains(", TX ")),
                "Some addresses listed are not in Texas");
    }
}

author

石头 磊哥 seven 随便叫

company

thoughtworks(离职了。。。。)

大家好,本人不才,目前依旧混迹于thoughtworks,做着一名看起来像全栈的QA,兴趣爱好前端,目前是thoughtworks 西安QA社区的leader,如果有兴趣分享话题,或者想加入tw,可以找我

roles

QA(营生) dev(front-end dev 兴趣爱好)

联系方式

如果想转载或者高薪挖我 请直接联系我 哈哈

wechat:

qileiwangnan

email:

qileilove@gmail.com