【後編】「Selenium」を使用して勤怠システムのリモートワーク作業日報の申請を自動化した

2020.04.03

2021.08.12

Fabeee社員ブログ

前編はこちら
 
 

③トップページからワークフロー画面に遷移


▶︎ ワークフローリンククリック
リンクを押下したいのですが、これまでのnameやidといった要素を一意に特定できる属性が付いていません。
こんな時はfind_element_by_xpathを使ってhref属性が”/workflow”の要素を取得して、クリックします。

href_workflow = self.driver.find_element_by_xpath('//a[@href="/workflow"]')
href_workflow.click()


 
 
▶︎ ワークフロー画面は別タブで開かれるので、プログラムでもタブを切り替える

tabs = self.driver.window_handles
self.driver.switch_to.window(tabs[1])

 
 

④申請書類の選択


▶︎ 「 申請する 」をクリック
この要素はidで一意に特定できるのでfind_element_by_idを使って取得します。

self.driver.find_element_by_id('dijit_form_ComboButton_0').click()


 
 
▶︎ 「 申請書 」をクリック
ボタンを一意に特定できる属性はありませんが、それぞれclassに”blockContent”が付与されています。
そんな時はfind_elements_by_class_nameを使って取得します。
ボタンを配列で取得できるので、目的のボタンが格納されている添字を指定してクリックします。

self.driver.find_elements_by_class_name('blockContent')[0].click()


 
 
▶︎ 「 稟議・報告関連 」をクリック
同様にclass”blockContent”でボタンを取得してクリックします。

self.driver.find_elements_by_class_name('blockContent')[3].click()


 
 
▶︎ 「 社内リモート作業日報 」をクリック
こっちも同様にclass”blockContent”でボタンを取得してクリックします。

self.driver.find_elements_by_class_name('blockContent')[1].click()


 

⑤作業日報申請


▶︎ 作業日報記入
いままで通り、nameやidを指定してテキストを入力していき、最後に確認ボタンを押下して確認画面に遷移します。

# 件名入力
input_subject = self.driver.find_element_by_name('item_1')
input_subject.clear()  # デフォルトで入力されている文字列を消しておく
input_subject.send_keys(f'リモート作業日報({self.year}年{self.month}月{self.day}日)')
# 予定作業内容
input_work_schedule = self.driver.find_element_by_name('item_3')
input_work_schedule.clear()  # デフォルトで入力されている文字列を消しておく
input_work_schedule.send_keys(self.work_schedule)
# 確認ボタン押下
self.driver.find_element_by_id('wizardNextBtn').click()


 
 
▶︎ 「 申請する 」をクリック

self.driver.find_element_by_id('wizardSaveBtn').click()


 
▶︎ 勤怠入力画面の備考欄に記入
最後は勤怠入力画面の備考欄に「リモート作業」と入力しないいけないので、入力します。
「キンタイ」リンククリック → 備考欄記入 → 保存
備考のテキストエリアと保存ボタンは一意に特定できる属性がなかったのでfind_elements_by_tagで取得します。
また、保存ボタンはテキストが「 保存 」となっているものをクリックします。(添字で指定すると、違うボタンを押してしまうことがあるかもしれないので)

# キンタイリンククリックで勤怠画面に遷移
href_attendance = self.driver.find_element_by_xpath('//a[@href="/attendance"]')
href_attendance.click()
# これも同様に別タブで開かれるので、driverのタブを切り替える
tabs = self.driver.window_handles
self.driver.switch_to.window(tabs[2])
# 備考に「リモート作業」と入力して保存ボタンクリック
self.driver.find_elements_by_class_name('note')[self.day - 1].click()
note = self.driver.find_element_by_tag_name('textarea')
note.clear()
note.send_keys('リモート作業')
buttons = self.driver.find_elements_by_tag_name('fasti-button')
for button in buttons:
        if button.text == '保存':
                button.click()
                break



 

実行


ファイルを指定して実行するだけです、簡単ですね!

python remote_work.py

 
無事申請でき、備考欄も入力されていました。


 

感想


seleniumを使用した自動化は初めてでしたが、要素を取得するためのメソッドが豊富に用意されてあり、初めてでも簡単に自動化を実装することができました。
ただ、このままだとchromeが起動してしまい、その間操作ができないのでheadless(バックグラウンド実行)化する必要があります。
載せるとさらに長くなってしまうので、記事最下部のリンクよりご参照ください。
これからめんどくさい単純作業は積極的にプログラムで自動化していこう思います!
以上、ありがとうございました。
AIコンサル/SES/受託開発のご依頼についてはこちら
 
 

今回のソースコード


この記事のソースコードはこちら
この記事のソースコードのheadless版はこちら
 

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。