2017-09-25 16 views
0

InternのWebアプリケーションの機能テストを記述します。 私はテストにすべてのアクションを記述したファイルを持って、そしてまた、例えば、これらのアクションは関数setFindTimeoutが機能しません

と呼ばれているテストがある:

Action.tsがで

ファイルがありますそれは順次

//1 
//open the registration window 
openRegistration(): Command<void> { 
    return Action.openRegistration(this.parent); 
} 

static openRegistration(command: Command<any>): Command<void> { 
    return command 
     // click on the authorization menu 
     .setPageLoadTimeout (10000) 
     .get(intern.args.url) 
     .end() 
} 

//2 
inputTextByCssSelector(selector: string, value: string): Command <void> { 
    return Input.inputTextByCssSelector(this.parent, selector, value); 
} 

static inputTextByCssSelector(
    command: Command<any>, 
    selector: string, 
    value: string 
): Command<void> { 
    return command 
     .setFindTimeout(10000) 
     .findByCssSelector(selector) 
     .click() 
     .type(value) 
     .end() 
     .end() 
} 

この

.then(() => action.openRegistration()) 
.then(() => input.inputTextByCssSelector(
    "input [name = userName]", 
    intern.args.username 
)) 
.then(() => input.inputTextByCssSelector(
    "input [name = password]", 
    intern.args.password 
)) 
などと呼ばれている試験において機能します

しかし、私がテストを実行すると、それは落ちます。私はこの

openRegistration(): Command<void> { 
    return Action.openRegistration(this.parent); 
} 

static openRegistration(command: Command<any>): Command<void> { 
    return command 
     .setPageLoadTimeout(10000) 
     .get(intern.args.url) 
     .sleep(7000) 
     .end() 
} 

のように例えばopenRegistrationの最後に明示的な遅延を設定した場合

その後、すべてが

はなぜinputTextByCssSelectorsetFindTimeout(10000)を動作しません動作しますが、openRegistrationsleep(7000)

答えて

0
の作品

「落ちる」とはどういう意味ですか?テストでタイムアウトエラーが発生していますか?

1つの潜在的な問題は、コンポーネントの可視性です。ページが読み込まれてからインタラクトしようとしている要素が見えるようになるまでに遅延がありますか(アニメーションのJSフェードなど)? findByコマンドは最初に見つかった要素を返しますが、その要素は表示されないことがあります。表示されていない場合、インターンはそれと対話できず、typeのようなコマンドは失敗します。要素が表示されるまで待機するには、findDisplayedByCssSelectorを使用します。

CSSセレクタではスペーシングが重要であることに注意してください。セレクタ"input [name = userName]"は、実際にはという要素を持つ要素をinput要素内に格納しています。実際の意図は、特定の名前属性を持つ入力を選択することであると仮定すると、'input[name="userName"]'という形式にする必要があります。

end()コマンドは、findコマンドの後でのみ必要であり、通常はヘルパーコマンド(this.parentから開始されるもの)のコマンドチェーンの最後には必要ありません。たとえば、getの後にendを入れる必要はなく、inputTextByCssSelectorにはend(最大で1つ)が必要です(findByCssSelectorコマンドの場合)。

0

私は初めてインターンを使う方法を学び始めたときに、これと似たようなことを試みました(タイプスクリプトを使用しないでください)。

私の問題は、Promiseチェーンがテストの実行時に正しく維持されていないことでした。 Promiseチェーンの一貫性を高めるために、以下のようにコードを微妙に変更してみてください。我々が開始する前に

は、だから例えば、あなたのテストスクリプトは、このようなものです:あなたがする必要がある

return this.remote 
    .then(() => action.openRegistration()) 
    .then(() => input.inputTextByCssSelector("input[name = userName]", intern.args.username)) 
    .then(() => input.inputTextByCssSelector("input[name = password]", intern.args.password)) 

最初にすることは、これらの矢印の機能を削除しています。矢印関数を使用するときにいくつかの問題がありました。つまり、this.remote leadfoot/Sessionは、これを実行したときにメソッド間で一貫して渡されませんでした。

最初の.then()ステートメントでopenRegistration()というメソッドが呼び出されました。

static openRegistration(): Command<void> { 
    return function() { 
     return this.parent 
      .setPageLoadTimeout (10000) 
      .get(intern.args.url) 
      .end() 
    }; 
} 

はだから今、あなたのテストスクリプトは次のようになります(そして、あなたが呼び出しているすべてのメソッドのために、このパターンを繰り返し仮定):、代わりに、あなたが探しているの手順を実行し functionを返すためにあなたの方法を編集:

return this.remote 
    .then(action.openRegistration()) 
    .then(input.inputTextByCssSelector("input[name = userName]", intern.args.username)) 
    .then(input.inputTextByCssSelector("input[name = password]", intern.args.password)) 

これで問題が解決するはずです。

関連する問題