Halcyon Days

IT × 移住 × ファイナンス

MENU

Seleniumで特定の要素までスクロールするスクリプトを作成する

タイムカードを押し忘れ(そもそも押したことすら忘れる)事件がちょくちょく発生しているので、PCが立ち上がったら自動でタイムカードをクリックできるようにしたいと思い、Seleniumを使ったスクリプトを書いています。

ただ、会社のタイムカードは同じボタンをクリックするのではなく、日付ごとに押すボタンの位置が変わるため、毎回そこまでスクロールしなければなりません。

そのため特定の要素までスクロールする処理を追加しなければなりません。

その時のメモです。

今日の日付のXpathを作成する

押下するボタンのXpathを作成していきます。

たとえば、

<a id="btn25">出勤</a>

という要素があるとします。この「出勤」をクリックするとタイムカードが押せるみたいな感じです。

この要素の「25」の部分に今日の日付が入ります。

idの数字が動的に変わるので、まずは今日の日付を datetime で取得します。

import datetime

today = datetime.datetime.now().day // 25

次にデベロッパーツールで先ほどのボタンのXpathを特定します。

//[a[@id='day25']]

このようなXpathだったとしましょう。

そして、このXpathtoday を組み合わせて今日押さなければならないボタンのXpathを作成します。

today_xpath = f"//[a[@id='day{today}']]"

これで今日のボタンのXpathが作成できました。

作成したXpathの位置までスクロールする

Seleniumで特定の位置までスクロールするには execute_script() メソッドを使ってJavaScriptscrollIntoView() メソッドを実行する必要があります。

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)

誤りがあったらご指摘ください!

参考ドキュメント