Masayan tech blog.

  1. ブログ記事一覧>
  2. PythonのSeleniumでWebサイトのログイン操作を自動化する

PythonのSeleniumでWebサイトのログイン操作を自動化する

公開日

環境

  • Windows 10
  • Python 3.10.1

動作イメージ

  • サイトはなんでもいいですが、今回は勤怠システムを例にしています
  • 以下の流れを自動化します
    1. ブラウザ起動
    2. 特定のurlを開く
    3. ログインフォームにアカウント名とパスワードをセットしてログイン処理

ライブラリ等のインストール

Seleniumのインストール

pip install selenium

webdriverのインストール

Macの場合

brew install chromedriver

Windowsの場合

  • Chromeドライバーをダウンロードし、本体をプロジェクトディレクトリに配置してそれを使用するやり方があるようですが、それだとChromeの更新の度に同作業を行う必要があり少し面倒
  • webdriver_managerを使用して、使用しているChromeのバージョンにあったドライバーを都度インストーラーしてくれるようにする
  • Chromeのバージョンは、設定→Chromeについてから参照可能

  • C:\Users\ユーザー名\.wdmにdriversというディレクトで配置されるはず
    pip install webdriver_manager

コード

  • 処理の内容はコメントに残していますので、そちらを参照ください
  • 管理上、classを複数作成していますが、なくても(login.pyに全処理を書いても)動くので問題ないです

packages\jobcan\login.py

import io, sys
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome import service as fs

from shared.Domain.xweb_element import WebElement
from shared.Domain.xdriver import XDriver
from shared.Application.open_text_service import OpenTextService
from shared.Domain.xbrowser import XBrowser
from shared.Application.open_browser_service import OpenBrowserService
from shared.Domain.xtext import XText
from shared.Application.set_webelement_value_service import SetWebElementService

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# ログインパスワードを取得
# TODO:OSの環境変数に追加してそれを使うようにする
password_filepath = 'your password filepath'
textfile = XText(password_filepath)
password = OpenTextService().execute(file=textfile.get_path(), mode='r', encoding='UTF-8')

if password == "":
    sys.exit()

# ブラウザ起動
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_options.add_experimental_option('detach', True) # 処理完了後もブラウザが起動している状態を保持する
# options.add_argument('--headless')
chrome_service = fs.Service(executable_path=ChromeDriverManager().install())
xdriver = XDriver(chrome_service, chrome_options, "Chrome")
chrome_driver = xdriver.get_driver()
chrome_browser = XBrowser(chrome_driver, "https://id.jobcan.jp/")
OpenBrowserService().execute(browser=chrome_browser)

# htmlを取得し値をセットして送信
# TODO:emailも外から渡すようにする
user_email = WebElement("user_email", chrome_browser.get_browser_object().find_element_by_id("user_email"),"hoge@foo.co.jp")
user_password = WebElement("user_password", chrome_browser.get_browser_object().find_element_by_id("user_password"),password)
SetWebElementService().execute([user_email, user_password])
chrome_browser.get_browser_object().find_element_by_xpath("//*[@id='new_user']/input[2]").click()

# 処理後、ブラウザを閉じる場合は以下
# chrome_browser.get_browser_object().quit()

shared\Domain\xtext.py

# openの返り値はファイルオブジェクト
# openでファイルが開けないときは、FileNotFoundErrorが送出
# mode
    # 読み込み(r または rt)
    # 書き込み(w または wt)
    # 追記(a または at)

class XText:
    def __init__(self, path):
        self.path = path
       
    def get_path(self):
        return self.path

    def set_path(self, path):
        self.path = path
        return self

shared\Application\open_text_service.py

class OpenTextService:
    def execute(self,file, mode,encoding):
        try:
            f = open(file=file, mode=mode,encoding=encoding)
            return f.read()
           
        except FileNotFoundError:
            print("対象のファイルが存在しないか、破損しています")
        finally:
            # 必ず閉じる
            # 閉じていないファイルに再びアクセスしたら、ファイルが開きっぱなしなので開けない等になる
            # with文を使用すれば、自動で閉じてくれる
            if 'f' in locals():
                f.close()

shared\Domain\xdriver.py

from selenium import webdriver

class XDriver:
    def __init__(self, service, options, type):
        self.service = service
        self.options = options
        self.type = type
       
    def get_driver(self):
        if self.type=="Chrome":
            return webdriver.Chrome(service=self.service,options=self.options)

shared\Domain\xbrowser.py

class XBrowser:
    def __init__(self, browser_object, url):
        self.url = url
        self.browser_object = browser_object
       
    def get_url(self):
        return self.url

    def set_url(self, url):
        self.url = url
        return self

    def get_browser_object(self):
        return self.browser_object

shared\Application\open_browser_service.py

from time import sleep

class OpenBrowserService:
    def execute(self,browser):
        browser.get_browser_object().get(browser.get_url())
        sleep(2)

shared\Domain\xweb_element.py

class WebElement:
    def __init__(self, key, element,value):
        self.key = key
        self.element = element
        self.value = value
       
    def get_key(self):
        return self.key
    def get_element(self):
        return self.element
    def get_value(self):
        return self.value

shared\Application\set_webelement_value_service.py

# 対象のhtml要素のfieldに値をセットします
class SetWebElementService:
    def execute(self, list):
        for i, web_element in enumerate(list):
            web_element.get_element().send_keys(web_element.get_value())

以上です。あとは、login.pyを実行すればログイン処理ができるはずです。

まとめ

いかがでしたでしょうか。本記事では、PythonのSeleniumでWebサイトのログイン操作を自動化するための方法について紹介しています。効率化につながりとても便利なのでぜひ活用してみてください