2017-11-05 8 views
2

角度を使ったアプリの動作テストを書いています。 、私はasync/awaitシンタックスを初めて使う人です。この問題は私を止めさせた。誰かがメソッドでTypescriptエラーType of 'await' operand must either be a valid promise or must not contain a callable 'then' member.を取得した理由とその解決方法を説明できますか?引数'await`を使用して、element()。getAttribute()がエラーを返しました: "await 'オペランドの型は有効な約束でなければなりません..."

画像の幅を確認して画像が表示されていることを確認しようとする次の簡単な投光器の仕様があります。

は、ここに私のE2E-spec.tsファイルからの抜粋です:

import { LoginPage, Layout } from '../page_objects'; 

describe('Login page',() => { 
    it('Should have the logo in the footer', async() => { 
    await LoginPage.navigateTo(); 
    await expect(Layout.isFooterLogoPresent).toBe(true); 
    }) 
}); 

そして、ここで問題になっているロゴ画像への可視性を持っている私のレイアウトページオブジェクトからの抜粋です。エラーの原因となるawait element(...).getAttribute(...)チェーンの行。

static get isFooterLogoPresent() { 
    return element(by.css('.content-footer img')).getAttribute('naturalWidth') // naturalWidth attr is 0 if image is missing 
     .then(imgWidth => imgWidth > 0); 
    } 

をところで、私はTypscript 2.3.2および5.2.0分度器を使用しています:(作品)

import { browser, element, by } from 'protractor/globals'; 

export class Layout { 
    static get isFooterLogoPresent() { 
    return (async() => { // <-- this wrapping is necessary to use async/await in getter method 
     return await element(by.css('.content-footer img')).getAttribute('naturalWidth') > 0; // <-- PROBLEM HERE 
    }) 
    } 
} 

次の約束ベースの構文は、私が交換するためにしようとしているものです。 私はあなたが持っているすべての知恵を感謝します。ありがとう!解決された値に、いない比較式に> 0を適用する

import { browser, element, by } from 'protractor/globals'; 

    export class Layout { 
    static get isFooterLogoPresent() { 
     return (async() => { 
     return (await $('.content-footer img').getAttribute('naturalWidth')) > 0; 
     }) 
    } 
    } 

これをBUT -

+0

香辛料は、分度器タイプ定義ファイルに問題があります。あなたは何のために使っていますか? –

+0

前回のコントロールフローを使用して長い時間がかかっていることを確認してください:https://github.com/angular/protractor/tree/master/exampleTypescript/asyncAwait –

+0

Ah @MadaraUchiha、私は分度器のための特定のタイコープルの宿泊施設はありません。私のpackage.json devDependencies、または何か他に '@ types/protractor'が必要ですか? (このようなパッケージは存在しますが、1年間更新されておらず、一般的な解決策であることを示すダウンロード速度はありません)。はい、私は分度器の設定をオフにしています。 –

答えて

0

ちょうどあなたのawaitのために括弧を追加します!あなたはここに上のエラーを持っている:isFooterLogoPresentはまだあり

await expect(Layout.isFooterLogoPresent).toBe(true); 

機能は、あなたが本当であることを約束オブジェクトをアサートするので、それは、JSのオブジェクトの比較がどのように動作するかに応じて、常にtrueになり、約束を返します。

await expect(await Layout.isFooterLogoPresent).toBe(true); 
+0

これは問題を解決しませんでした。明示的に括弧付きのawait演算子のスコープは、私が得るエラーを変更しませんでした。引数を 'expect()'に待っている2番目の点については、分度器/ジャスミン構文では約束が必要なので、解決するまで明示的にパラメータを待つ必要はありません。 (私は助けてくれると感謝しています!) –

+0

@MatthewMarichiba エラーは異なっています - これは文字列にapply>演算子を使用できないということです。 parseIntを追加します。 戻り値parseInt(要素待ち(by.css( '。content-footer img'))。getAttribute( 'naturalWidth'))> 0; – Xotabu4

0

私は分度器5.2は、非同期/まだ構文を待つための準備ができていないという結論に来ている:偽陽性のテストを修正するため、これに 変更。もし誰かが頑強に作業してくれたら、どうやってどのようなバージョンがあるのか​​知りたいです。現時点では、getAttribute()のソースを調べると、プロミスではなくElementFinderオブジェクトが返されます。このオブジェクトは.then()メソッドを持っていますので、を使用すると、.then()を連鎖することによる約束のような結果になりますが、TypeScript(正当なもの)はそれを適切な約束として認識しません。つまり、awaitです。

現時点では、私はこの投射器プロジェクトのために非同期/待機をあきらめています。私は代わりに約束して非同期の振る舞いを完全に扱うことに転じています。

関連する問題