【ExcelVBA】VBAでFirefoxを使うには

以前Seleniumを使ってVBAでスクレイピングする方法を紹介したのですけど、そのときのブラウザはEdgeでした。今回はFirefox(FF)です。

Firefox(バージョン109.0.1)

きっかけ

きっかけはこちらの質問です。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13274674623

エクセルVBAによるWEB連動にお詳しい方教えてください。
自身のYAHOO IDでログインをし、添付のようにYAHOO JAPANトップから
赤枠のニュース蘭をカテゴリ別にシートをVBAにて自動生成して
それぞれのシートに右図のようなニュース文字列を表示し、さらにリンクを付けて
クリックしたらそれぞれのYAHOOページに飛ぶようなマクロを
FIREFOXブラウザ(※IEじゃないです)にて行いたいです。

ニュース表示内容はログインIDに依存しないかとは思われますが、なかなか
ログインできず苦戦しています。もちろん現行のYAHOOJAPANの仕様で
大丈夫です。宜しくお願いします。

調べてみたところ、VBAでFFを使うのはかなり難しくなっていました。

以前は楽だった

FFのバージョンが46まではWebdriverと一体だった(?)ので、わざわざWebdriverをダウンロードしてくる必要もなく、他のブラウザに比べてずいぶん楽でした。

Sub YAHOOにログインしカテゴリ別にシートを自動生成しリンクを貼る()
    Dim Driver As Object
    Set Driver = CreateObject("Selenium.WebDriver")
    
    Driver.Start "firefox"   'ここでエラー
    Driver.Get "https://www.yahoo.co.jp/"

ところが現在のバージョン(この記事執筆当時のFirefoxは109)ではエラーとなります。

なんで?

仕様変更?

詳しいことは分かりませんが、Firefoxのバージョン46までと47以降とでは、設計思想がだいぶ違うようです。Firefox側の問題なのかSelenium側の問題なのかよく分かりません。

FF46まではWebdriverはブラウザと一体になっているので、使う人はバージョン違いを気にする必要はありませんでした(・・・と、思われます。Web情報による。私も見てきた訳ではないので・・・)。

ところがFF47以降は、ブラウザとは別にWebdriverが必要となりました。FirefoxのWebdriverはgeckodriver.exeと言います。

では、このgeckodriver.exeをSeleniumのインストールフォルダに入れてあげればいいんじゃないかと思ったのですが、うまくいきません。

Seleniumのフォルダにgeckodriver.exeを入れてみた

しかし、エラーは解消されず・・・orz

同一のフォルダにchromedriver.exeとかedgedriver.exeとかありますよね。これらはChromeだったりEdgeのドライバです。同じように整えているのに動かない・・・orz

試しにFireFoxのバージョンを下げてみる

試しにFirefoxのバージョンを下げてみました。

バージョン46の頃のFirefox。懐かしい。キツネのイラストが今とはだいぶ違いますね。
Yahoo!が表示

無事Yahoo!のTopページが表示されました。

ここまではよかったのですが、問題は次です。

Sub YAHOOにログインしカテゴリ別にシートを自動生成しリンクを貼る()
   
    Dim Driver As Object
    Set Driver = CreateObject("Selenium.WebDriver")
    
    Driver.Start "firefox"
    Driver.Get "https://www.yahoo.co.jp/"
 
    Driver.FindElementByCss("#StatusMail > a > dl").Click    'ここでYahoo!が推奨ブラウザでないと表示
     
    Driver.FindElementByCss("#username").SendKeys ("hogehoge")
     
    Driver.FindElementByCss("#btnNext").Click
     
    Driver.FindElementByCss("#passwd").SendKeys ("Password")
     
    Driver.FindElementByCss("#btnSubmit").Click
     
    Stop
     
End Sub

テストに使っていたコードは上記のとおり(ユーザIDとパスワードは実際のものとは異なります)なんですが、Yahoo!メールにログインする画面に遷移する個所でYahoo!から「推奨ブラウザでない」との表示がありました。

なんと・・・・。

そりゃそうですよね、何十代も前のバージョンのブラウザではセキュリティ上問題があります。

やはりFF46以前を使うのはダメですね。

他言語での使い方

VBAで最新のFirefoxを使うのは無理なのか、引き続き調べていたところ、他言語では次のように記述すれば使えることが分かりました。

System.setProperty("webdriver.gecko.driver", "C:\GeckoDriver\geckodriver.exe"); //←これが新しい

WebDriver driver = new FirefoxDriver();
driver.get("http://seleniumhq.com");

最初にSystem.setPropertyでgeckodriver.exeへのパスを教えてあげればよいらしいです。

PythonとかKotlinとかでも同じです(似たような感じでパスを教えてあげる方式)。

じゃあ、VBAでは?

調べてみたけれど、分かりませんでした。

どうもSelenium側がすでにVBAについては開発を止めているらしいです。

VBAでスクレイピングすること自体、もうあんまりやらないと思われているようです。確かにVBAと相性のよかったInternetExplorerが終わりましたもんね。VBAも”終わったコンテンツ”だと思われても仕方ないのかもしれません。

Selenium4のアップデートを知らせるサイトにおいて、対応言語の中にVBAはありませんでした。

そ・・・・そんなあ!><

Seleniumを使わないでWebdriverを使う

仕方がないのでWebdriverをSeleniumなしで使う方法を模索しました。

幸い次のような良記事を発見しました。

①Excel VBAでSeleniumBasicを使わずにスクレイピングする

https://qiita.com/uezo/items/66e20b064ffd5f239b9a

②SeleniumなしでWebDriverを操作するには – Part1

https://zenn.dev/ymd65536/articles/e13f278a5d9803

①はブラウザがChromeとEdgeなんですが、Firefoxにも使えそうです。

②はPOSTしたときのEdgeの戻り値について書いてあって、Firefoxの場合にも同様に戻り値を見ればいいんだ!と目から鱗でした。Part2もあるようで、読むのが楽しみです。

まとめ

という訳で、VBAでSeleniumを使うならFirefoxはあきらめた方がよいです。別のブラウザを選ぶべき。

どうしてもFirefoxでスクレイピングしたいなら、Selenium以外を使うか、全く使わず自前でWebdriverを使うしかないようです。

私はこのSeleniumを全く使わず自前でWebdriverを使う方法を①と②のサイトを見ながら試してみようと思います。

続きます。

蛇足:夫に「FirefoxがVBAで使えなくてさーーー」と愚痴ったら、「オワコンにオワコンだからじゃね?」と悪口を言われました。くそぅ(;`皿´)グヌヌ

Firefoxはオワコンじゃないですよ!VBAはあやしいけど・・・。

あれ?もしかして私?私がオワコン!?