我正在使用 Protractor 来测试在登录提交后是否在 localStorage 中设置了一个值。如果我将 localStorage 值绑定(bind)到 DOM 元素,Protractor 会自动等待 REST 响应(在登录提交之后),检查该值并对其进行测试。
但我想测试 localStorage 的值而不将其写入 DOM。在每次测试之前,我都会清除 localStorage。browser.executeScript("window.localStorage.clear();");
我可以在测试中获得值。var key = browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');")
但这发生得太早了。
我还尝试在 browser.wait()
语句中返回该值,但在这种情况下,wait() 似乎无法使用返回值。可能是因为这不是 promise 。
如果可以解决这个问题,我什至会考虑让 Protractor 访问来自 ngStorage 的 $localStorage 实例。
谁能告诉我是否可以使用 Protractor 观察 localStorage 值异步,如果可以,如何解决这个问题?
最佳答案
结果是解决方案是如何处理 browser.executeScript
返回的 promise 。
好消息是: Protractor 已经是异步的,因此不需要自定义等待。但是,您不应只检查返回值是否为字符串类型或 isEqual 是否为预期字符串。但是通过正则表达式匹配它可以正常工作,无论你得到一个字符串还是一个 promise 返回。例如,如果我期望 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
语句检测到。不需要自定义超时。
关于javascript - Protractor 是否可以等待 localStorage 更改(由 REST 调用引起)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33347058/