処理のリトライについて

Get Textで文字列を取得する処理について、文字列が取得できていない場合はリトライする処理をしたいです。リトライスコープを使うにも指定する条件が分かりません。waitを入れて文字列が表示されるのを待つしかないのでしょうか?どなたかご教示ください。

文字列が取得できない理由によって対処が異なりますので正しい対処ではないかもしれませんが、この場合はWhile文のほうがわかりやすいかもしれません。
このときの条件として、下記を満たしていることを確認してください。

  • セレクターを指定し要素は取得できるが、結果として取得できる文字列が空白となる場合がある
  • 取得したいテキストが含まれるUI要素のセレクタが、取得できるとき/できないときで変化しない

アクティビティのの組み方としては下記になるかと思います。

  • Get Text (textに取得したテキストを保存)
  • While (Condition: String.IsNullOrEmpty(text))
    • Body
      • Delay ⇐ 任意の秒数を指定(hh:mm:ss形式)
      • Get Text ⇒ textに取得したテキストを保存する

上記のようにアクティビティを配置してみてください。
1つ目のGet Textで取得したtextについて、WhileのConditionで空白であるかどうかを判定します。
もし空白でなければFalseとなり、Bodyの中身を実行せずに終了します。
もし空白であればTrueとなり、Bodyの中身が実行されます。この中身には、1つ目と同じ内容のGet Textを含めることで、「空白の場合には再度Get Textを実行する」というロジックが成り立ちます。

While文ですね!ありがとうございます。

@cheez_RPAさんの書き込み以外にも、
「繰り返し (コレクションの各要素)」アクティビティを使う方法をご紹介します。

「繰り返し (コレクションの各要素)」のコレクションにString.Concat(Enumerable.repeat("",3))
と言うように、"
"の3配列分繰り返すようにします。

これをすると、3回GetTEXTアクティビティを実行して、空白だろうがなかろうが、GetTEXTを止める事になります。

こうする事で、抜本的にネットワークがダメな時の無限LOOPを避ける事が出来ます。

繰り返し (コレクションの各要素) コレクション:
String.Concat(Enumerable.repeat("*",3))
└Get Text (textに取得したテキストを保存)
条件分岐:Condition: String.IsNullOrEmpty(text)
TRUE ⇒ Delay ⇐ 任意の秒数を指定(hh:mm:ss形式)
FALSE ⇒「繰り返しをブレーク」

条件分岐:Condition: String.IsNullOrEmpty(text)
TRUE ⇒ メッセージボックスなどで、異常を通知
False ⇒ 後続処理

如何でしょう?

2 Likes

ありがとうございます。
その方法も試してみたいと思います。

1 Like

Retry Scopeでは、条件は必須ではありません。
サンプルを作成したので、試してみてください。(メモ帳から、表示中の文字を取得します。3回失敗したら、その旨を表示します)
GetTextIssue.zip (12。1 キロバイト)

Retry Scopeは、「処理の途中で、例外が発生する」か、「条件が設定されていて、処理後に設定されていた条件が、Falseになった」ときに、リトライをします。
条件を設定しなければ、例外が発生したときだけ、リトライをします。

あとは、Get Textの使い方になりますが、対象の画面要素が存在しなければ、例外が発生します。
ですので、Retry Scopeの中は、Get Textだけで良いと思います。

1 Like

こんにちは

個人的には

でも少し言及されていますとおり、これはアプリケーションのつくりによると思いますが、WebでJavaScript等で値を書き込むようなつくりの場合(特に非同期で)は、GetTextで例外を吐かずに空文字列を取得してしまったり、画面遷移が追いつかず書き換わる前の値を取得してしまったりするケースもしばしばあります。

もし上記に該当するケースでRetry Scopeを使う場合は、内部で取得内容のチェックを併用したほうがベターかなと思います。下記の例は空文字の場合に例外吐かせています。

img20190830-1

あるいは、上記のIfアクティビティの代わりに
リトライスコープの条件の欄にIsMatch(文字列の一致をチェック)アクティビティを使って内容を判定させることもできるかと思います。(例外吐かないのでこちらの方がスマートかも)

2 Likes

空白判定をするなら、Check Falseアクティビティで良いと思いますよ。

3 Likes

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.