Seleniumから EDGE DRIVER を操作した時に発生した問題と暫定対策(PYTHON)

概要

 先回、python から Seleniumを使って chrome driverを制御しましたが、Microsoft Edge Driverも同じ様に制御出来ることを確認しました。 先回も書いている通り プログラムはドライバーを指定する箇所を変更するだけで、他は全く同じです。
 今回はドライバーのダウンロード・設定手順と実際にプログラムからEdge操作した時に発生した問題について記載します。

Edgeドライバーダウンロード・設定

MicrosoftEdgeバージョン確認

 次の図の通り、インストールされているMicrosoftEdgeのバージョンを確認します。

 バージョン「 85 . 0 . 564 . 51 」でした。

 ダウンロードページを開き、同じバージョンの 64 bit(X64)用ドライバーをダウンロード・解凍し、適当な場所に配置します。

  https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/

https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/

 先回投稿の通り、プログラムからのドライバーは次の様に指定しました。python プログラムがあるフォルダに “driver” というフォルダを作成し、フォルダ内に格納した場合です。

 driver = webdriver.Edge(executable_path=’./driver/msedgedriver.exe’)

問題点

 プログラム自体は動いている様ですが、パソコンを再起動すると次の様な、複数のWindowが表示されました。Window の上部枠にあるパスから、Edge の実行ファイルと思われます。

 [Ctrl]+[Shift]+[Esc] を同時に押して、タスクマネージャーのスタートアップタブを見ると Microsoft Edge が登録されています。
 どうやら、Selenium から Edge Driver を実行するとスタートアップに登録されてしまう様です。
 プログラム側のオプション設定等で、登録されない様にできないか等を調べましたが、今のところ原因・対策不明です。

 一時的な暫定対応として、スタートアップタブ上で右クリックし、選択項目を“無効化”することは可能な様です。

 スタートアップ登録は、スタートアップ登録用フォルダにショートカットを格納する方法とレジストリに登録する方法がある様です。

【スタートアップ登録用フォルダ】
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup  (注) %USERNAME% : ユーザー名

 今回、スタートアップ登録用フォルダにショートカットファイルはありませんでした。レジストリに登録されている様です。

  レジストリ操作は、致命的システム損傷につながるリスクがあり、知識が無い人は止めた方が良い様です。
 私は最悪PCが破損しても良いので実行します。

 レジストリを確認します。スタートメニュー位置で右クリックし、表示されるリストから、“ファイル名を指定して実行” をクリックします。“ファイル名を指定して実行”が、起動したら“regedit” と入力し、“OK” ボタンをクリックします。

 レジストリエディターが起動したら、次のキーを開きます。

コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

 [ msedge.exe ] を含む値のデータを確認しました。レジストリエディタでは、対象の値の位置で、右クリック → “削除” を選択するとデータを完全に削除することが出来ます。



レジストリ削除プログラム(C#)

 Edge のスタートアップをタスクマネージャーで無効化したり、レジストリエディタで削除出来ることを確認しましたが、Edge Driver を呼び出す際に新たに登録されてしまうので、これらの方法は実際の運用に対して十分な対応ではありません。
 本来、最初から登録されない様にしたいのですが、方法が判らないので、レジストリを削除するプログラムを作成しました。

 処理の流れは下の図の通りです。
 スタートボタン[レジストリ確認]をクリックすると、対象となるレジストリキーの値を取得し リストボックスに表示します。
 同時に、パスの中に [ msedge.exe ] が含まれる場合、Edge のスタートアップパスと判定し、検出時に確認メッセージ表示します。“OK” がクリックされれば、レジストリ値を削除します。

 このプログラムは半自動ですが、Selenium + Edge Driver でブラウザ操作後、レジストリ削除プログラムを起動し、自動処理する様なプログラム構成にすることも可能と思います。

 プログラムコードは次の通りです。(VS C#)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

using Microsoft.Win32;

namespace c_sharp_selenium
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int reg_start_up = check_start_up_reg();

            if (reg_start_up == 0) {
                return;
            } else if(reg_start_up > 0){
                DialogResult result = MessageBox.Show("[ msedge.exe ] がスタートアップ登録されています。抹消しますか?", "抹消確認", MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                if (result != DialogResult.Yes) {
                    MessageBox.Show("抹消処理を中断しました。","抹消処理中断",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    return;
                }
            }

            delete_start_up_reg() ;
            reg_start_up = check_start_up_reg();
        }


        // レジストリ(スタートアップ)に登録されている値を取得
        private int check_start_up_reg() {
            int reg_cnt = 0 ;
            this.listBox1.Items.Clear();
            this.listBox1.HorizontalScrollbar = true ;
            this.textBox1.Text = "" ;
            System.Windows.Forms.Application.DoEvents();

            // コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
            // キーを読み取り専用で開く
            RegistryKey regkey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", false);

            string[] valueNames = regkey.GetValueNames();                          // subキーにあるすべての値の名前を取得
            
            foreach (string v in valueNames)                                       // 表示する
            {
                RegistryValueKind v_type = regkey.GetValueKind(v) ;                // 値の種類を取得
                if (v_type == RegistryValueKind.String)                            // 文字列を対象
                {
                    string v_Value = (string)regkey.GetValue(v) ;                  // 値を取得
                    string str_result = v + "(REG_SZ) " + v_Value ;

                    if (v_Value.Contains("msedge.exe"))                            // 値の中に EDGE DRIVER が含まれるか判定
                    {   reg_cnt = reg_cnt + 1;
                        str_result = "〇:" + str_result ;                         // EDGE DRIVER が含まれる
                    } else {
                        str_result = "×:" + str_result ;                         // EDGE DRIVER が含まれない
                    }

                    this.listBox1.Items.Add(str_result) ;                          // リストボックスに追加
                }
            }

            Thread.Sleep(500);
            regkey.Close();                                                        // 閉じる
            this.textBox1.Text = reg_cnt.ToString() ;
            System.Windows.Forms.Application.DoEvents() ;
            return reg_cnt ;
        }


        // [ msedge.exe ]を含むレジストリを抹消する
        private void delete_start_up_reg() {
            // キーを書き込み許可し開く
            RegistryKey regkey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
            
            string[] valueNames = regkey.GetValueNames();                          // subキーにあるすべての値の名前を取得

            foreach (string v in valueNames)                                       // 表示する
            {
                RegistryValueKind v_type = regkey.GetValueKind(v);                 // 値の種類を取得
                if (v_type == RegistryValueKind.String)                            // 文字列を対象
                {
                    string v_Value = (string)regkey.GetValue(v);                   // 値を取得
                    if (v_Value.Contains("msedge.exe"))                            // 値の中に EDGE DRIVER が含まれるか判定
                    { regkey.DeleteValue(v, false); }                              // false 指定すると対象値が存在しなくてもエラーを発生しない
                }
            }
        }
    }
}

まとめ

 Selenium から Edge Driver を操作する課題を確認しました。
 レジストリ削除を毎回するなら、Chrome Driver を使った方が良い様にも思いますが、Edge は Windows10のデフォルトブラウザです。プログラム配布時にインストール不要であるという利点があります。スタートアップ登録されない PC環境・設定・方法等の調査は継続する予定です。


 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です