環境
- Windows 10
- Python 3.10.1
動作イメージ
- サイトはなんでもいいですが、今回は勤怠システムを例にしています
- 以下の流れを自動化します
- ブラウザ起動
- 特定のurlを開く
- ログインフォームにアカウント名とパスワードをセットしてログイン処理
ライブラリ等のインストール
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サイトのログイン操作を自動化するための方法について紹介しています。効率化につながりとても便利なのでぜひ活用してみてください