ループを使用すると、1回のテスト実行内で一連のテストステップを指定した回数繰り返すことができます。ループは、ドロップダウンのすべてのオプションを選択する、カートに複数のアイテムを追加する、テーブルの各行を確認するなど、リスト内の各アイテムに対して同じ操作を実行する必要がある場合に役立ちます。この記事では、テストでループを作成して操作する方法について説明します。具体的には以下の内容を含みます。
制限事項
APIテストのフローでは、ループはサポートされていません。
ループを作成する
mablトレーナーで、次の手順を実行してループを作成します。
- [+ (ステップを追加)] > [ループ処理] をクリックします。
- ループはmablのフローとして保存されます。フローに名前を付けてください。
- [ループ処理] タブをクリックします。
- [指定回数ループ処理] を選択するか、動的に数値を設定するには [変数を使ったループ処理]を選択します。値は、2~500の有効な数値である必要があります。フローパラメータを使用してループするようにフローを設定することはできません。
- OKをクリックします。
- [Start flow] ステップと [End flow] ステップの内側にTrainerのカーソルがある状態で、ループ内で繰り返すテストステップを記録します。
または、既存のテストステップのセットをループに変換することもできます。ループを作成し、[Start flow] ステップと [End flow] ステップをドラッグアンドドロップして、ループ内で繰り返すテストステップを囲みます。
フローにループ値を設定しても、その設定は他のフローのインスタンスには適用されません。ループとして機能することを意図したフローを識別するために、ワークスペース内で命名規則を使用することをお勧めします。
ループの設定
ページ上のアイテムをループ処理する
ループの一般的なユースケースとして、ドロップダウンのオプション、テーブルの行、メニューアイテムなど、動的なリストの各アイテムに対してステップを繰り返すことが挙げられます。設定するには、次の手順に従ってください。
- アイテムを数える。 要素を検索を使用して、ループ処理する要素を見つけます。要素数から変数を作成してください。
- カウント変数を使用してループを作成する。 上記のステップに従ってループを作成し、変数を使用してループを選択して、先ほど作成したカウント変数を選択してください。
-
ゼロベースのインデックス変数を作成する。 ループ内で、値が
{{@run.loop_index-1}}のindexという変数を作成します。これは、run.loop_indexが1から始まるのに対し、要素リストはゼロインデックスであるため必要です。詳細については、ループインデックスの使用に関するセクションを参照してください。 -
インデックスを使用して各アイテムをターゲットにする。 要素を検索を使用し、
{{@index}}を組み込んだXPathまたはCSSセレクターで現在のアイテムをターゲットにします。例:(//li[@role="option"])[{{@index}}]。 - アクションを実行する。 要素をクリックする、テキストをアサートする、プロパティから変数を作成する、または各アイテムに対して繰り返す必要がある他のステップを記録してください。
要素からテキストやプロパティをリストに抽出する必要がある場合は、スニペットジェネレーターを使用して、必要な値を収集するJavaScriptスニペットを作成できます。
ループインデックス変数を使用する
ループ内では、run.loop_indexという名前の、1から始まる特別な読み取り専用の変数が追加されます。ループインデックスにアクセスするには、mablの変数構文{{@run.loop_index}}を使用します。
ゼロベースのインデックス
run.loop_indexは1から始まるため、配列や要素リストなどのゼロインデックスデータにアクセスする際は調整が必要です。ループ内で値が{{@run.loop_index-1}}の変数を作成し、セレクターやデータアクセス式でその変数を使用してください。
スニペットでループインデックスにアクセスする
スニペットでは、次のいずれかの方法でループインデックスにアクセスできます。
-
{{@run.loop_index}}をスニペットのパラメータとして追加します。 -
mablInputsオブジェクトからループインデックスにアクセスする:mablInputs.variables.web.runtime.flow_run_ordinal_index
ループを早期に終了させる
特定の条件が満たされたときに終了するホワイルループを実質的に作成するには、次のステップに従ってください。
- 変数を作成し、値として数値を代入します。
- 作成した変数を使ってループするフローを作成します。
- フロー内で、ループが終了する条件をアサートするIFステップを追加します。
- IFステップで、ループ変数と同じ名前で新しい変数を作成する変数ステップを追加し、その値を0に設定します。
- ELSEステップを追加します。
- ELSEステップで、ブレーク条件が満たされなかった場合にループが実行するステップを記録します。
次の例では、変数totalを500に初期化しています。ループ内で、チェックされたチェックボックスの数が5に達するとすぐに、totalの値が0に変わります。ループ変数の値を更新すると、ループが早期に終了します。
ループを早期に終了させる
このパターンは、期待する値が表示されるまでページを更新するなど、ポーリングのシナリオにも役立ちます。ループ回数を最大リトライ数に設定し、期待する要素または値が存在する場合にループを終了する条件を追加してください。
Trainerでループを再生する
mablトレーナーでループを再生する際、ループを途中で停止したとしても、mablは現在のインデックスからループ再生を再開しようとします。Trainerでの再生用に特定の反復にループを設定するには、ループドロップダウンをクリックしてください。
テスト実行でのループ出力を確認する
クラウドでループを含むテストを実行すると、テスト出力には各イテレーションに対して次のタグが表示されます: Loop: {current index}/{total loop count}。
{total loop count}は、テスト実行中にループが実行された回数を示します。この数値は、テストに設定されたループ回数と必ずしも同じではありません。例えば、ループを5回実行するように設定していても、ループの3回目のイテレーション中にテストが失敗した場合、テスト実行のループ合計回数は5ではなく3になります: Loop: {current index}/3。
ループとデータテーブル
ループとデータテーブルシナリオは、それぞれ異なる目的を持っています。
- ループは1回のテスト実行内でステップのサブセットを繰り返します。
- データテーブルシナリオは、データの行ごとにテスト全体を1回実行します。