
【いきなりStudio25】(実践編)[UiPath✖YouTube]要素の存在を確認と繰り返し回数、テキストの取得でガチろう~名前の響きなのかその場で検証しない人が使いたがるのがリトライ・スコープ。ガチラーなら繰り返し回数を使う~今回からソース・チューニング始めました( ´∀` )
さてと、前回
で、
セレクターを含めたConfigファイルへの外出し
まではやったので、
で作った
正常系
に
異常時の対応:エラーハンドリング
を肉付けしてく💃
んだば、早速( ´∀` )
ここまでのソース

ここでポイント①:手で操作するときに、無意識でやってる確認を盛り込み、確認出来ないなら安全にコカす
の最後で書いた文章を繰り返すけど、
まあ、言われりゃ当たり前なことなんだけど、
人間が普段、無意識でやってる確認も必要
たとえば仮に、Edgeを使ってYouTubeに普段アクセスしようとして、
Edgeが開かない
インターネットに繋がっていない
YouTubeにアクセスしようとしたけど、YouTube側の問題でYouTube画面が開かない・アクセスできない
って場合に、普段手作業でやってる時って、どうしてる❓👀
Edgeが開かない👉Edgeを開きなおす
インターネットに繋がっていない👉インターネットに繋ぎ直す
YouTubeにアクセスしようとしたけど、YouTube側の問題でYouTube画面が開かない・アクセスできない👉YouTubeにアクセスし直す
のいずれかをやってもダメな場合は、
パソコンの再起動とかパソコンやモデムがおかしくないか、会社なら社内ネットワークがおかしくないか
などなど、必ず、
EdgeやChromeみたいなブラウザにアタッチ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示
YouTubeにアクセス
の間でも、
操作はしてないけど
色々、確認してるでしょ( ´∀` )
確認まで、正常系の操作手順に入れると、
EdgeやChromeみたいなブラウザにアタッチ(手で操作あり)
EdgeやChromeみたいなブラウザをアタッチできたか確認する(手で操作なし)
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)
YouTubeにアクセス(手で操作あり)
YouTubeにアクセス出来たかを確認(手で操作なし)
てな感じで、それでもし確認した結果、どこかのタイミングで上手く出来てないなあだったら、
EdgeやChromeみたいなブラウザにアタッチ(手で操作あり)
EdgeやChromeみたいなブラウザにアタッチできたか確認する(手で操作なし)👉確認後開いてないなら、開きなおす
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)👉確認後入力されてないなら、入力し直す
YouTubeにアクセス(手で操作あり)
YouTubeにアクセス出来たかを確認(手で操作なし)👉確認後アクセス出来てないなら、アクセスしなおす
で、それでもダメなら
EdgeやChromeみたいなブラウザにアタッチ(手で操作あり)
EdgeやChromeみたいなブラウザにアタッチできたか確認する(手で操作なし)👉確認後開いてないなら、開きなおす。3回やってもダメなら操作をやめる
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)👉確認後入力されてないなら、入力し直す。3回やってもダメなら操作をやめる
YouTubeにアクセス(手で操作あり)
YouTubeにアクセス出来たかを確認(手で操作なし)👉確認後アクセス出来てないなら、アクセスしなおす。3回やってもダメなら操作をやめる
で、これをただ、プログラミングとかロボットのアクティビティなんかで書き換えるだけ。
EdgeやChromeみたいなブラウザにアタッチ(手で操作あり)=ブラウザにアタッチアクティビティ
EdgeやChromeみたいなブラウザにアタッチできたか確認する(手で操作なし)👉確認後開いてないなら、開きなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)=文字を入力アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)👉確認後入力されてないなら、入力し直す。3回やってもダメなら操作をやめる=文字を取得アクティビティ+繰り返し回数アクティビティ
YouTubeにアクセス(手で操作あり)=クリックアクティビティ
YouTubeにアクセス出来たかを確認(手で操作なし)👉確認後アクセス出来てないなら、アクセスしなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
で、それをロボットの場合、
安全にコカすために、開きなおしとかせずに、
👉安全にコカす=異常終了。次の処理をしない
にするだけ。
人間と違って、目視で確認して判断出来ないから、エラーにしてそこで終了するほうが安全( ´∀` )
最初と肉付けした最後の箇条書きをもう1回見比べるだけでも
■正常系
EdgeやChromeみたいなブラウザにアタッチ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示
YouTubeにアクセス
■肉付け後
EdgeやChromeみたいなブラウザにアタッチ(手で操作あり)=ブラウザにアタッチアクティビティ
EdgeやChromeみたいなブラウザにアタッチできたか確認する(手で操作なし)👉確認後開いてないなら、開きなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)=文字を入力アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)👉確認後入力されてないなら、入力し直す。3回やってもダメなら操作をやめる=文字を取得アクティビティ+繰り返し回数アクティビティ
YouTubeにアクセス(手で操作あり)=クリックアクティビティ
YouTubeにアクセス出来たかを確認(手で操作なし)👉確認後アクセス出来てないなら、アクセスしなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
まあ、YouTubeにアクセスするだけでも、これだけの操作や確認(実は、タイムアウトなんかのプロパティ設定を入れると他にも配慮することは山ほどある)が必要ってのは分かると思う。
組み込み
確認後、異常があればエラーでコカすので、まずはトライキャッチを追加


これまでのソースは正常系なので



追加したシーケンスの中に移動
アクティビティ名を変えて、注釈を追加( ´∀` )

正常系シーケンスを移動
まだ、Catchが必要エラーが出てるから、今回も想定内のエラーなので
BussinessRuleException


エラー時も他のこれまでの処理と同様、エラー発生のメッセージをログに書き出すだけにするので~~~

で次は、アタッチ後、文字を入力する前に、
Edgeが開いてるかの確認をするので~~~

確認する箇所は、
Edge固有の部品の要素なら何でも良いんだけど、出来れば次の操作をする部品で関連付けしてる方が、
処理が繋がりやすくていい( ´∀` )
例えば、次の操作がアドレスバーに文字を入力なのに、ホームボタンを確認して、アドレスバーだけ何らかのバグで非活性とか非表示なら意味ないでしょ👀💦
👉実際、そんな組み込み方して、そんな事象が発生し、
あれ❓アタッチ後の確認で、
Edgeは開いてるログまで確認出来たのに、
何で文字の入力後にコケてるんだ👀💦
ってなったら確認まで入れてエラーハンドリングする意味なし( ´∀` )なので~~~
要素の存在を確認アクティビティ



UIExplorerで確認すると、

ひとつ下のアクティビティのセレクターを同じものに書き換え



ReadYouTubeConfig("Edgeアドレスと検索バー").ToString
で、プロパティの一番下の存在の有無に

このアクティビティで使う用の変数を新たに作成して、設定
existEdgeAddressBar
にでもしとこうか( ´∀` )



で、次にIfアクティビティを追加して、

で、
正常=アドレスバーの確認が出来た👉メッセージでログを残して、後続処理へ
異常=アドレスバーの確認が出来ない👉エラーで異常終了
て感じにするので


って感じで組み込み、

ここまでで一度、Main.xamlに戻って、ファイルをデバッグで実行



ステップインでこのまま続行してみると


で、一旦停止して、

開いてるEdgeを全部閉じて、今度は

ブレークポイント
ここまで出来たら、さっきと同じでMain.xamlに戻って、続行をファイルをデバッグで実行


Edgeを全て閉じたら、さっきと同じでステップインすると



同じエラーメッセージを出力してること
も確認出来た( ´∀` )
ここでポイント②:確認が1回だけだと、動作不安定なときに却って余計な異常終了が増えるので、繰り返し(指定回数)アクティビティを使う
インターネット回線やEdgeの動作が不安定で開きが遅い場合に、1回だけの確認だと、要素が上手く取得できない可能性があるので~~~
繰り返し(指定回数)アクティビティ

を使って、例えば、
3回要素の確認をしても、
ダメな場合はエラーでコカす
みたいな風にやるのが普通。

再度、ファイルをデバッグで実行




これで、Edgeを開いてないままの状態でステップインすると、、、

一歩前へ:セレクターの要素の取得で大事なのは、タイムアウトの設定
もう一回、要素を確認アクティビティに戻って、プロパティを確認してほしいんだけど

ターゲットの中に、タイムアウト(ミリ秒)って設定値があって、
現在は空欄=初期値
になってる👀タイムアウトが、初期値=デフォルト値の場合、
要素が確認出来るまで30秒待つ
って設定になってるので、今、3回繰り返しの中で
30秒✖3回=合計90秒待ってる
ことになる。さすがに、Edgeを開いてアドレスバーを確認しようとしてるだけなのに、
90秒待ってもアドレスバーの確認が出来ない
ってことは、
セレクターの要素が変わった
Edge自体が開いてない
それ以外のPCの不具合
の可能性が高いので、繰り返し確認しても確認出来ないなら、さすがに
エラーでコカす方が安全( ´∀` )
👉手で動かして操作する中で
こんな不具合があるときに、
後続の操作を続行する人おらんやろ( ´∀` )
なんで。タイムアウトに関しては、自分で時間を設定できるので別に、
1000=1秒
600000=60秒
にしてもらうことも出来るんだけど、3回繰り返す確認処理とはいえ、10秒なんかにして、結局初期値と同じ30秒だけ待機するなら、
そもそも繰り返し処理をしなくて
良くないか( ´∀` )
になってくるので、
タイムアウトを何秒にするかは、
何をしてる処理で、
何のために設定値を変えようとしてるか
によるって感じ( ´∀` )
ここでポイント③:開発現場だと、リトライスコープを使って
リトライスコープの中に、アプリケーションを開くアクティビティを入れる人を実際の現場で見たことあるんだけど、これって条件によっては、
リトライの回数分、再度ブラウザを開きにいく
👉同じブラウザとか同じ画面を
複数開くことになる
=後続の処理で上手く
セレクターの確認が出来ないことになる
↓
異常終了=バグの原因
になりかねないので、
アプリケーションを開く、ブラウザのアタッチ
はリトライスコープの中に入れない
↓
アプリケーションを開く、ブラウザのアタッチの中に、リトライスコープや繰り返し回数アクティビティを入れる
リトライスコープや繰り返し回数アクティビティの中に、アプリケーションを開く、ブラウザのアタッチを入れる
では、
似てるようで、全然意味が違うし、
動きが違ってくるから気を付けてね~~~
まあ、実際、組み込んだ後にすぐに検証すれば気づくんだけど、
漫然と頭の中だけでソースを組んで
実際に動かさずにやってる人で、
ブラウザが複数開いちゃう
って人をこれまでの現場で山ほど見てるから( ´∀` )さてと、操作に戻って~~~
次はアドレスバーに文字の入力後、入力出来たかの確認なんで~~~
テキストを取得アクティビティ

を使って、




Conditionの詳細エディターを開いて、

条件が保存出来たら、ThenとElseにそれぞれ、


で、さっきの要素の確認と同じように、アドレスバーへの文字の入力が1回で上手く入力出来ない可能性もあるので、さっきの繰り返し回数を使って

取得を繰り返すことも出来るし、

文字の取得も3回繰り返させることも出来る
などなどで変幻自在にできる。
👉そのときの要求によるかな( ´∀` )
ま、今回は

アドレスバーにテキストの入力と取得を
繰り返す感じで( ´∀` )
ブレークポイントを設定して、
で、Main.xamlに戻って、ファイルをデバッグで実行してみると、



3回繰り返すと、

てな感じ
後は、YouTubeにアクセス出来た後の確認なんで~~~


YouTubeの画面がちゃんと開いているかの確認なので~~
YouTubeが開いているかの確認方法としては、

これは、文字を入力した直後なんかで元々入力した文字がアドレスバーに残ってるだけでYouTubeがまだ開いたとは限らないから、確認に使わない方が良い。
YouTube側のサーバーの問題でアクセス不可になっていたらどうする❓👀
👉確認の意味なし
なので次に、

これは、YouTubeが開いた証明になるけど、さっきもEdgeのときにゆーたと思うけど、出来れば
次に、やりたい処理の部品があるかあるかで確認
した方が後続処理と繋がりが保てる
オイラが次にやりたい処理は、
で書いたとおり、
検索バーに文字を入力
なので、検索バーの確認

の方が確認しやすい( ´∀` )てか、YouTubeのホーム画面でロゴもだけど、ロゴ以上に
検索バーがないと、
YouTubeの98%の機能は使えないんじゃないか❓👀💦
ってくらい、
検索バーはホーム画面には必須なので~~~
なので、さっきまで使ってた
要素の存在を確認や
繰り返し(指定回数)アクティビティ
をココでも使って、

<html app='msedge.exe' title='YouTube' />
<webctrl tag='INPUT' placeholder='検索' idx='1' />
で要素を取得したらidx:インデックスは変わる可能性があるので、
<html app='msedge.exe' title='YouTube' />
<webctrl tag='INPUT' placeholder='検索' idx='*' />
てな感じに変更して、左上の検証で

変数を
existYouTubeReserchBar
みたいにセットして

変数パネルのスコープを

で、後は、これまでと同じ感じで、Ifアクティビティを追加して、ThenとElseを、


って感じで、セットするだけ( ´∀` )

ブレークポイントの位置を変更して
全てのEdgeを閉じて、Main.xamlに戻って、ファイルをデバッグで実行

なので、ここは

繰り返し(指定回数)の中でも、条件式で
アドレスバーに入力した文字と取得した文字が一致した場合は、繰り返しを抜ける=繰り返しを終了するifアクティビティを挟んでみて( ´∀` )

開いてるYouTubeのホームから他の画面に遷移させて、ステップインして、エラーが起こるかを確認

と、かなり、
繰り返しを終了アクティビティ
を使うと、きちんと一発で要素の存在が確認出来たときは時間短縮になるので、各繰り返し(指定回数)の中に入れておこう( ´∀` )

UiPathの現場離れて半年になるので忘れてた( ´∀` )
まあ、でもすぐに思い出すやつ
昔取った杵柄ってヤツ( ´∀` )
で、最後に今度は、普通にブレークポイントを全て外して、Edgeを全て閉じて、実行すると、


YouTubeのアドレスを入力しに行ってるね( ´∀` )
なので~~~


入力させるように
変更して、再度実行してみると

ソース・リファクタリング(Configファイルへの外出し込み)
さてと、後は
■リファクタリング前

■リファクタリング後(Configファイルへの外出し以外)

分かるようになった( ´∀` )
さてと、次は、Configファイルに外出し~~~
■リファクタリング後(Configファイルへの外出し後)

ここでポイント④:繰り返し回数を外出しするときは

元々、
Int:整数型
なので、Config読み込み後、キーの値を.ToStringで文字列に変換した後、
全体を、
CInt
で囲んで、データ型をInt型に変換してあげること。あと、オイラは、Configファイルのキーを

キーの数字と値を一致させてるんだけど、これを単に、

全部一律に、値に指定した回数しか出来なくて
あるアクティビティの箇所では、5回繰り返したいけど、他のアクティビティでは、3回繰り返しでいい
みたいなときに
使い分けが出来なくて困る
👉全部同じキー名で値を変えると、
全部一気にロボットの振る舞いが変わるので~~
=ロボパがかなり変わってくる( ´∀` )
ので、気を付けてね~~~

Configファイルに追加したシートとしては、




って感じかな( ´∀` )Configファイルへの外出し自体は問題ないんだけど、最後に、これでプロジェクトを実行すると

ソース・チューニング(今回から初登場)
まずは、デバッグ解析作業で、
入力した文字の取得する値が何か
が不明なので~~~

文字取得直後に、取得した文字の値を出力させてみる

Elseで入れた再入力処理が邪魔して、連続書きになってるので~~~



なぜかYouTube検索バーの確認はせずに
エラー終了してるね👀

確認用のメッセージをログをさらに2つ、条件分岐の前に追加して、どういう状態になるかを試すと

https://www.youtube.com
で取得してるから、
齟齬が生じちゃってる( ´∀` )
てことは、




でも実は改善無し( ´∀` )で、これをよくよく見てみると、実は、


なので~~~



なんだけど、これってもしかして、
取得した文字にyoutube.comが、
含まれればいいかどうかだけなんじゃね( ´∀` )


なので、




で実行
ついでに面倒くさいので、セレクターを使ってる箇所は全て、

で、実行すると



ダメ押しで3回やったけどエラーなし( ´∀` )
👉チューニング完了💃
ここでポイント⑤:そもそもソース・チューニングって何👀💦❓
まあ、コード・チューニング
と同じ手法なんだけど、ソースの中で、リファクタリングまでは終わって、ロジック的には問題はないはずなんだけど、
デバッグをしながら
ロボットのエラー頻度を減らす
処理時間を短縮する
みたいな感じで、
ロボット自体のパフォーマンス(振る舞い)
を改善する作業👉ロボパ改善作法
今回で言えば、
入力した文字は間違いがないはずなのに、エラーになる👉ブラウザ側で最後の/を消すので、条件によっては不一致=エラーを減らすためにContainsに条件を変更する
セレクターを使う箇所で、プロセスのCompleteを入れることで動きをスムーズに改善
など
ロボパをより良く改善させる作業
👉ソース・リファクタリングだけでは不可能
て感じかな( ´∀` )
これは、
実際に動かさないと分からないことが多い
👉動的プログラミングに近い
ので、結構、開発チームとテストチームが分かれてるような現在主流な開発セクション分けだと
中々、気づけない作業
👉いくら理論的には問題なくても、
ロボットもシステムも実際に動かしてみないと、
調整=チューニングが出来ない
ことが多い( ´∀` )
実際、今回でゆーと、
最後の/が今のブラウザの仕様だとなくていい
に気づけない
👉youtube.comって文字を含むか
に変えちゃった方が確実
なんざ
動かしながら調整しないと気づけないわ( ´∀` )
ま、ここまで実際にやらないから、
ロボパの悪いロボットで止まってるのが
自称さんではあるんだが( ´∀` )
裏を返すと、ソース・リファクタリングは、
効率の良くソース・チューニングをするため
の前準備
とも言えるけどね( ´∀` )
■ソース・チューニング後

後は、



getAddressBarText.Contains(ReadYouTubeConfig("Youtubeアドレスキーワード").ToString)
ついでに、Open_EdgeとClose_EdgeもComplete付けとこ💃



プロパティの値をひとつ変えるってゆーすっげえ簡単な操作なんだけど、それだけで、場合には依るけど、大体
ロボットのエラー発生が確実に減る
って寸法なんで、
ロボパに非常に大きく影響する
のに、
簡単か難しいかだけで判断して、
難しいことしかやろうとしない
👉自称さん
は結構、
完了=Complete
を
入れるべきところに入れていない
人が多いんだよねえ( ´∀` )
ま、もちろんWEBの操作によっては、
Completeだと、上手く操作出来ない
って場合もある
ので、そこは出された要求の匙加減ではあるけどね( ´∀` )
ここでポイント⑥:さっきからゆーてる準備完了まで待機プロパティのCompleteって何👀❓💦
要は、何かのWEBサイトを開いたときとか、別のWEB画面に遷移したときに、画面が完全に開き切るとか何かの要素が表示され切る
👉次の操作の準備が完了する
まで
次の操作をしないで、ロボットを待機させておく
ってこと。
ま、ここまでのソース・チューニングを見ればイメージは既に湧くとは思うけどね( ´∀` )
もう一歩前へ:基本を書き出せたら、要求に応じて間引く
これまでにやった作業をPPPでもう一回振り返ると、
EdgeやChromeみたいなブラウザを開く(手で操作あり)=ブラウザにアタッチアクティビティ
EdgeやChromeみたいなブラウザを開いたか確認する(手で操作なし)👉確認後開いてないなら、開きなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示(手で操作あり)=文字を入力アクティビティ
URLバーにYouTubeアドレスを入れるか、検索バーにYouTubeって入力して、検索結果を表示が表示されたかを確認(手で操作なし)👉確認後入力されてないなら、入力し直す。3回やってもダメなら操作をやめる=文字を取得アクティビティ+繰り返し回数アクティビティ
YouTubeにアクセス(手で操作あり)=クリックアクティビティ
YouTubeにアクセス出来たかを確認(手で操作なし)👉確認後アクセス出来てないなら、アクセスしなおす。3回やってもダメなら操作をやめる=要素を確認アクティビティ+繰り返し回数アクティビティ
敢えて、太字にした箇所要素の確認アクティビティ+繰り返し回数が少なくとも重なってるし、ただ単に、
YouTubeにアクセスしたいだけ
なんだから、さっき言った
Edgeが開かない
インターネットに繋がっていない
YouTubeにアクセスしようとしたけど、YouTube側の問題でYouTube画面が開かない・アクセスできない
みたいなトラブルがどこかに介在してるとして、それをブラウザにアタッチした最初の段階で確認しようが、YouTubeにアクセスした後に確認しようが
文字入力まできちんと入力出来たかを確認出来て、YouTubeにアクセス後に要素の確認までやって、確認出来なかった場合に異常終了させれば、
👉YouTubeにアクセスできなかった結果は同じ
=ブラウザにアタッチ出来なかった確認
までは不要な確認
て判断することも出来るよね( ´∀` )
まあ、そこまで厳密に確認が必要かどうか
👉その要件や要求次第。
どこの現場でも最初は要らないってゆーときながら、何かトラブルがあったときに
「エンジニアなら最初の要求になくても、それは、非機能要求で最初から入れとくべき(これは本来的には機能であり、非機能ではないんだが( ´∀` ))」
なんてことをゆーてくる人は多いので~~~
オイラなら安全策で
最初から入れとくけどね( ´∀` )
さてと、次回は、
StudioX時代の記事でやった、
以降の操作を順番に継続するや( ´∀` )
んだば、また来週💃
明日もお休みなので今日は夜更かし( ´∀` )
※existYouTubeReserchBarの綴りを間違えてることに気づいたので、しっかり後からソースの方は修正した( ´∀` )