使用 NightmareJS 模拟内置对象
Mock built-in objects with NightmareJS
我正在尝试使用 NightmareJS 加载页面,单击一个按钮,然后截屏进行测试。按钮上的点击处理程序请求地理定位。这是我正在测试的部分内容。如果用户授予地理定位权限,我希望页面以某种方式显示,如果他们拒绝,则以另一种方式显示。
问题是 Nightmare 没有公开方法让我拦截权限提示以接受或拒绝它。经过一些研究,我了解到 Electron 只是将此权限硬编码为 'granted',因此甚至可能没有办法将其设置为拒绝。
我想做的是以某种方式响应地理定位请求的模拟替换 Electron 的 navigator.geolocation
对象。
new Nightmare().goto('https://example.com')
.evaluate(function () {
navigator.geolocation = {
getCurrentPosition(cb) {
cb({coords: latitude: 42, longitude: -42});
}
}
})
.click('#locateMe')
.screenshot()
.end()
.then(diffScreenshot)
然而,当我尝试这个时,navigator.geolocation 对象似乎没有改变。还有其他方法可以实现这个目标吗?
我认为这在两个项目中都是可能的(或应该是),您可以尝试更改:
navigator.geolocation
到
window.navigator.geolocation
这是因为大多数评估调用都是 运行 在干净的上下文中,我认为是这样。如果这行不通,那么 Navalia 或许可以做到,因为它相当 "bare-metal" 可以这么说。
祝你好运!
我正在尝试使用 NightmareJS 加载页面,单击一个按钮,然后截屏进行测试。按钮上的点击处理程序请求地理定位。这是我正在测试的部分内容。如果用户授予地理定位权限,我希望页面以某种方式显示,如果他们拒绝,则以另一种方式显示。
问题是 Nightmare 没有公开方法让我拦截权限提示以接受或拒绝它。经过一些研究,我了解到 Electron 只是将此权限硬编码为 'granted',因此甚至可能没有办法将其设置为拒绝。
我想做的是以某种方式响应地理定位请求的模拟替换 Electron 的 navigator.geolocation
对象。
new Nightmare().goto('https://example.com')
.evaluate(function () {
navigator.geolocation = {
getCurrentPosition(cb) {
cb({coords: latitude: 42, longitude: -42});
}
}
})
.click('#locateMe')
.screenshot()
.end()
.then(diffScreenshot)
然而,当我尝试这个时,navigator.geolocation 对象似乎没有改变。还有其他方法可以实现这个目标吗?
我认为这在两个项目中都是可能的(或应该是),您可以尝试更改:
navigator.geolocation
到
window.navigator.geolocation
这是因为大多数评估调用都是 运行 在干净的上下文中,我认为是这样。如果这行不通,那么 Navalia 或许可以做到,因为它相当 "bare-metal" 可以这么说。
祝你好运!