UFT OneでSAPのローディングパネルが消えるまで待つ方法
はじめに
こんにちは、SHIFT テスト自動化アーキテクトの三浦です。 今回はUFT OneでSAPのローディングパネルを待つ方法についてご紹介したいと思います。
UFT Oneとは
MICRO FOCUS社が提供するWeb、モバイル、API、RPA、エンタープライズアプリケーションソフトウェアの機能テストを自動化する事ができるツールです。 UFT OneではSAPのアドインが用意されているのでSAPの画面に特化して簡単に自動化スクリプトを実装することができます。
ローディングパネルが消えるまで待つ必要性
トランザクションコードのページ遷移時や実行ボタン押下時など、掛かる時間が一定でない処理があります。 ページ遷移完了前に表示されていない項目へ値をセットするなどしてしまうと処理が失敗してしまう為、安定して自動化スクリプトを実行するにはローディングパネルが消えるのを待ってから後続の処理を行う必要があります。
SAPのローディングパネルについて
SAPでは全ての画面にローディングパネルの要素を持っています。 ローディングパネルとは以下のように、ページの中心に表示される要素の事を指しています。
どのページでもローディングパネルを認識できるようにする為には以下の2通りのやり方があります
① 全てのページでローディングパネルのリポジトリを生成する
② ローディングパネルのリポジトリを1つだけ生成し、スマート認識を利用して使いまわす
前者は遷移するページ全てでローディングパネルを記録する必要がありますが、後者の方法では共通のリポジトリを1つ生成するだけで全ページのローディングパネルを認識できるので、後者の方法で実装します。
補足説明
リポジトリとはUFT Oneで操作を記録した際に保存されるオブジェクトの事を指します。 スマート認識の詳細については後述します。
ローディングパネルが消えるまで待ってみる
ローディングパネルが消えるまで待つには、まずローカルリポジトリに
ローディングパネルを記録する必要があります。
やり方は幾つかありますが、ローディングパネルを強制的に表示すれば簡単に記録することができます。
ローディングパネルの記録方法
ブラウザはChrome推奨です。
SAPにログイン後、F12キーを押下し開発者ツールを開きます。
Elementsタブで [Ctrl] + [F] を押下して検索バーを表示させることができます。
「loading」で検索すると以下の要素が見つかるので「display: none;」を消すことでローディングパネルを表示する事ができます。
ローディングパネルを記録すれば準備完了となります。
ローディングパネルが消えるまで待つプロシージャ
ローディングパネルが表示されているかどうかを1秒毎に確認し、ローディングパネルが消えれば指定した秒数待つというプロシージャになります。 ファンクションにしているので呼び出し方はWaitと同じく、WaitSafely(1) のように呼び出す事が出来ます。 ここでは、ログイン直後の画面でローディングパネルを記録しています。
'ローディングパネルが消えてから待機する
Function WaitSafely(seconds)
'ローディングパネルが表示されている間は待機させる
Do While True
'GetROPropertyでStyleの値を参照
'displayプロパティがnoneの場合はローディングパネルが消えているのでループを抜ける
If Browser("SAP Easy Access").Page("SAP Easy Access").WebElement("LoadingPanel").GetROProperty("style/display") = "none" Then
Exit Do
End If
Wait(1)
Loop
Wait(seconds)
End Function
上記プロシージャの問題点
これでローディングパネルを待つ事が出来るようになりました。 しかし、このプロシージャには問題点があります。 それは、ログイン直後の画面以外でローディングパネルを認識するのに毎回、既定時間(デフォルトは20秒)待つ必要があるという点です。 その理由としては、ローディングパネルを認識する際にスマート認識が働いている為です。
スマート認識
なぜ要素の認識に時間が掛かってしまうのかについては、UFT Oneの機能を把握する必要があります。 UFT Oneでは基本的に、プロパティに完全一致する項目に対して操作が行われますが既定時間(デフォルトでは20秒)経っても見つけられない場合はスマート認識という機能が働きプロパティに部分一致するオブジェクト情報を探索します。
具体的には、ブラウザ ⇒ ページ ⇒ 項目の情報に完全一致する項目を探しに行き、既定時間で見つからなければ項目の情報だけで一致する要素を探します。このスマート認識に切り替わるまで時間が掛かってしまっているので、どのページにも存在する項目であればスマート認識に切り替える時間を0秒にセットする事で要素を即座に取得できるようになります。
ローディングパネルが消えるまで待つプロシージャ(スマート認識に即切り替え)
Setting("DefaultTimeout")に値をセットすることでスマート認識に切り替わるまでの時間を制御することができます。
'スマート認識に切り替わるデフォルト値を追加
Const Smart_Recognition_DefaultTimeout = 20000
'ローディングパネルが消えてから待機する
Function WaitSafely(seconds)
'既定値を変更するプロシージャを追加
Call InitializeDefaultValuesSet()
'ローディングパネルが表示されている間は待機させる
Do While True
'GetROPropertyでStyleの中を参照
'displayプロパティがnoneの場合はローディングパネルが消えているのでループを抜ける
If Browser("SAP Easy Access").Page("SAP Easy Access").WebElement("LoadingPanel").GetROProperty("style/display") = "none" Then
Exit Do
End If
Wait(1)
Loop
'既定値を変更するプロシージャを追加
Call InitializeDefaultValuesReset()
Wait(seconds)
End Function
Sub InitializeDefaultValuesSet()
'スマート認識に切り替える時間を0秒に設定
Setting("DefaultTimeout") = 0
'レポートのフィルターの設定
Filter = rfDisableAll
End Sub
Sub InitializeDefaultValuesReset()
'スマート認識に切り替える時間を初期設定に戻す
Setting("DefaultTimeout") = Smart_Recognition_DefaultTimeout
'レポートのフィルター設定を初期設定に戻す
Filter = rfEnableAll
End Sub
補足説明
このプロシージャではスマート認識に切り替える時間を0秒にセットし、処理完了後に既定の20秒に再セットしています。 予め設定しているスマート認識の既定時間を退避させておき、処理終了時に退避させた時間を再セットする方法もありますが、 ローディングパネルの待機中に実行エラーとなり終了すると既定値が0秒にセットされたままとなってしまうので終了時は固定値でセットする方が安全に動作します。
切り替え時間の制御に加えて、ローディングパネルを待つ処理がレポートに出力されてしまうのを防ぐ為にレポートフィルターの設定も変更しています。
最後に
いかがだったでしょうか。 上記の考え方と同様にすれば、SAPのメッセージバーのメッセージを取得する共通部品なども作成することができます。 SAPでの利用に留まらず、考え方が分かれば他のサイトでも流用することのできる内容だったと思います。 自動化において安定して動作させる事は重要な課題ですので、こちらを参考にして頂ければ幸いです。