UIオートメーションのコントロールパスについて
いつもお世話になっております。
さて、題記の件ですが現在SAP S/4の自動化に向けてシナリオ作成中です。
SAPを操作する際、UIオートメーションで制御できる箇所が複数あるのですが、
このコントロールパスの途中に{"id":"xxxxxx","index":"0"}という部分がありSAPを起動するたびにxxxxxxの部分が変わります。
幸いにも変化するのはこの1か所だけなので、この要素のみ他の属性で指定してやることで問題は回避できました。(属性という表現であってるのでしょうか)
本題ですが、コントロールパスの書き方について考え方をご存じの方がいらっしゃれば教えていただきたいです。
現状、UIオートメーションのプロパティ画面で「対象コントロール指定」で要素を選択すると、目的の要素までのほぼ全ての要素がパスに記載されます。XPathでいうところの完全XPathみたいな感じです。
これを目的の要素、あるいはその近辺のみ記載するように短縮できないでしょうか。
【現状】 (見やすいようにカンマで改行してます)
{"nodes":[
{"controltype":"Custom","index":"0"},
{"controltype":"Pane","index":"0"},
{"id":"CanvasWinFormsHost","index":"0"},
{"id":"xxxxxx","index":"0"}, ←ここは{"controltype":"Pane","index":"0"}に置き換えて回避済み
{"controltype":"Pane","index":"0"},
{"index":"0","name":"User Management, SAP AG"},
{"index":"0","name":"User Management, SAP AG - Web コンテンツ"},
{"controltype":"Pane","index":"0"},
{"controltype":"Pane","index":"1"},
{"controltype":"Pane","index":"0"},
{"controltype":"Pane","index":"1"},
{"controltype":"Pane","index":"0"},
{"controltype":"Pane","index":"0"},
{"id":"RootWebArea","index":"0"},
{"index":"0","name":"Branding Image ユーザ * ユーザ * パスワード * ログオン 中止 Copyright © SAP AG. All Rights Reserved. SAP AG"},
{"index":"0","name":"ユーザ * ユーザ * パスワード * ログオン 中止 Copyright © SAP AG. All Rights Reserved. SAP AG"},
{"index":"0","name":"ユーザ * ユーザ * パスワード * ログオン 中止 "},
{"index":"0","name":"ユーザ *"},
{"id":"logonuidfield","index":"0"}
],"version":"2"}
【理想】
{"nodes":[
{"id":"logonuidfield","index":"0"}
],"version":"2"}
logonuidfieldというidは今回のページではユニークで、ほかに同じIDを持つ要素はありません。
(そもそもid属性ってユニークになるよう設定するものではありますが)
試しに理想の方のコントロールパスで実行してみたらエラーになりました。
これがWebシステムでXPathだったら//input[@id="logonuidfield"]と書くはずなので、同じように省略できるところは省略できないか、というのが主題です。
操作マニュアルの4.9項は一通り見てみましたがコントロールパスの記法については解説が無かったように思います。
【補足】
ちなみにSAP S/4はWebベースになったようで、設定でどのブラウザコントロールを使用するかが選べますが、アプリ側の仕様なのか弊社のポリシーなのか、ブラウザ(Edge)からURLを叩いてログインしようとするとクライアントが不正というメッセージが出て弾かれます。
UIオートメーションで操作する際のウィンドウ識別ルールを見るとプロセス名はNWBC.exeとなっており、WebDriver経由(のEdge)で起動できないためXPathによる操作は今のところ不可能と判断しています。
WinActorのバージョンは7.5.0、OSはWin11です。
欲を言えばXPathのContains関数みたいに「nameに〇〇を含む」みたいな指定も出来ると嬉しいですね。