タイムカードを押し忘れ(そもそも押したことすら忘れる)事件がちょくちょく発生しているので、PCが立ち上がったら自動でタイムカードをクリックできるようにしたいと思い、Seleniumを使ったスクリプトを書いています。
ただ、会社のタイムカードは同じボタンをクリックするのではなく、日付ごとに押すボタンの位置が変わるため、毎回そこまでスクロールしなければなりません。
そのため特定の要素までスクロールする処理を追加しなければなりません。
その時のメモです。
今日の日付のXpathを作成する
押下するボタンのXpathを作成していきます。
たとえば、
<a id="btn25">出勤</a>
という要素があるとします。この「出勤」をクリックするとタイムカードが押せるみたいな感じです。
この要素の「25」の部分に今日の日付が入ります。
idの数字が動的に変わるので、まずは今日の日付を datetime
で取得します。
import datetime today = datetime.datetime.now().day // 25
次にデベロッパーツールで先ほどのボタンのXpathを特定します。
//[a[@id='day25']]
このようなXpathだったとしましょう。
そして、このXpathと today
を組み合わせて今日押さなければならないボタンのXpathを作成します。
today_xpath = f"//[a[@id='day{today}']]"
これで今日のボタンのXpathが作成できました。
作成したXpathの位置までスクロールする
Seleniumで特定の位置までスクロールするには execute_script()
メソッドを使ってJavaScriptの scrollIntoView()
メソッドを実行する必要があります。
webdriver
を使うので、まずはローカル環境インストールするなりSeleniumに都度インストールしてもらうなりしましょう。
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--start-maximized') service = Service(ChromeDriverManager().install()) chrome = webdriver.Chrome(service=service, options=options) chrome.get("https://timecard.com")
execute_script()
メソッドの引数にスクロールしたい要素が必要なので作成したXpathを渡してあげます。
chrome.execute_script("arguments[0].scrollIntoView();", today_xpath)
これで特定のXpathの位置までスクロールできるようになりました。
コード全体
import datetime from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--start-maximized') service = Service(ChromeDriverManager().install()) chrome = webdriver.Chrome(service=service, options=options) chrome.get("https://timecard.com") today = datetime.datetime.now().day // 25 today_xpath = f"//[a[@id='day{today}']]" chrome.execute_script("arguments[0].scrollIntoView();", today_xpath)
誤りがあったらご指摘ください!