今回はロリポップ!用MySQLのバックアップを自動化してみました。私が公開しているロリポップ!のMySQLを更新する手順が本ブログの中でも結構人気がありまして、中にはリンクをつけていただいている方もいます。ご訪問やコメントをありがとうございます。
ただ筆者の中で気になっているのは、手作業なので割と煩雑だなーって思っています。特にデータのバックアップ関連は煩雑だと、、、ということで今回Seleniumによる自動化プログラムを紹介します。
Seleniumとは
Seleniumは、ウェブブラウザを操作するための自動化ツールです。主にウェブアプリケーションのテストに使用されますが、ページのスクレイピングや、定期的なタスクの自動化など、多岐にわたる用途で利用されています。SeleniumはJava、Python、C#などの様々なプログラミング言語に対応しており、EdgeやChrome、Firefoxでのテストが可能です。
主な特徴
Seleniumの主な特徴は以下の通りです。
- クロスブラウザ対応: Chrome, Firefox, Safariなど、主要なブラウザで動作します。
- 複数のプログラミング言語に対応: Python, Java, C#, Rubyなど、好みの言語でスクリプトを書くことができます。
- オープンソース: 無料で利用できるため、気軽に試すことができます。
主なコンポーネント
Seleniumに関するコンポーネントは以下の通りです。
- Selenium WebDriver: 各ブラウザをプログラム制御するためのAPI。
- Selenium IDE: テストスクリプトを簡単に記録するためのブラウザプラグイン。
- Selenium Grid: 複数のマシン上でテストを並行実行するためのツール。
今回、試作品レベルのものをPythonで作りました。
開発対象はデータベースのエクスポート
データベースの更新手順は以下6つのプロセスがあります。
- ブログ内コンテンツのエクスポート
- データベース内データのエクスポート
- 古いデータベースの削除
- 新しいデータベースの作成
- 新しいデータベースへデータをインポート
- データベース接続先の修正
この中で肝となる「2.データベース内データのエクスポート」をターゲットとしました。
ほかのプロセスの場合、複数システムへのアクセスや、設定ファイル編集などがあり、すぐにプログラムが組みにくいという事情もあります
次章でプログラムのサンプルを載せました。
実際のプログラム
今回、データベースのエクスポートを対象にPython + Seleniumでプログラムを組んでみました。その例が以下になります。メソッド分割と化していなかったりと結構改善点は多いです。
# seleniumの必要なライブラリをインポート
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import os
# Chrome Webドライバーのインスタンスを生成
driver = webdriver.Chrome()
# Webドライバーでログインページを起動
driver.get('https://mysqladmin.lolipop.jp/pma5/index.php')
# ログイン
driver.find_element(By.ID, "input_username").send_keys("ユーザ名")
driver.find_element(By.ID, "input_password").send_keys("パスワード")
Select(driver.find_element(By.ID, "select_server")).select_by_visible_text("サーバ名")
driver.find_element(By.ID, "input_go").click()
time.sleep(3) # 3秒間スリープ
# エクスポート
driver.find_element(By.XPATH, "//*[@id=\"pma_navigation_tree_content\"]/ul/li/a").click() # データベース選択
time.sleep(1)
driver.find_element(By.XPATH, "//*[@id=\"topmenu\"]/li[5]/a").click()
time.sleep(1)
driver.find_element(By.XPATH, "//*[@id=\"radio_custom_export\"]").click()
time.sleep(3)
# 以下、うまくクリックできなかったので書き方を変更
driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, "//*[@id=\"checkbox_sql_create_database\"]"))
time.sleep(1)
driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, "//*[@id=\"checkbox_sql_drop_table\"]"))
time.sleep(1)
driver.execute_script('arguments[0].click();', driver.find_element(By.ID, "buttonGo"))
phpAdminのHTML構造が結構複雑だったり、SPAのような作りのようでラジオボタンをクリックしたときに後から追加されるコンポーネントとかが多かったです。またコンポーネントにIDやNameがつけられていないことが多く、特定のボタンを押すためにはXPATHを多用するといった感じでした。
ブラウザのデベロッパーツールを使うと、XPATHが分かります。(参考サイト:https://qiita.com/ywindish/items/5a992c49387d81df900e)
あとは短時間でいろんな操作をするとシステムに負荷がかかってしまうため、各操作ごとにスリープをかませています。
今後の課題
今回、試作レベルでデータベースのエクスポートをするプログラムを作ってみましたが、以下の課題が残りました。
- 他のプロセスについても自動化できていない
- 単純に書き方がよくない
- ログイン情報がプログラムへ直入力
課題1:他のプロセスについても自動化できていないこと
今回、難易度と効果を照らし合わせて、データベースのエクスポートを自動化するようにしました。ただほかにも効果がありそうなプロセスはあります。
まず「1.ブログ内コンテンツのエクスポート」はプラグイン入れては対象を絞ってバックアップを残すなど、手作業としてやることがいくつかあると思います。あと「6.データベース接続先の修正」は権限を2回切り替えたりと忘れそうなので自動化の余地があります。
他はパラメータ設定とかはなく、単純作業なので無理に自動化はしなくてもとは思っています。
課題2:単純に書き方がよくないこと
プログラムとしてはそこまで長くないので理解できなくもないのですが、やっぱり書き方はよくないですね。即席で作ったから当然ではあるが、、、
例えば多少はメソッド分割した方がいいかもしれないとは思いました。ログインとデータベースのエクスポートは処理として異なるので、メソッド化した方が分かりやすいのかもしれません。
あとは今回諦めた一部コンポーネントをクリックしようとした時のエラー改善ですね。具体的には要素が見つからないと出ているようなので、たぶんページをスクロールしたら改善されるとかなのかなとは思っています。それでも改善しないとしても書き方を統一するとかですね。
課題3:ログイン情報がプログラムへ直入力
前章のプログラム例だと16~18行が直入力になっています。そのため実行時にパラメータを入れさせるとかGUIのプログラムにして、そこに書かせるとかの工夫が必要だと思っています。
まとめ
本記事では、ロリポップ!用MySQLのバックアップを自動化するために、Seleniumを使ったプログラムについて解説しました。手作業で行うMySQLの更新手順が多くの人にとって煩雑だと感じる部分を、自動化することで効率化を図ります。
具体的には、以下の主要なポイントについて触れました:
- Seleniumの紹介: Seleniumとは何か、その主な特徴とコンポーネントを説明しました。
- データベースのエクスポート: データベースのエクスポート手順をターゲットに、自動化プログラムを紹介しました。
- 実際のプログラム: PythonとSeleniumを使った具体的なコード例を提供し、その解説を行いました。
- 今後の課題: 他のプロセスの自動化やログイン情報の管理方法など、解決すべき課題について議論しました。
自動化することで時間と労力を節約できる一方で、プログラムの改善点や課題も明確になりました。これからも実践とフィードバックを繰り返しながら、さらに効率的なシステムを構築していきたいです。
ご興味のある方は、記事内で紹介したリンクを参照して、詳細を確認してください!
参考文献
- Qiita:Seleniumでブラウザ操作する方法まとめ(https://qiita.com/uchiyama-t/items/f3ce25fc123a932d16ad)
- Qiita:【Selenium】(Python)ハマった時のメモ(https://qiita.com/toimenbou/items/635a6e0e241149317e32)
コメント