【问题标题】:Can Protractor wait for a localStorage change (caused by REST call)?Protractor 可以等待 localStorage 更改(由 REST 调用引起)吗?
【发布时间】:2016-01-25 15:06:44
【问题描述】:

我正在使用 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 值,如果可以,如何解决?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    或者,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});
    });
    

    【讨论】:

    • 我已经尝试过你的建议,但奇怪的是,在等待循环中,executeScript 返回一个 promise 对象,而其他块中完全相同的调用返回一个值,然后我可以进行比较。将继续挖掘以查明真相。
    • @Micros 发生这种情况是因为 promise 的解析速度非常快,executeScript 内部的函数是同步的,所以返回值非常快,promise 也被解析了。所以我用正确的方法编辑了我上面的帖子
    • 看起来不可能在等待循环中进行检查,因为在使用 .then() 异步构造时,您无法在实际的等待迭代器函数上返回布尔值。但是,我确实找到了另一种处理异步的干净方法。很快就会在下面发布。
    • 感谢您的反馈@vrachlin,但我找到了一种无需自定义超时的方法。不过,您的回答可能会对其他情况下的人有所帮助。代码中有一些错误,我现在将对其进行编辑。
    【解决方案2】:

    最终的解决方案是如何处理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 语句实际上是在等待promise 解决。在这种情况下,这意味着调用或模拟了对服务器的调用,结果将写入localStorage 并通过expect 语句检测到as-it-happen
    无需自定义超时。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2015-01-28
      相关资源
      最近更新 更多