2018.07.04
今回はUiPathのセレクタについてお話していこうと思います。
セレクタは少々分かりにくく、理解するのに時間がかかるかもしれません。
実際に、筆者はこのセレクタには何回も悩まされています。
ここでしっかりとセレクタについてまとめておいて一緒に理解していきましょう。
まずはセレクタとは何なのかについて見ていきます。
論より証拠ということで、実際のセレクタをまずは見ましょう。
<wnd app=’explorer.exe’ cls=’Progman’ title=’Program Manager’ />
これがセレクタです。
一体なにを言っているのかよくわからない呪文のようなものに見えます。
これを今から理解していきましょう。
私のイメージではセレクタとは処理対象がどこにあるのかを指すためのものと認識しています。
実際に、セレクタはUi elementを識別するものでありますからそのように捉えて問題ないと思います。
Ui elementという分からない単語が出て来たので見ていきます。
Ui elementとは以下のようなものです。
Ui elementはウィンドウ、チェックボックス、テキストフィールド、ドロップダウンリストなど、アプリケーションを構成するすべてのGUI(グラフィカルユーザーインターフェース)のことです。(UiPathガイド参照)
みなさんは作業の自動化などを行う際に、ウィンドウを開いたり、チェックボックスをクリックしたり、テキストフィールドに文字を入力したりすることがよくあると思います。
このようなGUIを総称してUi elementと呼びます。
このUi elementを操作するのを手助けするのがセレクタなのです。
つまり、GUIなどがどこにあるのかを探すときに、場所を教える手助けをしてくれるのです。
セレクタは多くの場合はUiPathによって自動で生成されます。
特にユーザーインターフェイスが静的に操作するものならば基本的には自動で生成されるので問題ないように思います。
先ほどから少し抽象的な話になってきていますので、具体的な例を見ていきましょう。
A | B | |
身長 | 140 | 170 |
体重 | 40 | 60 |
合計 | 180 | 230 |
このような表にある合計値を取り出す場合を考えます。
UiPathの Screen Scrapingを使うことで簡単に合計値を取得することができます。
今回はBの合計値をとりだします。
この時のセレクタを見てみましょう。
<webctrl tableCol=’3′ tableRow=’4’tag=’lbl’/>
のように書かれていました。
これは3列、4行目にあるデータを取りだしていますよという意味になります。
すこし実験してみましょう。
A | B | |
身長 | 140 | 170 |
体重 | 40 | 60 |
年齢 | 14 | 20 |
合計 | 194 | 250 |
先ほどの表に年齢の行を挿入してみました。
このまま先ほどと同じフローを実行してみましょう。
すると、合計値ではなくて20という値が取り出されました。
これは20が3列、4行目にあるデータであるからです。
合計値が欲しかったので間違ったデータを取り出してしまいました。
ではどのようにすれば変化したデータに対しても、合計値を取り出すことができるようになるのでしょうか。
こういう時に便利な機能がUiPathには搭載されています。
UiExplorerというものです。
今までは行と列を固定でスクレイピングしてきましたが、UiExplorerを使って変えていきましょう。
tableRowが固定にしてあるはずなのでそこのチェックボックスを外して、rownameの合計にチェックをいれてください。
これで行を固定にせずに、rownameの行を探してそこの列をみていくことができるようになりました。
他にも例を見ていきましょう。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’無題 – メモ帳’ />
これはメモ帳を開いた時のセレクタです。
titleのところに注目しておいてください。
このあと、このメモ帳を名前を付けて保存し、test.txtとしました。
次に、今新しく保存したテキストファイルを開いてみます。
すると、セレクタは次のように変わります。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’test.txt – メモ帳’ />
どこが変化したかおわかりでしょうか。
そうです。titleのところが無題⇒text.txtと変わりましたね。
ここまでは大丈夫だと思います。
でもメモ帳というものは新しく開いたときは必ず無題で始まります。
なので新しく始めた時にはtest.txtを見つけられず、エラーになることがあります。
このような状況でに便利なのがワイルドカードと呼ばれるものです。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
のように書きます。
titlleのところが*に変わっています。
このアスタリスクはどんな文字でも入るということで、ほかの無題以外にもtest.txtであったり、temp.txtであったりと様々なものが入ることができます。
これにより、どちらであっても操作可能になりました。
このように名前の分からないファイルを探す際に、UiPathには二つのワイルドカードが用意されています。
一つ目は先ほど使った *(アスタリスク)です。
もう一つは ?(はてな)です。
これらの違いは明確で、アスタリスクは複数の文字に置き換えられるのに対して
ハテナは一つの文字にしか置き換えることができません。
つまり、
title=test.txt
を置き換えたい場合には
title=*
は大丈夫ですが、
title=?
は置き換え不可能です。
もしもハテナを使おうと思うのならば、
title=????????
八個のハテナが必要となります。
このワイルドカードの使い道は様々で、先ほども述べた名前の分からないファイルなどを探すのに使用したり、
日付などが入っており名前が永続的に変化していくものにも対応することができます。
また、webの検索バーなどの動的なものに関してもワイルドカードを使用することで対応できると思います。
また、このワイルドカードが使われた際に複数の一致するファイルが存在する場合はどのようになるのでしょうか。
例えば、
title=*
とセレクタで指定されている場合に
title=test.txtというものと、temp.txtのふたつのファイルが対象の範囲内に存在するとします。
その場合は、一番手前にあるもの、今アクティブになっているもののみ実行されます。
つまり、UiPathが一番初めに見つけたもののみに処理を実行するということです。
最後に、セレクタの中身について少しだけ見ていきましょう。
また、メモ帳を例にして見ていきます。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
初めのwndはwindowということで要素の種類を示しています。
他にもHTMLやJavaやControlなどがあります。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
次のappはアプリケーションの名前が書いてあります。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
clsにはクラスの名前が書かれています。
<wnd app=’notepad.exe’ cls=’Notepad’ title=’*- メモ帳’ />
titleにはタイトルの名前が書かれています。
このすべてが一致しないと、セレクタはエラーとして目的のものを見つけることができません。
UiPathでの自動化をしていく上ではセレクタは切っても切れないものになると思います。
特に、レコードをする際などにエラーが出た場合などは、一度セレクタがあっているかどうかを確認するのもありでしょう。
セレクタは何回もつかっていくことで慣れていくと思うので頻繁に見ていくことをおすすめします。