見出し画像

【いきなりStudio22】(実践編)[UiPath✖YouTube]ライブラリでガチろう~アプリケーションを開く/閉じるのついでに先にライブラリの説明をば( ´∀` )

さてと前回、

の最後で、

てな感じで

て予告をしていたんだけど、アタッチの詳しい組み込み方は、次回説明するが

実際に、いきなりブラウザのアタッチだけ組んで、Edgeが閉じた状態で実行すると、

エラー発生( ´∀` )

理由は簡単で、

ブラウザーのアタッチアクティビティには、
ブラウザを開く機能まではないから
👉(既に開いてる)既存のブラウザに
アタッチしに行って、
何かその後の処理をしてくアクティビティ

開いてないブラウザにいきなりアタッチしても、
そらエラー起こるわ( ´∀` )

なので、今回は予定変更で先に、WEB操作をするロボットではよく使う

  • アプリケーションを開く

  • アプリケーションを閉じる

アクティビティについて触れながら、

ライブラリの考え方

まで説明してく💃
んだば、早速

今回のアクティビティ

で詳細はココを確認してほしいけど、内容薄いので~~~( ´∀` )
実際に操作していこう( ´∀` )

今回使うソースファイル:RobotMain.xaml

コイツな

基本操作

操作自体はめちゃくちゃ簡単で

灰色になってるアクティビティを
てな感じでReadYouTube.xamlを呼び出しの前にセット
てな感じで、まっさらなEdgeを開いておいて
画面上でウィンドウを指定をクリック
画面全体が戻りになっている状態でクリック
右端の三マーク>UIExplorer開くをクリック
左上の検証が緑になっている
👉セレクターの要素がしっかり取得できてる

この画面で表示されてるタグを見ると、

<html app='msedge.exe' title='新しいタブ' />

って感じで

title='新しいタブ' /

になっているけど、Edgeの今後の仕様変更なんかで、必ず、Edgeを開いた初期状態で新しいタブってタイトルのタブが開くとは限らない。
👉別にタイトル自体は要らないんだけど、残しておいても問題ないので、

ワイルドカード:*
(*部分は何でもOKな
ババ抜きのババみたいなもん)

を使って

<html app='msedge.exe' title='*' />

に変更。

左上がオレンジになったので、オレンジをクリック
緑になったので問題なしまで分かれば
保存ボタンで閉じる

同じ要領で

アプリケーションを閉じるアクティビティ
今度はReadYouTube.xamlの後にセット
基本の流れを説明優先で一旦、
<wnd app='msedge.exe' cls='Chrome_WidgetWin_1' title='*' />
<ctrl name='新しいタブ - Microsoft Edge' role='pane' />
<ctrl name='閉じる' role='push button' />

てな感じで~~~

ファイルをデバッグしてみると、

てな感じで、Edgeが開いて、閉じられて
正常終了

念のため、複数のEdgeを別ウィンドウで立ち上げて再実行してみよう

既に2つ開いてる状態で実行

すると、正味3つのEdgeが開くはずなんだけど、実行

ハイ、綺麗に全て閉じましたと( ´∀` )

ここでポイント①:ブラウザを開く、閉じるって、WEBを扱うロボットでは普通に何回もやりそうな操作

なので、前回でも話した

オブジェクト指向言語の旨味=再利用

で、

いちいち同じアクティビティを直で組むのは、
非効率的

なので、そんなときは

ワークフローとして抽出をクリック
てな感じで出てくるので~~~
てな感じの名前に変更して、作成をクリック
さっきのアクティビティがワークフローとして独立した
RobotMain.xamlは自動的にワークフロー呼び出しアクティビティになった( ´∀` )
プロジェクトパネルだと下から2番目に
.xamlファイルが追加出来た
アクティビティの名前なんかが気に入らないので~~
てな感じでリファクタリング

アプリケーションを閉じるも同様に、

ワークフローとして抽出
てな感じで名前を変更>作成をクリック
てな感じで
てな感じ

で、コイツらは、他のロボットでもよく使う可能性が高いので~~~

一旦、Open_Edge、Close_Edgeのタブは閉じる
閉じた
プロジェクトパネルの空欄部分で右クリック
追加>フォルダの順でクリック
名前にLibraryを入力>OKをクリック
Libraryフォルダが出来たのを確認

Open_Edge.xaml、Close_Edge.xamlファイルを今作ったライブラリフォルダに移動

てな感じ
てな感じでRobotMain.xamlのワークフロー呼び出しアクティビティのパスも変更されたことを確認

で再び、ファイルをデバッグしてみると、、、

ハイ、問題なし。

ここまでが基本

実践:エラーまで想定して、トライキャッチなんかでお色直し

■Open_Edge

てな
てな
感じ

■Close_Edge

てな
てな
てな感じ

で、今回から直接RobotMain.xamlにエラーを返す.xamlファイルの呼び出しが追加されたので

■RobotMain.xaml

てな
てな
てな感じ

でRobotMain.xamlに引数が増えたのでMain.xamlも変更

■Main.xaml

てな感じで

ココは引数を特に受け取らないので、引数をインポートで引数のみ追加

てな感じ

※普段の実際の組み込み同様に、ここまでのソースで気になる所はここから都度微調整しながら進む💃

例えばOpen_Edgeの要素を確認に、ブレークポイントを設定してファイルをデバッグで実行

要素が確認出来ない場合にエラーになる想定
てな感じ
Edgeが開いた状態で
止まってるので、Edgeを閉じて、続行
てな感じで、エラーが発生するけど、
エラーメッセージなし💃

Close_Edgeの要素確認でブレークポイントを設定して、ファイルをデバッグを実行

ココな
ココまででEdgeは全部閉じてるはず
それを敢えて開いて続行
想定どおりまずは、閉じていない場合に入り、
続行していくと、、、
ハイ、想定通り

ここでポイント②:Edgeを閉じる操作の方が実は重要

で、

て書いた通りなんだけど、

複数のブラウザが開いていると、

👉同じブラウザとか同じ画面を複数開くことになる=後続の処理でセレクターが取れない

異常終了=バグの原因

てことがあるので、今はRobotMain.xamlでブラウザを開く方をはじめに持ってきてるんだけど、

変更前

👉最初に開く前にブラウザ操作の前に、
余計なブラウザを閉じるのが普通

てな感じ

例えば、UiPath実行用の端末にしてる場合でも

  • 誰かが知らずにEdgeを開きっぱなしにしてる

  • 更新プログラムの更新後の確認かなんかで、何かしらEdgeが自動的に開いたままになってる

なんてことがあるから

処理の最初にEdgeを閉じてから開き直す

で、実際に実行でやってみると実は

エラー発生。

なぜかと言うと、

Edgeが開いていないのに、
Edgeを閉じようとしてるから( ´∀` )
👉Edgeを閉じる操作の前に、要素を確認して、
Edgeが開いてる場合だけ、アプリケーションを終了する操作をしないといけない
ってこと( ´∀` )

このUIExplorerを開く
基本操作で一旦、でスルーした箇所
<wnd app='msedge.exe' cls='Chrome_WidgetWin_1' title='*' />
<ctrl name='新しいタブ - Microsoft Edge' role='pane' />
<ctrl name='閉じる' role='push button' />

これも新しいタブって名前のタブがないと要素が確認出来ないので、このままだとエラーになる可能性あり( ´∀` )なんでついでに直す

<wnd app='msedge.exe' cls='Chrome_WidgetWin_1' title='*' />
<ctrl name='閉じる' role='push button' />

に変更して、

左上のオレンジをクリック
てな感じでまずは要素は取得出来たので~~~

要素の確認で、この要素が取得出来た場合だけ、Edgeを閉じるように要素の確認を追加( ´∀` )

追加して~~~
てな感じでタグを編集して
edgeCloseButtonて変数を追加
Booleanで設定
これまでの処理をEdgeが開いている場合、
シーケンスを新たに追加して格納

で、Elseに

てな感じで

さらに、ちょっと正常終了のメッセージを誤っていたので

てな感じで修正

改修後のClose_Edge.xamlファイル全体としては、

てな感じ

ファイルをデバッグすると、

ホイ、実行出来た( ´∀` )

※まあこれだけだと、実は、確認メッセージなんかが出た時にうまく閉じれない可能性があるんだけど、自動実行専用のPCなはずなのに、確認メッセージまで必要な操作を手作業でやってブラウザを開きっぱなしにしてる方が悪いのでそこまではやらない。

👉どうせ想定外エラーでコケるから( ´∀` )

てか、そこまで考慮してたら、どんなセレクターが出てくるか全部は分からないのでキリがない
👉開いてるWEBサイトごとに動きが異なるので網羅出来ない

で、最後に今回Libraryフォルダに格納した、ふたつの.xamlファイルは他のロボットでも使うかもしれないので~~~

今回のフォルダからコピー
上の階層に単独で貼付け

ここでポイント③:SourceTempleteとLibraryの違い

  • SourceTemplete:全ロボット共通で使う機能

  • Library:全ロボット共通ではないが、よく使う機能のみ

の違いだけ( ´∀` )つまり、手順としては

  1. 今後作る色んなロボットの機能の内、よく使いそうな.xamlファイルをLibraryフォルダに放り込んでおく

  2. Libraryフォルダごと各ロボットのソースフォルダの中にコピーして追加

  3. 使う奴だけLibraryフォルダの中に残す

だけ~~~

ここでポイント④:ライブラリの.xamlファイルはConfigファイルに外出ししないの❓👀

ここまでの手順はあくまでも、
Library機能を作る例を見せてただけなので~

まあ、これも人や状況によりけりなんだけど、読み込むConfigファイルの中に必ず全てのキーが網羅出来てるとは限らない

👉もし盛り込めてないと、
余計なエラーの原因になる

Libraryフォルダから呼び出して、

ソースを改修し終わった後にやる方が良い
( ´∀` )
👉組み込み中に外出しまでやってたら、
何をしていたか分からなくなるんで~~~

内容としては以上。

ソース・リファクタリング:セレクターまで含めてConfigに外出し後

■Main.xaml👉今回引数のみインポート

■RobotMain.xaml👉今回改修あり

■ReadConfig.xaml👉今回改修なし

■Open_Edge.xaml👉今回新規

Configファイルのキー読み込み用の
OpenEdgeConfig引数を追加した

■Close_Edge.xaml👉今回新規

Configファイルのキー読み込み用の
CloseEdgeConfig引数を追加した

■ReadYouTube.xaml👉今回改修なし

これでアタッチの前まで説明したいことは
盛り込めた( ´∀` )はず

さてと、次回は、

アタッチから説明に入ってく💃
んだば続きは、また次回

いいなと思ったら応援しよう!