使用NightmareJS模拟内置对象

时间:2017-08-09 21:21:14

标签: javascript testing mocking electron nightmare

我正在尝试使用NightmareJS加载页面,单击按钮,然后截取屏幕截图进行测试。按钮上的单击处理程序请求地理位置。这是我测试的一部分。如果用户授予地理位置权限,我希望页面以某种方式显示,如果用户拒绝,我希望以另一种方式显示。

问题在于,梦魇并没有为我提供拦截权限提示以接受或拒绝它的方法。经过一番研究后,我了解到Electron只是将这个许可硬编码为“授权”。所以甚至可能没有办法将其设置为拒绝。

我想做的是用一个以某种方式响应地理位置请求的模拟替换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对象并没有改变。还有其他方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

我认为这可能(或应该)在两个项目中都可以尝试更改:

navigator.geolocation

window.navigator.geolocation

这是因为大多数评估调用都是在干净的上下文中运行,或者我认为。如果这不起作用,那么Navalia可以做到这一点,因为它是公平的"裸机"这样来讲话。

祝你好运!