文本
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>
- 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