Protractor 可以等待 localStorage 更改(由 REST 调用引起)吗?

Can Protractor wait for a localStorage change (caused by REST call)?

我正在使用 Protractor 来测试登录提交后是否在 localStorage 中设置了一个值。如果我将 localStorage 值绑定到 DOM 元素,Protractor 会自动等待 REST 响应(登录提交后),检查该值并对其进行测试。 但我想测试 localStorage 的值而不将其写入 DOM。在每次测试之前,我都会清除 localStorage。

browser.executeScript("window.localStorage.clear();");

我可以在测试中得到值。

var key = browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');")

但这发生得太早了。 我还尝试在 browser.wait() 语句中 returning 该值,但在那种情况下,wait() 似乎无法使用 return 值。可能是因为这不是一个承诺。

如果可以解决这个问题,我什至会考虑让量角器从 ngStorage 访问 $localStorage 实例。

谁能告诉我是否可以使用 Protractor 异步观察 localStorage 值,如果可以,该如何处理?

您可能没有在 browser.wait() 函数中正确等待,该值不必是一个承诺,只是一个简单的布尔值,一旦为真就退出等待,以下将起作用:

browser.wait(function () { 
    return browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');") 
    == theValueYouExpect;
}, 5000);

详细了解量角器 wait !

或者,browser.executeScript("window.localStorage.clear();"); returns 脚本执行后的承诺,(但不一定是脚本完成,如果它是异步的),所以这里另一个解决方案是:

browser.executeScript("window.localStorage.clear();")
    .then(function (){
    browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');")
        .then(function (key) {//do something with the key});
});

最终的解决方案是如何处理 browser.executeScript returns.
的承诺 好消息是:Protractor 已经是异步的,因此不需要自定义等待。但是,您不应该只检查返回值是字符串类型还是等于预期字符串。但是通过正则表达式匹配它工作正常,无论你得到的是字符串还是返回的承诺。例如,如果我期望一个 40 个字符的散列,你可以这样匹配它:

it('should store key in localStorage when logging in', function() {
    loginFormSubmitButton.click();
    var newUserKey = browser.executeScript("return window.localStorage.getItem('ngStorage-userKey');");
    expect(newUserKey).toMatch(/^\"[a-f0-9]{40}\"$/i);
});

感觉很神奇,但 expect 语句实际上是在等待 promise 解析。在这种情况下,这意味着对服务器的调用被调用或模拟,结果被写入 localStorage 并被 expect 检测到 as-it-happens声明。
无需自定义超时。