読込完了待ちのバランスポイントを見出したい
※ 最下部にサンプルソースを追記しました
※ ネット上の、イメージに近いサンプルの情報も載せました
WebDriver制御のブラウザ操作シナリオで、読込完了待ちにてこずってる箇所があります。
試行錯誤を経て、★の暫定措置で「値の取得」のスパルタ式にしましたが、懸念が残ってます。
深掘ったところ、スクロールバーの出現をキャッチすれば不安が拭えそうな感じです。
ズバリかアイデアかヒントが欲しいです。
手が届く方法で最速なら、別案でも構いません。
みなさまのお知恵を拝借させてください。
環境
- WinActor721 or 740
- Chrome9x
シナリオ概要
- CSVのIDリストを順に検索
- 2システムから計数百項目を主に「値の取得」
- CSVに出力
少し工夫してあること
- 「要素数取得」で0なら「値の取得」の変数に0を格納し、「値の取得」自体はスキップ
- ページ内に存在しないブロックはブロックごとスキップ
- いずれも時短に繋がってる
困ってること
- 「値の取得」に失敗する案件がある
症状
- ブロックが存在して項目も値もあるのに、ブロック内の「値の取得」の変数に軒並み0が入っちゃう
画面遷移
- システムA:2ページ
- システムB:8ページ
症状がある箇所
- システムBの2ページ目、5ブロック中の1ブロック目のみ
- システムBはAngularJSが使われてて、これまでも数か所で苦戦を強いられてきた
https://www.google.com/search?q=AngularJS
検知のきっかけ
- 利用部署から取得できてないことがあるとの申告
該当箇所前後の動き
- 1ページ目の検索結果リストから目的の行の参照ボタンをクリック
- 遷移した2ページ目の画面で要素の値をたっくさん取得する場面
すでに講じてあった対策
- 2ページ目のBODY最上部からタイトルのテキストを取得することで、読込完了を担保していたつもりだった
- 案件を表示できない場合のポップアップアラートがある場合もキャッチしてスキップできていた
同じIDで10周回してみた結果(該当ブロック内のみの観察メモ)
- 1、2:全項目が0
- 3、4:前半3/4が0、後半1/4が正しい値
- 5、6、7: 全項目が0
- 8:前半1/2が0、後半1/2が正しい値
- 9: 全項目が0
- 10:全項目が正しい値
見立て
- 10周目に近いほど正しい値を取得した
- キャッシュのおかげで読み込みが速くなった?
- それにしては9週目が全項目が0
試したこと
- 各所に待機ボックスを仮置き
- 状態変化待機(要素):最下部の戻るボタン
待機ボックス
→ 参照ボタンをクリックして、画面遷移直後に待機ボックスが表示された
→ 画面遷移直後にBODY内のほとんどの要素(=フォームやテーブル)は表示される
→ 1秒前後でフォームやテーブルに値が反映される - 後判定繰返
有効無効状態取得:戻るボタン
待機ボックス
→ 同上 - ※「読込完了待ち」は拡張機能制御用とのことで未テスト
特定したこと
- フォームやテーブルに値が反映された後、3秒強は読み込み中のぐるぐるがある
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSTF3Tbds9UT5Tpp1AnKGdUgY9BvXYe0iKVMA
上中央の絵とほぼ同じ - ぐるぐるが終わってからなら、「値の取得」に100%成功するっぽい
★暫定措置
- 必ず存在するブロックの項目で値が取得できるまでループで待つスパルタ式が順当か
- これで成り立つならRPAの旨味
- 同じIDで10周回す限り、10回ともブロックの全項目で正しい値を取得できた
懸念
- 人はぐるぐるが終わるのを待つ
- ホントにRPAの旨味を活かしちゃって良いものかどうか、、
- ぐるぐるは4秒強で終わることがほとんど
- 「指定時間待機」で充分に余裕を持たせれば、「値の取得」の精度は上がりそうではある
- これまではなるべく「指定時間待機」を使わずに、スパルタ式で最速と安定を両立させてきた
- 5秒にしてビクビクを抱えたままでいたくない
- 余裕を持たせて10秒にしたところで、重いタイミングではやっぱり溢れちゃうはず
- できればぐるぐるの終了をキャッチしたい
5分だけ挌闘したうえでの現状認識
- 4秒強の間にぐるぐるの要素を特定して対策を講じるのは難しそう
- DevToolsのNetworkタブあたりの出番なのだろうか
模索中の代替策
- ぐるぐるが終わると同時に縦スクロールバーが表示される
- スクロールバーの出現をもって次に進めないか
- ひとまずVer.7.4のブラウザ関連には、それらしきライブラリは見当たらず
- サンプルシナリオのように「画像マッチング」を使えば一応成り立ちそうではある
https://www.google.com/search?q=WinActor+ブラウザ+スクロールバー - 「画像マッチング」も「指定時間待機」と同じく積極的に排除してきた経緯がある
- やはりなるべく「画像マッチング」も使わずにクリアしたい
- スクロールバーはBODY内じゃないからさすがにXPathでは届かなさそう
このへんからはリサーチとかテストに踏み込めていません。
- WIN32とかUI AutomationでならChromeのスクロールバーをキャッチできるのだろうか
- JavaScriptでウィンドウの生成時にスクロールバーの有無を制御したことがある
- JavaScriptならスクロールバーの有無をキャッチできたりするのだろうか
- あるいはWebDriverでもbusy+readyState相当があって、キャッチすれば今回の症状にも有効なのだろうか
https://www.google.com/search?q=読込完了待ち+busy+readyState
(2022/12/15追記)
Web上でイメージしやすいサンプルを見つけられず、文字でも伝わりにくいので、サンプルのソースを用意しました。
目的
- 最速で確実に「値の取得」する
現在目指してる手段相当
- 表示ボタンのクリックで表示されるスクロールバーの出現をキャッチ
実際
- クリック ≒ ぐるぐる出現 ≒ あいうえおの枠表示(ほぼ同タイミング)
- あいうえおが表示(約1秒後)
- ぐるぐる消滅 ≒ スクロールバー表示(約3秒後)
- ぐるぐるもダミーで作れなくもないものの、実際のしくみではないのであんまり意味がない
- ブロック内の表とかとかぶってるし、ぐるぐるしてるので、画像マッチング系ではきっと捕まえにくい
- 画像マッチング系の上位機能として映像マッチングが提供されれば、捕まえようがあるのかも
- 上にかぶさってるぐるぐるレイヤーの要素が消えるのを「状態変化取得(要素)」で捕まえられれば理想
使いかた
- メモ帳にコピって、UTF-8で「クリックで結果的にスクロールバー表示.html」として保存
- Chrome等で開く
ソース
<!DOCTYPE html>
<html lang="ja"><head>
<meta charset="UTF-8">
<title>クリックで結果的にスクロールバー表示</title>
</head><body>
<input type="button" id="1" onclick="switch1(1)" value="表示">
<input type="button" id="0" onclick="switch1(0)" value="非表示">
<p>
<div id="aaa" style="height:2000px; width:300px; border:solid 1px; display:none;">
<span id="aaa1">あいうえお</span>
</div><script>
function switch1(num) {
let elm = document.getElementById("aaa")
if (num == 0) {
elm.style.display="none";
} else {
elm.style.display="block";
}
}</script>
</body>
</html>
(2022/12/19追記)
ここのデモページの動きが実際の画面にとても近いです。
jQueryでページ読み込み中にローディング画面を表示する方法 | Gimmick log
https://gimmicklog.com/jquery/278/
https://gimmicklog.com/demo/loading/loading.html