自作RPAで丸二日ハマった(汗)

先日、RPAをExcelマクロで自作しようと思い立ってから、プロトタイプらしいものが出来上がりました。

で、そのプロトタイプを業務担当者に説明するためにデモしてみたところ、、、
「何だコレ!画面が勝手に動いてるじゃないですか!」
「すごい画期的ですね!」
「これ取り入れだしたら、今までの業務の在り方が崩壊するレベルですよ!根本的にやり方が変わりますね!」

という、プロトタイプの時点で大賛辞の雨あられ状態。

いやー、そんなに喜んでもらえると、こっちもやりがいがあるというもんです。

RPAツールに比べて開発に時間がかかるというデメリットはありますが、一方で、自作する方が自社の業務への適合率がより高まるというメリットがあります。
また、一連の操作を記録してそれをなぞるように実行することが基本のRPAツールに比べて、自作RPAの方が高速に画面操作が行えます。

さて、そんなイベントを経て実用化に向けて実装を進めているところですが、思わぬところで行き詰りました。

それはズバリ、「ファイル選択ボタンの操作」です。
具体的には、HTMLの「input type=file」ですね。

操作の流れとしては、こうです。

①A画面のファイル選択ボタンを押す
②ファイル選択ダイアログでファイルパスを入力
③A画面にファイルパスが貼りついた状態で、更新ボタンを押す


という、手動なら何の変哲もない操作なんですが。。。

ここで2つの問題にぶち当たりました。

1.ファイル選択ダイアログにどうやってファイルパスを入力するか

ファイル選択ダイアログは当然IEのオブジェクトではないので、ファイルパス入力用のテキストボックスにどうやってパスをセットするかで、ハマりました。

2.更新ボタンを押してもSubmitされない

上記のファイル選択問題が解決した後、いざ更新ボタンを押してみると、何も反応が無い・・・(汗)
(当然、手動で操作すれば普通にSubmitされます。)

スポンサーリンク


では、私が丸一日かけて編み出した解決策をご紹介します。
ま、編み出したとは言っても、ググった結果をかなり参考にしましたが。(笑)

1.ファイル選択ダイアログにどうやってファイルパスを入力するか

ファイル選択ダイアログを直接操作する方法は、残念ながら存在しません。
また、ファイル選択ダイアログを使わずに、テキストボックス部にファイルパスを直接セットすることもできません。
なので、ちょっと作りはいびつになりますが、下記の方法で対処。

①DataObjectを使って、予めファイルパスをクリップボードに入れておく
②参照ボタンを押して、ファイル選択ダイアログを起動
③ファイルパスの部分にフォーカスが当たっているので、SendKeys「Ctrl+V」で①のパスを貼り付ける
④SendKeys「ENTER」でファイル選択ダイアログの「開く」ボタンを押す

これで、テキストボックス部に無事ファイルパスを貼り付けることができます。


2.更新ボタンを押してもSubmitされない

原因は、ファイル選択ダイアログの「input type=file」のタグにて、onfocusとonblurでスクリプトが呼ばれていたためです。
なんせ基幹システムのパッケージの作りまでは詳細は分からないため、この原因を特定するだけで半日ほど費やしました。

当初、ファイル選択ダイアログの参照ボタンを押す際には、objIE.document.getElementById("sansyo").clickという感じのソースでボタンをクリックしていました。
が、これだと参照ボタンに対するonfocus・onblurイベントが働かず、その際に本来呼ばれるはずのスクリプトが実行されないということが分かりました。
残念ながら、そのスクリプト内でどのような処理が行われているかまでは解析不可能でしたが、ともかくonfocus・onblurを作動させながら参照ボタンを押すために、いくつかの方法を試行してみました。
(この事例はググっても全くヒットせず、我流でやるしかありませんでした・・・)

①Focusで参照ボタンにフォーカスを当ててからクリックしてみる

objIE.document.getElementById("sansyo").Focusで参照ボタンのオブジェクト"sansyo"にフォーカスを当ててから、clickしてみることにしました。
しかし、、、どうやら参照ボタンにはFocusを使ってもフォーカスが当たらないらしく、何も解決しませんでした。

②TAB遷移で参照ボタンにフォーカスを当ててからクリックしてみる

まず直前の項目にFocusでフォーカスを当て、そこからTABで参照ボタンにフォーカスを遷移させる方法を試してみたところ、見事に参照ボタンにフォーカスが当たりました。
が、喜んだのも束の間。
参照ボタンをclickしてファイルパスをセットし、いざ更新ボタンを押してみると・・・なんと事象変わらず。(死)
結果から考察すると、参照ボタンにフォーカスが当たっていようといまいと、clickでボタンを押す限りonfocus・onblurは判定されないと言えそうです。

③mouse_eventで参照ボタンを「マウスで押す」

最終的に行き着いたのがコレ。
フォーカスを当てるだの当てないだのはかなぐり捨てて、手動と全く同じようにマウスカーソルで参照ボタンを押してやろうという試みです。
ただ、参照ボタンの正確な座標を知る必要がある上、毎回同じ位置に参照ボタンが表示されるように工夫する必要があります。

なので、仕方なくこうやって対策しました。
(1)画面を左上端に強制的に移動させる(X座標=0、Y座標=0)
   参照ボタンが毎回同じ座標に表示されるようにするため。
(2)参照ボタンの座標にマウスカーソルを移動し、左クリックのイベントを実行する
   事前に(1)状態での参照ボタンの座標を特定しておくこと。

ミッションコンプリート!(号泣)
ハマった時間が長いだけに、達成感もひとしおです。

一応、IEオブジェクトのプロパティにはoffsetTop・offsetLeftなるものがあり、これでもオブジェクトのX座標・Y座標は取得できるらしい。
が、こいつらときたら、画面左上端からの絶対座標ではなく、「BODYタグからの相対座標」という殺意すら覚える糞仕様のため、こっちは使いませんでした。

BODYタグの位置ってどこよ?
分かり辛いわ、そんなもん。

ということで、最大の難関を乗り越え、何とか実用化への目途がつきました。
現場の反応や実装面での問題点などまた動きがあれば、ブログで紹介していきたいと思います。



還元率の高いポイントサイトで、ハイペースでポイントが貯まります ポイントサイトのポイントインカム

獲得ポイントの高いアンケートサイトで、効率的にポイントが貯められます infoQ新規会員登録

コメントの投稿

非公開コメント

プロフィール

Author:たみおと
36歳にして社内SEに転職しました。
ベンダーSE・社内SEどちらの方が記事を読んでも、ご参考になる体験談をUPしていきたいと思っていますので、宜しくお願い致します。

検索フォーム
ブログランキング
よろしければ、ポチっと一押しお願いします。m(__)m

ブログランキング・にほんブログ村へ
カテゴリ
よく読まれている記事
最新記事
おすすめ書籍
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

なぜ、システム開発は必ずモメるのか? [ 細川義洋 ]
価格:2160円(税込、送料無料) (2016/11/7時点)



[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

絵で見てわかる RPAの仕組み (絵で見てわかる) [ 西村 泰洋 ]
価格:2786円(税込、送料無料) (2018/7/30時点)



月別アーカイブ
リンク