PythonとSeleniumでWebサイトに自動ログインする方法を紹介します。例として「マネーフォワード」さんのクラウド勤怠に自動でログインする手順を解説します。
ログインフォームであれば何でも良かったんですが、マネーフォワードの家計簿アプリにはお世話になったのと、導入している企業がけっこう多いようなのでマネーフォワード勤怠で動かすことにしました。
勤怠以外にも、銀行とかECサイトとか、けっこうログインが必要な機会ってありますよね。今回はプログラミング経験があまりない方でも自動化を実現できるよう、できる限り詳しく手順をまとめましたので参考にしていただければ幸いです。
なお、勤怠の打刻については、Power AutomateなどのRPAツールでも実現可能です。完全ノーコードで作りたい方はこちらもあわせてご確認いただければと思います。
実行環境
今回は、以下の実行環境で動かします。
Windows11
Google Chrome:113.0.5672.93
ChromeDriver :113.0.5672.63
Python 3.10.4
Selenium 4.9.1
Selenium・ChromeDriverのインストール
Webサイトを自動操作するには、SeleniumとChromeDriverのインストールが必要です。
Selenium | 「pip install selenium」コマンドを実行 |
ChromeDriver | https://chromedriver.chromium.org/downloadsからダウンロードして 任意の場所に配置 |
インストール手順の詳細については以下記事をご参照ください。
(Python) 自動操作の処理を実装する
自動操作したいWebサイトを開いて、要素を取得していきます。
自動操作したいWebページを開く
今回は、「マネーフォワード クラウド勤怠」のログインページで自動操作をしたいと思います。
ブラウザを自動操作する際に、操作したい部品をソースコード上で特定する必要があります。この部品のことを「要素」といいいます。HTML上では、開始タグから終了タグまでがひとつの要素となります。
HTMLの要素を取得する
要素を調べるには、開発者ツールを用います。対象のページでF12を押すか、右クリック>検証を押します。
開発者ツールを開いたら、「Elements」タブになっている状態で左上の矢印マークを押します。
この状態で、要素を取得したい項目にカーソルを合わせ、クリックします。
すると、該当の要素がハイライトされます。
「会社ID」の要素を特定するには、「class」「id」「xpath」などいくつか方法がありますが、今回はidで指定します。idの記載がある部分でダブルクリックするとコピーすることができます。
「find_element」メソッドで要素を取得する
Pythonで要素を取得するには「find_element」メソッドを使用します。
第一引数には、By.CLASS_NAME(name属性)、By.className(class属性)など、複数の方法で要素を選択することができます。(参考:要素を探す – Selenium)
このへんは覚えていなくても、エディタやIDEのインテリセンス(予測変換機能)があるので心配ありません。以下のように、途中まで入力した時点で要素取得に関するメソッドの候補が表示されます。
「send_keys」メソッドでキーボード入力を行う
要素に対してキーボード入力するには、「send_keys」メソッドを使用します。
send_keysメソッドが実行されると、対象の要素へのキーボード入力が実行されます。
「ログイン」ボタンのクリック
ボタンの要素上で右クリック>Copy>Copy XPath で、XPathをコピーします。
clickメソッドでうまくいかないときは、submitメソッドを使ってみてください。clickは単純に要素をクリックする操作ですが、submitはフォームの送信を行います。
サンプルコード
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
# Google Chromeを開く
service = Service(executable_path='C:\Windows\chromedriver.exe')
driver = webdriver.Chrome(service=service)
# マネーフォワード勤怠トップページを開く
driver.get('https://attendance.moneyforward.com/employee_session/new')
# ページが開くまで待機
time.sleep(3)
# 会社ID、アカウントID、パスワードを入力
driver.find_element(By.ID, 'employee_session_form_office_account_name').send_keys('testid123')
driver.find_element(By.ID, 'employee_session_form_account_name_or_email').send_keys('testname')
driver.find_element(By.ID, 'employee_session_form_password').send_keys('password')
# ログインボタンをクリック
driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div[2]/div/form/div[4]/input').click()
executable_pathの値は、ご自身の環境に合わせて変更してください。ChromeDriverをパスが通っている位置に置いている場合は指定不要です(詳しくはこちら参照)。その場合、driver = webdriver.Chrome() のみで動きます。Serviceのインポートも不要です。
また、Selenium4からはchromedriverのパス指定で
driver = webdriver.Chrome(executable_path='C:\Windows\chromedriver.exe')
この指定方法が非推奨となりました(動作しますが、毎回警告が出ます)。
うまくいかないとき
Seleniumで自動操作を実装する際、うまく動かないことがあります。よくありがちな事象について以下に記載します。
ボタンが押せない、入力ができない
要素に対してクリックや入力ができない場合の原因は以下が考えられます。
要素が表示されていない・ポップアップ等が出ていて押せない
Element is not clickable at point
このエラーが出ている場合は、なんらかの原因で要素を操作できない状態です。画面上に要素が表示されていない場合は、スクロールして表示させます。
# 垂直方向に1000ピクセルスクロール
driver.execute_script('window.scrollBy(0, 1000);')
# 最下部へスクロール
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
ウインドウサイズが小さい場合は、全画面表示にします。
# 全画面表示
driver.maximize_window()
また、以下のようにポップアップが出ている状態だと、要素が操作できないことがあります。
このような場合は、ポップアップを閉じる処理を追加するか、browser.get(‘遷移先のURL’)で直接ページを開くことで対応することができます。
取得しようとしている要素が2つ以上ある
以下は、楽天市場のトップページです。「スポーツ・ゴルフ」というジャンルをクリックするとします。
この場合、下記コードでは「スポーツ・ゴルフ」でなく、先頭の「ファッション」が押されます。
driver.find_element(By.CLASS_NAME, 'categoryMenu__l1Name').click()
class属性は、ひとつのHTML内に同じclass名で複数定義できますので、class属性で指定する場合は同じ名前で定義されている箇所がないか注意すると良いでしょう。この例であれば <li class = ~~> のクラス名が一意になっているので、それを指定するか、XPathを使うようにします。
トラブルシューティングについては、以下記事をご参照ください。
まとめ
今回は、PythonとSeleniumでWebサイトに自動ログインする方法を解説しました。めんどうなログイン操作を自動でできると便利ですよね。特に、日々のルーティンワークに関してはなるべく手間をかけずに、やるべき仕事に注力したいところです(というか楽したいだけ・・)。
今までGASメインで記事を書いていましたが、最近仕事でSeleniumをさわる機会があったので、しばらくはSeleniumに関連する記事が増えそうです。Pythonも久しぶりなので、試行錯誤しながらではありますが、初心者の方に近い目線で、ためになる記事が書ければと思います!
コメント