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声明。
无需自定义超时。
我正在使用 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声明。
无需自定义超时。