1.はじめに
WEBページやExcelなどで不定期にメッセージやダイアログが表示されるために、処理が停止してしまうケースがあるようです。
定期的な事象であれば対処は容易なのですが、不定期な事象だと工夫が必要です。
解決策はいくつか考えられますが、1つとして考えられるのが
「並列処理」アクティビティの活用です。
また、類似事象の再現が難しいことがあるかと思います。
当記事では、課題として、この少し意地悪なWEBページ(html)を用意してみました。
Javascriptによるダイアログがランダムに表示される意地悪なページです。
用意したhtmlは当記事の最後に貼りました。
ご興味があれば課題にチャレンジしてみてください。
不定期に表示されるJavascriptのダイアログ が入力欄への操作を邪魔します。
「並列処理」アクティビティを使って対処してみます。
2.実際の実装した動作イメージ
実際に実装してみた処理が以下です。
複数のテキストエリアに順番に 「ひらがな」を1文字ずつ入力 していく単純な処理です。
(処理は最後まで流れることを確認していますが、長いので途中までを貼ります)
Javascriptダイアログの認識に少し時間が掛かってしまいました。このケースでは、これ以上の調整はなかなか難しそうでした。
不定期に表示される要素に応じた調整が必要になると考えられます。
この処理を抽象化したフロー図が以下です。
-
左の処理:
- 本処理の内容を実装します。
- 処理の終わりに 「繰り返しフラグ」 をOFFにします。
-
右の処理:
- 「繰り返しフラグ」 がONの間、繰り返します。
- ダイアログの要素がある場合、必要な処置をします。(「OK」ボタンをクリックなど)
3.まとめ
不定期に表示される要素に対応する解決方法の1つとして「並列処理」を使って解決するアイデアをご紹介しました。
意図的に用意した意地悪なWEBページに対する自動化を実現できることが確認できました。
実装の難しかった点、および 時間が掛かった点は 最終的な処理の調整(アクティビティのプロパティ調整) でした。
ロボット全般にも言えることですが、実行環境が変わると処理順序が変わることがある点にも注意が必要です。
処理順序に依存しないように設計できると最適ですが、意外とこれがとても難しいです。
実装環境と実行環境は合わせることをお奨めします。
似た状況に困っている方のお役に立てば光栄です。
4.補足情報
当検証においては、手軽にWEB実装を試す目的で、
Studioのプロジェクト内にhtmlファイルを保管して開くように実装しています。
ローカルにおいたhtmlを処理する場合において、
Chrome/EdgeのUiPath拡張機能に設定をしておく必要がありますので手順をご紹介します。
以下、UiPathブラウザ拡張機能へローカルファイルURLにアクセス可能にする設定です。
「ファイルのURLへのアクセスを許可する」 をONにする必要があります。
「ファイルのURLへのアクセスを許可する」設定手順。
1.ブラウザ上部のパズルのピースのようなアイコンをクリックします。
2.UiPathのブラウザ拡張機能が表示されるので、右端の3点リーダーをクリックします。
4.設定の下の方の「ファイルのURLへのアクセスを許可する」のトグルをONにします。
検証に使ったhtmlコードはこちらです。
以下の内容を sample.html としてプロジェクト内に配置して検証しました。
ご利用の際は自己責任でお願いいたします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>UiPath Studioの並列実行テスト用</title>
</head>
<body>
<p>ランダムにダイアログが表示される!</p>
<p>ダイアログ表示ON/OFF
<input type="checkbox" id="check" />
</p>
<BR>
入力欄1:<textarea id="text1" cols="20" rows="2" ></textarea> <BR>
入力欄2:<textarea id="text2" cols="20" rows="2" ></textarea> <BR>
入力欄3:<textarea id="text3" cols="20" rows="2" ></textarea> <BR>
入力欄4:<textarea id="text4" cols="20" rows="2" ></textarea> <BR>
入力欄5:<textarea id="text5" cols="20" rows="2" ></textarea> <BR>
<BR>
<input type="text" id="time" style="color:#BBBBBB;" readonly />
<script>
// ランダムにダイアログを表示する。
function exec() {
// チェックボックスのチェックを確認する
if(document.getElementById("check").checked ) {
// 秒単位のランダム値を生成。
var random = Math.floor( Math.random() * 5000 + 5000 );
// ブラウザの開発ツールでのデバッグ用
console.log(random);
var text = "次は…" + random + " ミリ秒後!";
document.getElementById("time").value= text;
window.setTimeout(function(){
alert("不定期に表示されるダイアログです。 " + text );
// 次のランダムを実行。※処理は終わらないので注意。
exec();
}, random);
} else {
// 未チェックの場合の処理: 5秒間SLEEPして処理を開始するか再チェックする。
window.setTimeout(function(){
exec();
}, "5000");
}
}
// 読み込み時に実行する。
window.addEventListener('load', function(){
exec();
});
</script>
</body>
</html>