UiPathで以下の様な作業を自動化しようとした際にはまったのでメモ。
やりたかった事
- アプリケーションを実行し、ある画面を開く。
- 開いた画面上で検索を実行し、検索結果をダウンロードする。(画面上に検索ボタンとダウンロードボタンがある)
- ダウンロードした結果をメールで配布する。
はまった点
検索処理にかかる時間がまちまちなので、検索ボタン押下~検索結果表示までの間に表示されている検索中ダイアログが表示されているまで待機するように「要素の消滅を待つ(Wait Element Vanish)」アクティビティを設定した。
ところがロボを動かしているとそのアクティビティでエラーが発生した。
メッセージ: アクティビティのタイムアウトを超過しました
例外の種類: UiPath.Core.Activities.ActivityTimeoutException
原因
待つといっても無制限に待つのではなく、アクティビティで設定されたタイムアウト値(デフォルトは30秒)しか待たないから。
無制限に待ってしまうとロボがいつまでも終了できない事態になってしまうので、当然といえば当然の仕様。
ただ待つといってるのに「タイムアウトしました」ってなると混乱するのは仕方ない気がする。
対策
タイムアウトを想定される最大時間まで伸ばす
今回の場合だと検索処理は一番時間のかかるときで10分だった。
なのでタイムアウトを600,000に設定し、それ以上かかる場合はエラーとするようにした。
ただ設定値を変更する場合には設定値を変更する理由を注釈を入れておいた方がいいと思う。(開発環境と実行環境で処理にかかる時間が異なる場合などは特に)
要素の有無を検出し続ける
あまりスマートじゃない気もするが、「要素の有無を検出(Elements Exists)」アクティビティをループし続けて、存在しなくなったらループを抜けるという手段もある。
ただこちらの場合、何らの異常があって要素が存在し続けてしまった場合に無限ループとなってしまい、ロボがいつまでも終了できない事態となってしまう。
また前者が1アクティビティなのに対して、こちらは複数のアクティビティが必要になるのでロジック上も複雑になってしまう。