ocomojiのナレッジ

Edgeアップデートにより『名前を付けて保存ボタン』のセレクタが取れなくなった件
(セレクタが不安定な要素をクリックする方法)

紹介

こんにちは、ocomojiのエンジニア、Kです
最近、Edgeの自動アップデートによりダウンロードファイルの『名前を付けて保存』のセレクタが不安定になり、ロボが停止しました
その際の対応についてご紹介します

アンカーベースやUI Explorerを用いての対応が難しかったので【座標】での対応を紹介しております
この方法を用いればEdgeに限らずセレクタが不安定な要素をクリックできるようになります
※UiPathでの作成となります

AsIs

UiPathを使用してEdgeでダウンロードファイルの『名前を付けて保存』のクリックができない
(名前を付けて保存をクリック: このセレクターに対応する UI 要素が見つかりませんでした のエラー)



アップデート前は『名前を付けて保存』ボタンのみを選択できた


アップデート後は『名前を付けて保存』ボタンのみを選択できず、リストごと選択されてしまう

ToBe

UiPathを使用してEdgeでダウンロードファイルの『名前を付けて保存』のクリックを実現
『座標』を活かして対応する

事前準備

UiPath、Edge、メモ帳
 ※私の環境
  UiPath Ver:2022.10.3
  Edge Ver:114.0.1823.43 64bit

開発目次

  1. Edgeの初期設定
  2. UiPathのコーディング

1.Edgeの初期設定

Edgeの初期設定を行う
今回はセレクタ選択ができず座標での対応となるためこの設定が必要となる

  1. ダウンロードメニューをピン留め


  2. 設定画面を起動
     ・外観 → ダウンロードボタンをON
     ・ダウンロード →
            ダウンロード時の動作を毎回確認するをON
            ダウンロードの開始時にダウンロードメニューを表示をON


2.UiPathコーディング

ワークフローの画像は縦長になるためこちらより確認
 ワークフロー
 使用変数

  1. アンカーとなる要素を基準にターゲット要素の相対位置を取得

    ①コメントアウトアクティビティを設置
     セレクタを取得できるアクティビティであれば何でもよいので、内部に2つ設置
     (ここではGetPositionを使用)


    ②1つめのアクティビティよりUi Explorer起動 → 要素を選択
     アンカーとなる要素を選択(ダウンロードボタン)
     Ui Explorerのプロパティ画面にpositionの値が2セット表示されているので、左側の値をメモ
     (3610,36)
     Ui Explorerを終了(保存はどちらでもOK)





    ③名前を付けて保存ボタンの位置と重なるようにメモ帳の最小化ボタンの位置を合わせる
     2つめのアクティビティよりUi Explorer起動 → 要素を選択
     ターゲットとなる要素を選択(メモ帳の最小化ボタン)
     Ui Explorerのプロパティ画面にpositionの値が2セット表示されているので、左側の値をメモ
     (3586,192)
     Ui Explorerを終了(保存せずにOK)




     勘の良い方はここで何をやってるか・これ以降で何をやるかピンときたかと^^;

  2. 変数初期化

     ①soutai_pos_x:アンカー要素からの相対位置までの差分X座標
      3610 - 3586 = 24 のため24をセット
      ※両者のX軸は大体同じ位置にあるため0でもよい
     
     ②soutai_pos_y:アンカー要素からの相対位置までの差分Y座標
      36 - 192 = -156 → 反転させて156をセット
      ※36より-156の位置だと、ターゲット要素はアンカー要素の上を示すため
       -ではなく+に反転させて下を示すようにする

  3. Edgeブラウザを起動

     ①ウィンドウを最大化アクティビティを設置しておく
      サイズを固定しておかないと環境により相対位置が崩れる可能性がある


  4. アンカー要素の座標を取得

     ファイルDL → 名前を付けて保存 の処理を繰り返す場合は毎回アンカー要素の座標を取得する
     順1で座標を取得済のためループに組み込む必要はない。と思うかもしれないが
     ポップアップや突発的な現象で順1の座標とズレが生じる可能性を考慮してこのように組み込む
      ①GetPositionアクティビティを設置
      ②要素を選択してセレクタを取得(Edgeのダウンロードボタン)
      ③出力値に変数ank_posをセット
       ※ank_pos:アンカー要素の座標

  5. 名前を付けて保存ボタンをクリック

     ①Clickアクティビティを設置
     ②カーソル位置のXとYに以下の計算式をセット
       X:ank_pos.X + soutai_pos_x(3610 + 24)
       Y:ank_pos.Y + soutai_pos_y(36 + 156)

    この処理でアンカー要素(ank_pos)からの相対位置(soutai_pos_x,y)をクリックするが
    この位置が メモ帳の最小化ボタン = 名前を付けて保存ボタン となるわけである




座標以外での対応について

他の対応方法(案)としては以下が挙げられる
 1.アンカーベースを使用して要素クリック
 2.UI Explorerを使用して要素クリック
 3.Edgeダウングレード&自動アップデート停止
これらを試した結果、3のみが有効打となった

  1. アンカーベースを使用して要素クリック
    アンカーベースでアンカー要素を選択したところ・・・
    肝心の要素(名前を付けて保存)を選択できないため使えず(泣)

  2. UI Explorerを使用して要素クリック
    いじくっていると名前を付けて保存ボタンを選択できるようになる
    しかもクリックも正常に動作する!!が、Edgeを再起動すると反応せずエラー(泣)
    ※この一時的にセレクタを取得する技は次章へ後述

  3. Edgeダウングレード&自動アップデート停止
    ロボの改修不要のため最短の方法かと思う
    が、あくまで応急対応だということを意識してほしい
    自動アップデートを停止するということはEdgeの脆弱性を放置して使用している。ということ
    セキュリティ面を考えるといずれはロボの改修が必須である
    Microsoft Edgeのダウングレード方法について(外部サイト)

UI Explorerを使用して一時的にセレクタを取得する小技

UI Explorerで階層を展開していき要素を探した経験はあるだろうか?
セレクタが不安定な要素は、階層を展開しても見つからない場合がある
ここではセレクタが不安定な要素でも素早く探せる方法を紹介する

  1. UiExplorerを使用できるアクティビティを設置(何でもOK)
    UiExplorerを起動 → 要素を選択 → ダウンロード一覧をクリックして選択





    このように左のビジュアルツリーに階層がいくつもあり『名前を付けて保存』を探すのに時間を要する
    ちなみに、探しても見つけることができなかった・・・

  2. 現在の階層位置より下に"document"と"pane"があるので"document"をダブルクリック
    すると、右下のセレクタが書き換わる


  3. 右下のセレクタの最下部に以下のセレクタを追加
     
     <ctrl name='名前を付けて保存' role='push button' />
    									 



  4. 検証ボタンを押下

  5. 検証ボタンが緑になり、ビジュアルツリー・現在の階層・左下のプロパティなどが更新される
    強調表示を押すと『名前を付けて保存』ボタンのみが選択されるようになる
    つまり『名前を付けて保存』のセレクタの取得に成功している状態である
    この状態でプロパティよりposition値を取得すればメモ帳を使わずに済む






    ちなみに、順3で追加するセレクタが肝で、nameやroleなどへセットする名称や値の規則性さえ掴んでしまえば、自動で該当セレクタを見つけるので階層ポチポチで探すよりも効率が良いかと思う
    (規則性など難しく考えずに勘で試すのもあり。私は煩わしかったので勘で入れたら動いた笑)

    ※一時的にはセレクタを取得できるがEdgeを再起動したら元通り認識しなくなる

余談

  1. アップデート後のEdgeに対応したUiPath修正版がリリースされ次第、元通り要素を選択できるはず
    座標クリックよりもセレクタで認識させた方が無難ではある

  2. 今回の『メモ帳を代替しての座標取得』を活用できる機会はほぼない・・・かな
    ただ、アンカー・相対要素・座標・UiExplorerの勉強にはなった
    特にUiExplorerについてはまだフルで活かせてない所がある。まだまだ勉強が必要だと感じた

  3. 未経験者や後輩あるいはUiPathとは関係ないシステムからでも、さりげない一言や情報がヒントになることが多々ある
    『座標』についても元を辿れば、UiPathとは関係ないHTMLの知識から着想を得たものだ
    (以前、画像にテキストリンクを埋め込む際に座標を使用したことがある)

    今までRPAとは異なる業界で培ってきた知見が無駄にならず、このような場面で活かせて良かったと思う