我使用Protractor(使用Jasmine)来测试我的AngulaJs应用程序。
由于我的一些操作,我得到了一些保存在localStorage中的数据。现在我需要测试其他情况,所以我需要清空我的存储空间(或者更好地删除一些项目)但是如果我尝试运行:
browser.executeScript('localStorage.removeItem("config");');
我收到以下错误:
UnknownError: <unknown>: Failed to read the 'localStorage' property from 'Window': Storage is disabled inside 'data:' URLs.
(Session info: chrome=35.0.1916.153)
(Driver info: chromedriver=2.10.267517,platform=Mac OS X 10.9.2 x86_64)
关于如何解决的任何想法?
提前致谢
答案 0 :(得分:34)
另一个可能的解决方案是在afterEach中放置任何状态清除,该运行将在任何测试运行后运行:(参见https://github.com/angular/protractor/issues/188)
afterEach(function() {
browser.executeScript('window.sessionStorage.clear();');
browser.executeScript('window.localStorage.clear();');
});
答案 1 :(得分:14)
这是因为您还没有导航到有效的网址。在尝试与browser.get('/foo')
等页面对象进行交互之前,请先localStorage
。
答案 2 :(得分:4)
我在尝试清除/修改sessionStorage或localStorage之前通过检查window.location来解决了这个问题。
如果尚未加载页面,则window.location.hostname
将等于空字符串''
。因此,如果您获得了emptystring,请不要尝试与sessionStorage
或localStorage
进行互动。
这是我在量角器套件中用来防止此错误的一些(ES6)代码。注意它是一个黄瓜-js After函数,但它仍然使用chrome从量角器执行,它演示了你需要做些什么来避免这个错误:
this.After(function(scenario) {
function getWindowLocation() {
return window.location;
}
function clearStorage() {
window.sessionStorage.clear();
window.localStorage.clear();
}
return browser.executeScript(getWindowLocation).then(function(location) {
// NB If no page is loaded in the scneario then calling clearStorage will cause exception
// so guard against this by checking hostname (If no page loaded then hostname == '')
if (location.hostname.length > 0) {
return browser.executeScript(clearStorage);
}
else {
return Promise.resolve();
}
});
});
答案 3 :(得分:3)
我没有找到一个很酷的方法,但如果我运行我的陈述
browser.executeScript("localStorage.removeItem('config');")
在it('description')语句中它起作用。例如:
it('should compile and save base config for billing',function(){
browser.executeScript("localStorage.removeItem('config');")
//my test
});
这删除名为config的项目,所以我的测试工作,但在搜索和讨论这个问题时,我得到的主要反应是:
“localStorage不是你的产品,所以你不需要(读:你绝对不能)测试它。正确的方法是模拟它并在需要时注入内容”
我仍然在研究这个问题,同时我认为一个没有哲学上完美的测试仍然比没有更好......
希望这会有所帮助......
答案 4 :(得分:1)
如果执行&#34; removeItem()&#34;时localStorage仍然存在问题,您可以使用try-catch,如:
browser.executeScript("try {localStorage.removeItem('access_token');} catch(exception) {}");
答案 5 :(得分:1)
如果你想完全控制你的存储,使用这个类
class Storage {
constructor(storage) {
// 'localStorage' or 'sessionStorage'
this.storage = storage;
}
/**
* get local/session storage as object
* @returns {Promise<Object>}
*/
async get() {
log(`${this.storage}.get()`);
let keys = await browser.executeScript(`return Object.keys(window.${this.storage});`),
storage = {};
for (let key of keys) {
storage[key] = await browser.executeScript(`return window.${this.storage}.getItem('${key}');`);
}
return storage;
}
/**
* Clear local/session storage
* @returns null
*/
async clear() {
log(`${this.storage}.clear()`);
return browser.executeScript(`return window.${this.storage}.clear();`);
}
/**
* Set a value of local/session storage
* @param key
* @param value
* @returns
*/
async setValue(key, value) {
log(`${this.storage}.setValue(${key}, ${value})`);
return browser.executeScript(`return window.${this.storage}.setItem('${key}', '${value}');`);
}
/**
* Get value of a key of local/session storage
* @param key
* @returns
*/
async getValue(key) {
log(`${this.storage}.getValue(${key})`);
return browser.executeScript(`return window.${this.storage}.getItem('${key}');`);
}
async removeItem(key) {
log(`${this.storage}.removeItem(${key})`);
return browser.executeScript(`return window.${this.storage}.removeItem('${key}');`);
}
}
然后使用它
let sessionStorage = new Storage('sessionStorage'),
localStorage = new Storage('localStorage');
// get storage as JSON
console.log(await sessionStorage.get())
// clear storage
await localStorage.clear();
// set key
await localStorage.setValue('key', 'value');
// and many more