About processing until the specified screen appears

指定の画面が出るまで処理に関してです。
指定の画面を認識すれば処理を進め、時間を指定して10回、画面認識がなければ強制終了処理を考えています。
find element と whileを利用したいと思います。
find element にcontinue on errorにはfalseを指定してこの情報をwhileの条件で取得したいのですがうまくいきません。
uipathの初心者であり不勉強です。
教えていただきたく思います。日本 - UiPath Community Forum

It is about processing until the specified screen appears.
If you recognize the specified screen, proceed with the process, specify the time 10 times, if there is no screen recognition you are thinking about forced termination processing.
I would like to use find element and while.
I want to retrieve this information under the condition of while specifying false for continue on error on find element, but it does not work.
I am new to uipath and I am not studying.
I would like to tell you.

[Find Element] アクティビティのプロパティ欄にある、[WaitActive] もしくは [WaitVisible] チェックボックスを要件に応じてセットしてみてください。
画像がアクティブになる、もしくは表示されるまで[Find Element]で待ってくれて、
画面に出たら先に進みます。

タイムアウトの処理は、同じく[Find Element]のプロパティにある[TimeoutMS]に必要な時間を入れるとよいでしょう。指定した時間が過ぎたらExceptionするので、それをTry-Catchで拾ってあげればよいです。

ありがとうございます。
大量データの抽出ですので通常のオペレーションでも忘れたころに終了という感じです。
ちなみにsapです。
あるいはサーバーの負荷状況ですぐに抽出されることもあります。
ご教示お願いします。

上で yukinoさんが書かれているように

が、基本になると思います。
Find Elementは「要素が見つかればすぐに次に進む」「TimeoutMSで設定した時間までは待つ」という動作なので、TimeoutMSだけ必ずしも待つわけではありません。
ですので、必要な時間をTimeoutMSに設定すれば、Whileのループを用いなくても期待通りの動作をできるのではないでしょうか?

本当にありがとうございます。
[find element[のプロパティの[timeout ms]で時間指定します。
後、try-catchの[catches]では、[exception]を選択しました。
[try-catch]の[fainal]で[if]を利用し[true]と[else]で終了か後続処理を考えています。
[if]の条件[condition]には、何をしてすべきか教えてください。
初心者兼50過ぎたものです。
過去にシステム経験ありますがrpaデビューですのでよろしくお願いします。

厳密にやるのであれば、catchesで取るのは
ActivityTimeoutException (UiPath.Core.Activities.ActivityTimeoutException)
が正しいです。(ただのExceptionは「全ての例外」に該当するので、Timeout以外の何かしらのエラーも拾ってきてしまいます。が、逆に「他にエラーを拾う場所がない」のであれば、そのままでも大丈夫かもしれません)

本題のTry-Catchアクティビティですが、
「Try」内で処理を行っているときに、設定した例外が発生したら、「Catch(Catches)」の内部が実行されます。

ですので、処理の方法は2種類考えられて、
・エラー時の処理は全てCatch内で行い、Finallyは使用しない
・エラーが発生したかどうかの変数(フラグ)を用意しておき、Catch内でフラグを立てた上で、Finaly内に配置したIfのConditionはそれを条件にする
になると思います。

たとえばSAPの画面を閉じる、といった操作は、成功でも失敗でも行うことが考えられるので、Finallyで行うべきですが、失敗したときに終了フラグを立てるだけであれば、Catchの中でその処理をするほうが無難ではないでしょうか。

回答いただき痛み入ります。
uipath少しずつ分かり始めてきました。
try-catchの[catches]では、[ActivityTimeoutException ]を選択しました。

・エラーが発生したかどうかの変数(フラグ)を用意しておき、Catch内でフラグを立てた上で、
Finaly内に配置したIfのConditionはそれを条件にする

とした場合、色々調べましたが、HONOKA様が言われるエラーが発生した場合のstatus はどのようにuipathから取得すればよいでしょうか。
[if]の条件をどう記載すべきかご教示お願いします。
基本的なことで申し訳ございません。

Try~CatchのCatchesは複数のExceptionが設定できます。
(Add new catchをクリックすることでExceptionの種類が追加できます)

その中でActivityTimeoutExceptionが発生するのは、文字通り「タイムアウトの時だけ」なので、その中での処理は他の例外を想定する必要はありません。
(どのアクティビティでActivityTimeoutExceptionが発生したか、までは取得できません)

他のExceptionと区別するのであれば、
・上記の方法でActivityTimeoutExceptionとは別に、Add new catchでSystem.ExceptionのCatchesも追加する
・何かしらの変数(フラグでも数値でも)を用意し、ActivityTimeoutExceptionと、それ以外のExceptionのCatches内で違う値を設定する(Assign)
・Finallyでその変数を参照することで、Exceptionの発生有無および内容を判定する
といった流れでしょうか。

もう少し具体的な例だと、初期値が「0」のInt32型を用意して、ActivityTimeoutExceptionのcatchesで「1」を、System.Exceptionのcatchesで「2」を設定すれば、Finally部分で「0のままなら成功、1ならタイムアウト、2ならそれ以外のエラーだった」といった判別ができます。
このような3つ以上の分岐になるなら、IfよりはSwitchを使った方が良いと思いますが。

2 Likes

HONOKA様
ご教示ありがとうございます。
[try-catch]で
1 [try]で[find element]:プロパティのtimeoutmsで秒数を指定
2 [catches]で
・[timeoutexception]の場合[excepetion.Message]が発生した場合、タイムアウト:1
・[exception]の場合[excepetion.Message]が発生した場合、その他エラー:2

3 finalで[Switch]を用いて
0:正常で後続処理実行
1,2:エラー処理
としました。

ようやく理解できた感じです。
ありがとうございます。

HONOKA様
色々ご教示ありがとうございます。
会社で大量データをsapで抽出(EXPORT)したところexcelが空白になった状態で待ちになります。
当初、画面1が出るとexport完了と思っていましたがこちらの失態です。


実際はsap.jpgの画面が出て待ち状態となり時間を経るとexportされることがわかりました。

sap.jpgの画面でtimeoutを設定できるでしょうか。

ご教示いただければ幸甚です。

画面の動きをもう少し詳しく教えてほしいのですが、

①処理内容として、「ダウンロード終了」→「(正常なら)次処理」 だと思うのですが、ダウンロード終了をどのように判断しようとしていますか?
②ダウンロードが終了したときに、{SAP.jpg}画面は表示されたままでしょうか?あるいは、自動的に閉じるのでしょうか?

①ダウンロード終了が画面上のなにかオブジェクトで判断できず、Excelにデータが勝手に張り付くのを待つ、だと次に進んでよいかを判断するのが少し難しそうです。

②で、ダウンロード終了時に{SAP.jpg}が閉じるのであれば、[Wait Element Vanish]という、画面上のエレメントが消えるまで待つ、消えたら次を実行、という[Find Element]の逆のようなアクティビティを使ってダウンロード終了を判断することができます。[TimeoutMS]も、もちろん設定できます。

本当に申し訳ございません。
excelを添付しました。
sapの動きです。
4のexport完了まで待ち後続処理を実行したいと思います。
ご教示いただきたく思います。sap_export.xlsx (121.7 KB)

Excelありがとうございます。見ますね。ついでに上の①②質問に回答いただけると助かります。

申し訳ございません。
① sapからexcelにデータが格納されたという要素あるいは画面をとらえて終了とする。
② sapでの子画面は、ダウンロードが終了したときに表示されます。
処理を見る限りexcelへのデータ格納より早く表示される感じです。
excelを業務用の名前で登録するため次の操作に移ったとき、表示は消えます。

よろしくお願いします。

ありがとうございます。私はSAPを操作できる環境にないのですが、
①②見る限りでは、SAP側の画面でダウンロード終了を検知できないように思います。(「返信にある、要素または画面をとらえて」がSAPでは判断できない)。

画面の動きとして、このような動きになっているのではないでしょうか。
{SAP.jpg}表示→Excel表示→Excelダウンロード終了(この時点で、Excel表示中、{SAP.jpg}表示中)

@matrix99999 さまから見て、「データが格納されたという要素または画面」に相当するものは何があるでしょうか?UiPathではそれを判断するようにワークフローを作るのが良さそうです。

ありがとうございます。
自分としては、sap.jpgの画面で判断したいと思います。
excelのデータ格納との画面表示の速さの違いがどれだけなのかsapに確認したいと思います。sap

調査させてください。

何度もすみません。
確認したところ、excelダウンロード完了とsapからの完了メッセージはほぼ同時ということでした。
考えたのはsapのポップアップ画面sap

これが表示された後、待ち時間をもうけ後続処理につなげたいと思います。
この場合、待ちの指定はどのようにすればよいでしょうか。
ご教示いただければと思います。

単純に待ち時間を、というのであれば、現状、Invoke Codeで以下のVB.NETコードを実行するのが楽です。

System.Threading.Thread.Sleep(1000)

(1000のところは1000ミリ秒=1秒なので、適宜調節してください。適当な名前を設定して引数にすることもできます)

メンテナンス性で考えると、Invoke Codeはあまり勧められるものではないのですが・・・、
UiPathにある標準のアクティビティだけでやるなら、DateTime型を作って、一定時間をAddして、現在時刻がそれより大きくなるまでWhileで回して……
みたいに、中途半端に面倒なことになるので。

HONOKA様
何度もご教示ありがとうございます。
excel画面とsapの子画面に時間差があると考え、delayアクティビティを用いて
時間を単純に調整しようと思っていました。
どううでしょうか。

そういえばdelayがありましたね、それでも同じように大丈夫かと思います。
(引数がTimeSpan型なので変数で動的に管理しようとするとやや面倒かもしれませんが、固定値なら問題ないですね)

1 Like