3

分度器を使用して、ログイン送信後に localStorage に値が設定されるかどうかをテストしています。localStorage 値を DOM 要素にバインドすると、Protractor は (ログイン送信後に) REST 応答を自動的に待機し、値をチェックしてテストします。しかし、DOM に書き込まずに localStorage の値をテストしたいと思います。各テストの前に、localStorage をクリアします。

browser.executeScript("window.localStorage.clear();");

テストで値を取得できます。

var key = browser.executeScript("return window.localStorage.getItem('ngStorage-initKey');")

しかし、それはあまりにも早い時期に起こります。ステートメントでその値を返すことも試しましたbrowser.wait()が、その場合、戻り値はwait()で使用できないようです。約束じゃないからでしょう。

これが解決される場合は、分度器に ngStorage の $localStorage インスタンスへのアクセスを許可することも検討します。

分度器と非同期で localStorage の値を監視できるかどうか、誰か教えてもらえますか?

4

2 に答える 2

3

解決策であることが判明したのは、browser.executeScript返される約束をどのように処理するかでした。
朗報です。Protractor は既に非同期であるため、カスタムの待機は必要ありません。ただし、返された値が文字列型であるか、期待される文字列と isEqual であるかをチェックするだけではいけません。ただし、文字列またはプロミスが返されるかどうかに関係なく、正規表現を介したマッチングは正常に機能します。たとえば、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 が解決されるのを待っています。この場合、サーバーへの呼び出しが行われるかモックされ、その結果がステートメントによってas-it-happen にlocalStorage書き込まれ、検出されることを意味します。 カスタム タイムアウトは必要ありません。expect

于 2015-11-06T10:18:08.517 に答える
1

おそらく browser.wait() 関数で正しく待機していません。値は promise である必要はなく、true になると待機を終了する単純なブール値である必要があります。次のように動作します。

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

分度器についてもっと読む待って

または、 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});
});
于 2015-10-26T14:25:47.757 に答える