2014-06-13 22 views
13

Tôi đang sử dụng thước đo góc (với Jasmine) để kiểm tra ứng dụng AngulaJ của tôi.Thước đo góc - bộ nhớ cục bộ trống

Do một số hành động của tôi, tôi nhận được một số dữ liệu được lưu trong localStorage. Bây giờ tôi cần phải kiểm tra trường hợp khác, vì vậy tôi cần phải làm trống lưu trữ của tôi (hoặc tốt hơn xóa chỉ một số mặt hàng) nhưng Nếu tôi cố gắng chạy:

browser.executeScript('localStorage.removeItem("config");'); 

tôi nhận được lỗi sau:

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) 

Bất kỳ ý tưởng về cách giải quyết?

Cảm ơn trước

Trả lời

3

tôi đã không tìm thấy một cách mát mẻ để làm điều đó, nhưng nếu tôi chạy tuyên bố của tôi

browser.executeScript("localStorage.removeItem('config');") 

trong nó ('description') tuyên bố nó hoạt động. Ví dụ:

it('should compile and save base config for billing',function(){ 
    browser.executeScript("localStorage.removeItem('config');") 

    //my test 
}); 

này loại bỏ các mục tên là config, và do đó tác phẩm thử nghiệm của tôi, nhưng trong khi tìm kiếm và trao đổi về vấn đề này phản ứng chính tôi nhận được là:

"localStorage không phải là bạn sản phẩm, vì vậy bạn không cần (đọc: bạn không được) kiểm tra nó. Cách đúng là thử và chèn nội dung vào khi cần "

Tôi vẫn đang xem xét điều này để đánh giá thấp như thế nào, trong khi đó tôi nghĩ rằng không phải thử nghiệm hoàn hảo về mặt triết học vẫn tốt hơn là không có gì vậy ..

Hope this helps ...

+1

Đây là một thử nghiệm chức năng trên trình duyệt thực vì vậy bạn phải để tương tác với localStorage thực. Câu trả lời "localStorage không phải là sản phẩm của bạn" chỉ áp dụng cho các bài kiểm tra đơn vị. – WildService

27

Một giải pháp tiềm năng là để đặt bất kỳ thanh toán bù trừ trạng thái trong một afterEach, mà sẽ chạy sau bất kỳ thử nghiệm được chạy: (xem https://github.com/angular/protractor/issues/188)

afterEach(function() { 
    browser.executeScript('window.sessionStorage.clear();'); 
    browser.executeScript('window.localStorage.clear();'); 
}); 
+3

'Không thể đọc thuộc tính 'sessionStorage' từ 'Cửa sổ': Bộ nhớ bị tắt trong 'dữ liệu:' URL.' –

+6

Đảm bảo rằng bạn đã nhấn một trang trong trình duyệt trước khi kết thúc thử nghiệm, nếu không bạn sẽ gặp phải điều này trên trình duyệt Chrome. Xem http://stackoverflow.com/questions/21259235/remove-an-item-from-localstorage-in-a-protractor-test để biết thêm thông tin. –

+1

cảm ơn, điều đó giải thích tại sao nó không hoạt động khi sử dụng nó trong beforeEach với phantomJS – sam

11

Đó là vì bạn chưa đã điều hướng đến url hợp lệ. Thực hiện browser.get('/foo') trước khi thử tương tác với các đối tượng trang như localStorage.

3

Tôi đã giải quyết vấn đề này bằng cách kiểm tra window.location trước khi cố gắng xóa/sửa đổi sessionStorage hoặc localStorage.

Nếu trang chưa được tải thì window.location.hostname sẽ bằng chuỗi rỗng ''. Vì vậy, nếu bạn nhận được chuỗi rỗng, thì đừng cố gắng tương tác với sessionStorage hoặc localStorage.

Đây là một số mã (ES6) tôi đã sử dụng trong bộ thước đo góc của mình để ngăn chặn lỗi này. Lưu ý đó là một dưa chuột-js Sau khi chức năng, nhưng nó vẫn được thực hiện từ thước đo sử dụng chrome, và nó cho thấy những gì bạn cần phải làm gì để tránh lỗi này:

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(); 
    } 
    }); 
}); 
Các vấn đề liên quan