Seleniumにて、ドライバのバージョンとローカルのバージョンが相違しているとエラーが発生してしまう。クロームは基本的に自動更新されていくので、主にドライバが古くて起こるケースが殆どの模様。ならば検知してドライバを自動更新しちゃおう!って処理を追加してみた話し
Seleniumとは?
Seleniumは、Webアプリケーションをテストするためのポータブルフレームワークです。 Seleniumは、テストスクリプト言語を学ぶ必要なく機能テストを作成するための再生ツールを提供します
ウィキペディア(英語)
要はウェブブラウザ(クロームやらFireFoxやら)を自動化して色々やっちゃおうってフレームワークです。
で、今回の話に至る前に以前こんなん作ってみたんです?
しばらく放置しちゃってたんですけども、ひさびさに無在庫転売でもやるかなと思って起動してみたらば、、、
// オプション初期化
ChromeOpM = new ChromeOptions();
ChromeOpM.AddArgument("user-data-dir=" + Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\Relist-Tool\M");
ChromeOpM.AddArgument("--headless");
ChromeDrM = new ChromeDriver(ChromeSvM, ChromeOpM);
↑ここ
session not created: This version of ChromeDriver only supports Chrome version 76 (SessionNotCreated)
こんなエラーが出てログイン出来なかった訳です。
これはドライバはバージョン76だけどローカルのバージョンは違いますよ!と言う事。そもそもキャッチしてなくてエラーで落ちちゃうお粗末仕様だったので施した対策を下記に備忘録
try-catchでクロームバージョン取得&最新ドライバダウンロード
取り合えず該当箇所のエラーを拾い、ドライバのバージョンとローカルのバージョンをメッセージで出す事に。
// オプション初期化
ChromeOpM = new ChromeOptions();
ChromeOpM.AddArgument("user-data-dir=" + Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\Relist-Tool\M");
ChromeOpM.AddArgument("--headless");
try
{
ChromeDrM = new ChromeDriver(ChromeSvM, ChromeOpM);
}
catch (Exception ex)
{
// バージョン相違
string strErr = "ドライバとブラウザのバージョンが一致しません。\n";
strErr = strErr + "ドライバを更新しますか?\n";
DialogResult dRet = MessageBox.Show(strErr, "Relist-Tool", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
if (dRet == DialogResult.Yes)
{
// ローカルクロームバージョン取得
string strChromeVer = GetChromeVersion();
// ローカルクロームに対応した最新版マイナーバージョンを取得する
WebClient client = new WebClient();
string driverVersion = client.DownloadString("https://chromedriver.storage.googleapis.com/LATEST_RELEASE_" + strChromeVer.Substring(0, strChromeVer.LastIndexOf('.')));
//Windows向けのzipファイルを取得
Directory.SetCurrentDirectory(System.IO.Directory.GetCurrentDirectory());
new WebClient().DownloadFile("https://chromedriver.storage.googleapis.com/" + driverVersion + "/chromedriver_win32.zip", "chromedriver_win32.zip");
MessageBox.Show("システムを終了します。\n zipファイルを解凍して上書き後再起動してください。", "Relist-Tool", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
FormMain.closing();
this.FindForm().Close();
return;
}
else
{
MessageBox.Show("システムを終了します。", "Relist-Tool", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
FormMain.closing();
this.FindForm().Close();
}
}
↓中で呼ぶ関数。単純にレジストリ見てバージョンを拾います。
/////////////////////////////////////////////////////////
// 概要:クロームバージョン取得処理
// はまみ:2019/12/12
/////////////////////////////////////////////////////////
private string GetChromeVersion()
{
string wowNode = string.Empty;
if (Environment.Is64BitOperatingSystem) wowNode = @"Wow6432Node\";
RegistryKey regKey = Registry.LocalMachine;
RegistryKey keyPath = regKey.OpenSubKey(@"Software\" + wowNode + @"Google\Update\Clients");
if (keyPath == null)
{
regKey = Registry.CurrentUser;
keyPath = regKey.OpenSubKey(@"Software\" + wowNode + @"Google\Update\Clients");
}
if (keyPath == null)
{
regKey = Registry.LocalMachine;
keyPath = regKey.OpenSubKey(@"Software\Google\Update\Clients");
}
if (keyPath == null)
{
regKey = Registry.CurrentUser;
keyPath = regKey.OpenSubKey(@"Software\Google\Update\Clients");
}
if (keyPath != null)
{
string[] subKeys = keyPath.GetSubKeyNames();
foreach (string subKey in subKeys)
{
object value = keyPath.OpenSubKey(subKey).GetValue("name");
bool found = false;
if (value != null)
{
found = value.ToString().Equals("Google Chrome", StringComparison.InvariantCultureIgnoreCase);
}
if (found)
{
return keyPath.OpenSubKey(subKey).GetValue("pv").ToString();
}
}
}
return "不明";
}
これで取り合えずエラー更新するかどうかの確認メッセージを出し、ドライバファイルのダウンロード迄行いました。
本当は上書きさせたかったんだけどどうやっても使用中になってしまい断念したのは秘密です…
自分でバージョン確認を行う方法
ブラウザ上で右上の点々をクリックし、左下のChoromeについてを押す事でクロームのバージョンの確認が出来ます。
ドライバもダブルクリックで起動するとコンソールで確認が出来るようになっています。
もしクロームのバージョンにドライバが追い付いていなかった場合は、自身のクロームバージョンをダウングレードするか、
Selenium開発者たちにDONATEでもして望みを託しましょう…(ᵔᴥᵔ)
コメント
Thank you for watching(ᵔᴥᵔ)