初めて作ったバッチのお話

##はじめに
※この物語はbat初心者の平凡な日常を淡々と描く物です。過度な期待はしないでください。

朝、いつもの様にコーヒーを飲んで作業をします。
作業をしているとお昼の時間になりました。お昼時間になるとお弁当Webサイトでお弁当を購入した人が誰かわかるように、お弁当リストを準備しなくてはいけません。
Webサイトの中に印刷ページがあるので、いつもの様にログインをして印刷ページまで移動して印刷を行います。
これを毎日行います。

毎日作業して半年たった辺りでふと思いました。
「これを毎日するのは面倒臭いな」

そうだ！自動で印刷してくれるようにすればわざわざ印刷する手間もなくなるし、忘れることもない！
じゃあ自動化するようにバッチを作ろう！

以上導入でした。


## 環境準備

バッチ作成にはSeleniumを使用しました。

Selenium(セレニウム)とは、Webアプリケーションのテスト自動化を実現するブラウザ駆動型テストツール群です。ブラウザ操作からテストスクリプトを作成でき、Webベース管理タスクの自動化も行えます。Webブラウザの自動操作ライブラリとしてさまざまな機能を備えています。

引用元：ossnews.jp/oss_info/Selenium

だそうです。難しいことはわかりませんがブラウザ操作を自動化できるならいいやという気持ちで使ってます。

動作環境はこちら！
OS:Windows Server 2008 R2 Datacenter SP1
Chrome: 78.0.3904.106（Official Build） （64 ビット）
Python:3.7.2
Chrome用Webdriver:78.0.390470

環境準備はこちら！
Seleniumを使うためにはPythonやブラウザに対応したWebdriverが必要なため、Chrome用Webdriverをインストールしています。
※WebDriverは自分のChromeブラウザと同じバージョンか調べて使う必要があります。

Pythonをインストール（DL元：https://www.python.org/
WebDriverをインストール（DL元：https://chromedriver.chromium.org/home
Seleniumインストール（下記コマンドのみ

```Python
python -m pip install selenium
```

pywinautoをインストール（DL元：https://github.com/pywinauto/pywinauto

`pywinauto`はMicrosoft Windows GUIを自動化する一連のPythonモジュールで、キーボードとマウスのアクションを実行することができます。

pywinautoインストールについては少し複雑で、下記のサイトを参考にインストールしました。

参考：Windows10でpywinautoを使おうとしたらハマった
https://qiita.com/ponkio-o/items/409766b574f03d1d5a49

##作成手順

これで環境はOK
次にVisual Studio Codeを使ってソースコードを書いていきます。
はじめに使用するモジュールを記述します。

```Python
import time, pywinauto'パイナイトでTimeモジュールを使用する'
from selenium import webdriver'Webdriverモジュールをインポートする'
```

ここからWebページの画面を見ながらどのような作業を行わせたいか考え、記述していきます。
まずはログインページに移動します。

```Python
driver = webdriver.Chrome("./chromedriver.exe") 'さっきDLしたchromedriver.exeを使う'
driver.get("https://www.obentonet.jp/login.html") 'chrome起動してお弁当Webページに移動'
```

ログインページにきましたが認証が必要です。
本来ならば絶対やってはいけないのですが、他の方法を考えるのが面倒だったので、認証情報を埋め込んで、ログインをしています。

```Python
codeBox = driver.find_element_by_id("CORPORATION_CD") '検索入力ボックスのhtmlを探す'
codeBox.send_keys("会社ID") 'その検索ボックスで　「会社ID」と打つ'

idBox = driver.find_element_by_name("LOGINID") '検索入力ボックスのhtmlを探す'
idBox.send_keys("ユーザー名") 'その検索ボックスで　「ユーザー名」と打つ'

passBox = driver.find_element_by_name("PASSWORD") '検索入力ボックスのhtmlを探す'
passBox.send_keys("パスワード") 'その検索ボックスで　「パスワード」と打つ'
```

認証情報を打ち込んだら、ログインボタンをクリックするようにコードを書きます。

```Python
login = driver.find_element_by_css_selector(".buttonarea > input")'loginにログインボタンのリンクを関連付ける'
login.click()'ログインボタンのリンクをクリック'

```

ログインできたら、印刷用のページに行くために、お弁当Webページ画面を見ながら、どう遷移したらいいかコードを記載していきます。

```Python
login = driver.find_element_by_link_text("社内注文リスト")'loginに社内注文リストのリンクを関連付ける'
login.click()'社内注文リストのリンクをクリック'
login = driver.find_element_by_link_text("印刷用")'loginに印刷用のリンクを関連付ける'
login.click()'印刷用のリンクをクリック'
```

印刷ページに到着したら、次に印刷をするために【右クリック】－【印刷】をコードで記載します。

```Python
time.sleep(5)'即行動すると反応しないので一時停止'
pywinauto.keyboard.SendKeys("+^P")'右クリック'
time.sleep(5)'一時停止'
pywinauto.keyboard.send_keys("%P")'印刷実行'
time.sleep(5)'一時停止'
driver.quit()'閉じる'
```

これでバッチは完成です。
動かしてみた動画がこちら↓

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">test <a href="https://t.co/AG6UOLY7Ml">pic.twitter.com/AG6UOLY7Ml</a></p>&mdash; ジンロウガ (@19950829ryoma) <a href="https://twitter.com/19950829ryoma/status/1203853141566836736?ref_src=twsrc%5Etfw">December 9, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

後はタイムスケジュールを設定して、朝指定した時間に起動させれば、当人は印刷されたものを取り出すだけでOKになりました！

##まとめ

いかがでしたでしょうか。
中身はごく簡単な記述で、行っていることもたいしたことはないですが、一連の作業を完全に自動化させることができます。
今回初めてバッチを作成してみて、コードの記述の仕方や、インストールでつまずいたポイント等もあったので勉強にもなりました。

もし普段同じ作業を繰り返しているものがあれば、試しに作成してみてはいかがでしょうか。