【WinActor】Webに落ちているPDFファイルをダウンロードする

##概要
ネットに転がっているPDFファイルをダウンロードするロボットです。
Acrobat Readerで立ち上がったPDFのダウンロードがWinActorで可能なのか検証するために作ってみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/cac3bb4a-7a51-b8dc-6545-6d5e5312bac0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/8c006a25-8ec7-d206-db8d-6e57df29f27a.png)

##実装のポイント
###ブラウザをアクティブ化
ブラウザを最前面にするだけではアクティブにはならないため、マウスカーソルの位置を強制的に動かしてクリックを実行することで無理やりアクティブにしています。
ブラウザを最大化することで、マウスカーソルの位置＝ブラウザの枠内となるため、常にアクティブになるという仕組みです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/345f1e4e-bd6e-9582-931f-ba70a748615f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/b85918de-4873-4d34-3bce-bd512886755f.png)

###印刷プロパティをショートカットキーで表示
Acrobat Reader標準の印刷ボタンを押そうとすると、画像判定が必要になりそうだったので、ショートカットキーで印刷プロパティを出すようにしました。こっちのほうが確実だと思います。
ショートカットキー押下を実行するには、エミュレーションを使います。
500ミリ秒のウェイトを入れて空振りを防いでいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/c374c083-db9d-1bde-510f-3e90cf7b8d97.png)

###印刷プロパティの表示確認
印刷プロパティのダイアログは、ウインドウ識別ができないっぽいので、画像マッチングを使って表示判定を行います。
ここでは、印刷プロパティの左上「印刷」が表示されていることが確認できれば表示されたものと見なしています。
あまり広い範囲でマッチングをかけてしまうと、例えば「プリンター」のプルダウンはロボットの動作環境によって異なる可能性があり、マッチングエラーとなってしまう可能性があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/ba6144c0-3a98-7403-4343-59f2a72c1f30.png)

###プリンター選択
プリンターを「Microsoft Print to PDF」（以下、PDF）を選択してPDFダウンロードを行います。

印刷プロパティの表示確認の際、プロパティの「アクション」の箇所を「左ボタンクリック」としていたので、表示OKの場合は自動的にアクティブになるようにしています。
その際、プリンター選択に勝手にフォーカスが当たるので、PDFを選択すればよいです。

ここは実装の課題でもあるのですが、デフォルトのプリンター名を事前に認識しておかないとうまく動作しない実装になっています。。。
ここでは「EPSON～」がデフォルトなので「E」をキー入力して、デフォルトのプリンターを選択した後、「M」「I」と続けてキー入力することで、PDFが選択されます。
「Mi」で始まるプリンター名は「Microsoft XPS Document Writer」（以下、XPS）
もあるのですが、PDFのほうがリスト上位のため選択されます。

わざわざデフォルトを選択する理由は、何度も印刷プロパティでPDFを選択しているうちにPDFがデフォルトで選択されている状態になる場合もあり、このとき「M」「I」とキー入力するとXPSが選択されてしまい、その後の処理がうまく動作しないためです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/2283bfe0-f988-5963-feb3-2df6223be872.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/6a8f334f-684c-7981-a2d8-bb5da323c422.png)

##ファイル保存ダイアログの操作
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/58772878-b544-b570-558d-019db2245e97.png)
印刷プロパティの「印刷」ボタンクリック後、「印刷結果を名前を付けて保存」ダイアログが表示されます。このダイアログはOS標準のものではなくIEのダイアログなので、ウインドウ識別ができます。
ウインドウ識別ルールに「印刷結果を名前を付けて保存」ダイアログを追加後、画像マッチングで状態チェックを行います。
判定結果は「ファイル保存表示結果」という変数を用意して、そこに入れることにします。（格納される値はboolean値）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/1d4982a6-d941-2896-5dc5-384d48d192ea.png)

判定結果をもって、次処理に進むか否か分岐させます。
ダイアログがつかめなかった場合は、IEを強制終了後、シナリオ終了とします。

##PDFファイルパスを入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/c219d355-cb9f-c95f-e7ce-1a579ead5976.png)
「文字列送信」ノードを用いて、ファイル名を入力する処理を入れます。
マウス操作で配置場所を指定するのが面倒だったので、フルパスを入れるようにしました。
余談ですが、入力は本当に人の手でタイピングしているみたいに入力されていきます。1文字ずつ送信しているみたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/7d4b05e0-e7b7-160d-d557-176b8a064818.png)

##PDFファイル保存後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/17105643-b3df-ad08-6ce9-190b2f775db7.png)

フローにもあるように、「保存ボタンクリック」後「指定時間待機」ノードにて10秒ほど待機するようにしています。
実際はここまで待つ必要はないと思いますが、保存ボタンクリック後にすぐIEを終了するとPDFファイルが空ファイルになるケースがありました。おそらく保存中にIEを終了させると保存処理が中途半端な状態で終わってしまい、正しくファイルが保存されないものと思われます。

##課題
実装していて、課題と思ったのは以下の点です。

- OS標準のダイアログなどの表示判定、操作
- プリンター選択
- 保存後の待機

**OS標準のダイアログなどの表示判定、操作**
OS標準のダイアログなどの部品？をウインドウ識別させることができないため、操作する上では画像マッチングを使わないといけないため、ロボットが安定稼働するかちょっと不安です。

**プリンター選択**
デフォルトがどのプリンターであってもPDFを選択するような実装にしたいです。

**保存後の待機**
保存が完全に完了した後にIEを閉じるように実装したいのですが、現状保存が完了すると思われる時間待ってから閉じるようにしています。
環境に左右される可能性があるため、なるべくこの実装は避けたいと考えています。

上記3点、よりよい実装方法が分かる方いましたら教えてください><

##参考サイト
[IE画面の印刷でプリンター等の選択ってどうしていますか？](https://winactor.com/questions/question/%E7%94%BB%E9%9D%A2%E3%81%AE%E5%8D%B0%E5%88%B7%E3%81%A7%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC%E7%AD%89%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E3%81%84/answer/5144/)