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

时间:2015-10-26 13:31:46

标签: javascript angularjs local-storage protractor angular-local-storage

我正在使用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()语句中返回该值,但在这种情况下,似乎wait()不能使用返回值。可能是因为它不是一个承诺。

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

有人可以告诉我是否可以使用Protractor观看localStorage值异步,如果可以,如何处理?

2 个答案:

答案 0 :(得分:3)

结果是解决方案,是如何处理browser.executeScript返回的承诺 这是个好消息:量角器已经异步,所以不需要定制等待。但是,您不应只检查返回的值是否为string类型或isEqual为期望的字符串。但是通过正则表达式匹配它可以正常工作,无论你得到一个字符串或一个承诺返回。例如,如果我期望一个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语句检测到 as as it happen 。<登记/> 无需自定义超时。

答案 1 :(得分:1)

你可能没有在你的browser.wait()函数中正确等待,这个值不一定是一个promise,只是一个简单的布尔值,一旦它等了就会退出等待,如下会工作:

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

详细了解量角器wait

或者,browser.executeScript(&#34; window.localStorage.clear();&#34;);在执行脚本之后返回一个promise(但是,如果脚本完成,则不是必须完成,如果它是异步的),那么另一个解决方案将是:

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