3

我正在使用量角器来测试登录提交后是否在 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()语句中返回该值,但在这种情况下,返回值似乎不能被 wait() 使用。可能是因为这不是一个承诺。

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

谁能告诉我是否可以使用 Protractor 异步查看 localStorage 值,如果可以,如何解决?

4

2 回答 2

3

原来是解决方案,是如何处理browser.executeScript返回的承诺。
好消息是: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声明实际上是在等待承诺解决。在这种情况下,这意味着调用或模拟了对服务器的调用,结果被写入语句并在发生时被语句localStorage检测到。 无需自定义超时。expect

于 2015-11-06T10:18:08.517 回答
1

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

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

阅读更多关于量角器的信息

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

browser.executeScript("window.localStorage.clear();")
    .then(function (){
    browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');")
        .then(function (key) {//do something with the key});
});
于 2015-10-26T14:25:47.757 回答