【SeleniumBasic】指定の場所にあるWebDriverを自動更新する【Python】

Python
スポンサーリンク

ブラウザオートメーションでSelenium Basicを使用しています。とても快適に動いていてほとんどコケたことがありません。稼働率99%叩き出しているのではないかと思うほど快適な運用ができています。既存の資産であるVBAのコードをそれほど手を加えることなく改修できたのも大きいです。

とはいえSelenim Basic最大の弱点はブラウザのバージョンが変わると手動でWebDriverを更新しなければならないというところです。勝手にブラウザのバージョンが変わってしまうとSelenium Basicがこけてしまうため今まではブラウザ(Edge)の自動更新を止めていました。ブラウザアップデートを手動にする方法は以下のページを参考にしてください。

アップデートを止めていれば何の問題もないのですが、これはこれでセキュリティ上問題があります。そこでWebDriverを自動更新するシステムを構築することにしました。今流行りのpythonで作成します。

スポンサーリンク

WebDriver自動更新プログラムの流れ

参考にさせていただいたサイトはこちらです。ありがとうございました。こちらでVBAで作成されているのをPython化してみました。

Microsoft Edgeのバージョンに合わせてWebDriverをダウンロードするVBAマクロ | 初心者備忘録
ブラウザーの制御に広く使われているWebDriverですが、ブラウザーがアップデートされる度にバージョンに合わ

以下の流れでプログラムを動かします。ブラウザはEdgeですすめていきます。

1. Edgeのバージョンを確認する。
2. WebDriver保存フォルダに1で調べたバージョンのWebDriverがあるか確認する。
3. あればプログラム終了。なければそのバージョン名フォルダを作成する。
4. Microsoftサイトにアクセスし、WebDriverをダウンロードする。
5. ダウンロードしたWebDriverをバージョン名フォルダに保存する。
6. 保存したWebDriverをSelenium Basicのフォルダにコピーする

まずWebDriver保存フォルダを作成して下さい。場所はどこでもいいです。このフォルダにWebDriverをバージョンごとに保存していきます。ここに保存されていなければ最新のブラウザに更新されたと判断して最新のWebDriverをMicrosoftのサイトから取得しに行きます。

ソースコード

プログラム冒頭のedgedriver_savefolderselenium_driver_pathを環境に合わせて変更していただければ動くと思います。

import os
import sys
import tempfile
import requests
import zipfile
import shutil

def download_edge_driver():

    #ここを環境に合わせて変更すれば動くはず…
    #WebDriver保存フォルダ
    edgedriver_savefolder = r"C:\EdgeDriver"
    #Selenium BasicのWebDriver保存フォルダ
    selenium_driver_path = r"C:\Program Files\SeleniumBasic"

    download_filename_zip = "edgedriver_win64.zip"
    driver_filename = "msedgedriver.exe"
    url = "https://msedgedriver.azureedge.net/"
    
    
    #1. Edgeのバージョンを確認する。
    driver_version = get_current_edge_version()
    
    #ダウンロードするURLを作成
    url = os.path.join(url, driver_version, download_filename_zip)

    #2. WebDriver保存フォルダに1で調べたバージョンのWebDriverがあるか確認する。
    driver_folderpath = os.path.join(edgedriver_savefolder, driver_version)
    driver_filepath = os.path.join(driver_folderpath, driver_filename)
    print(driver_filepath)

    #3. あればプログラム終了。なければそのバージョンのフォルダを作成する。
    if os.path.exists(driver_folderpath):
        if os.path.exists(driver_filepath):
            print("このバージョンのドライバは存在しています")
            sys.exit()
    else:
        #フォルダを作成
        os.makedirs(driver_folderpath)
    
    #一時作業場所を作成
    with tempfile.TemporaryDirectory(prefix="tmp_", dir=".") as dirpath:
        print(dirpath)
        
        #4. 該当サイトにアクセスし、WebDriverをダウンロードする。
        result = download_files(url,dirpath)

        if result == False:
            sys.exit()

        #ダウンロードしたファイルを展開
        with zipfile.ZipFile(os.path.join(dirpath,download_filename_zip),'r') as inputFile:
            inputFile.extractall(dirpath)

            #5. ダウンロードしたWebDriverをバージョンのフォルダに保存する。
            res = shutil.move(os.path.join(dirpath,driver_filename), driver_folderpath)
    
    #6. 保存したWebDriverをSelenium Basicのフォルダにコピーする
    copy_selenum_basic(driver_filepath, selenium_driver_path)


def copy_selenum_basic(file_path, selenium_driver_path):
    if os.path.exists(file_path):
        #コピー先のファイル名を変更する
        shutil.copy(file_path, os.path.join(selenium_driver_path, "edgedriver.exe")) 
    else:
        print("WebDriverが存在しません")

 
def download_files(url,file_dir):
    
    #Web上のファイルデータをダウンロード
    response = requests.get(url)
    
    #HTTP Responseのエラーチェック
    try:
        response_status = response.raise_for_status()
    except Exception as exc:
        print("Error:{}".format(exc))
    
    # HTTP Responseが正常か?
    if response_status == None:
        file = open(os.path.join(file_dir,os.path.basename(url)),"wb")
        for chunk in response.iter_content(100000):
            file.write(chunk)
        file.close()
        print("ダウンロード・ファイル保存完了")
        result = True
    else:
        print("ダウンロードに失敗しました。")
        result = False

    return result


def get_current_edge_version():
    import winreg

    path = "SOFTWARE\Microsoft\Edge\BLBeacon"
    key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, path)
    data, regtype = winreg.QueryValueEx(key, 'version')
    print('バージョン:', data)
    winreg.CloseKey(key)

    return data


download_edge_driver()

実行結果

無事WebDriverがダウンロード・Selenium Basicへコピーが完了いたしました。

WebDriver保存フォルダ
Selenium Basic 内のWebDriver保存フォルダ

解説

WebDriverをいったんダウンロードする場所はテンポラリフォルダになります。それからWebDriver保存フォルダに移動させてます。pythonにはテンポラリフォルダを作成し、かつ作業後自動でそのフォルダを削除してくれるという便利な機能があります。

#一時作業場所を作成
    with tempfile.TemporaryDirectory(prefix="tmp_", dir=".") as dirpath:
        print(dirpath)

上記ソースのwith句を抜けると自動でテンポラリフォルダを削除します。Zipを展開した時いらないファイルも出ますが、勝手に消してくれるので気にする必要はなくなりますね。

タスクスケジューラに登録

作成したpythonプログラムをpyinstallerでexe化し、タスクスケジューラに登録します。すでにSelenium Basicを利用するプログラムもタスクスケジューラに登録されているのでそのプログラムの10分くらい前に登録してブラウザの更新が必要か確認します。

pythonプログラムをexe化するにあたり、WebDriver保存場所やSelenium BasicのWebDriver保存場所を引数にすると運用しやすくなります。

pyinstallerについて

pyinstallerについて補足します。標準ライブラリではないのでインストールが必要です。私の環境はanaconda3ですので「anaconda prompt」を起動して以下を入力実行します。

pip install pyinstaller

インストールが完了しましたらコマンドプロンプトから以下のコマンドを入力実行すればexeが完成します。

pyinstaller ファイル名 --onefile

これでpython環境のないPCでもexeだけで実行することが可能になります。

まとめ

これでSelenium Basicの弱点を補うことができました。しかし最大の弱点がありまして。実はこのソフト、2016年以来バージョンアップされていないということです。大きな脆弱性が発見されて使用中止を促されたらどうしようとひやひやです。作者どうしたのよ~。戻ってきて~。

コメント

タイトルとURLをコピーしました