Chromiumベースの新しいMicrosoft EdgeブラウザをSeleniumBasicを使って自動操作させWebスクレイピングする方法

2020年1月15日にChromiumベースの新しいMicrosoft Edgeがリリースされました。
SeleniumBasicを使って早速Web自動化(スクレイピング)を試してみます。

新しいMicrosoft Edgeをインストール

Chromiumベースの新しいMicrosoftEdgeをダウンロードします

SeleniumBasicをインストール

SeleniumBasicをインストールしていないなら、このリンクからインストールします。

新しいEdge Driverをインストール

先程上のリンクからインストールしたMicrosoft Edgeは最新のものですが、Edge Driverは更に先のバージョンに対応されたものが公開されています。

何も考えず最新Edge Driverをインストールしてきて実行しようものなら以下のエラーが出てきてテストが終了します。

実行時エラー '33'

SessionNotCreatedError
session not created: This version of MSEdgeDriver only supports MSEdge version 81

一度Microsoft Edgeを立ち上げ、バージョンを確認します。

バージョン 79.0.309.65であることが確認できました。
バージョンは刻々と更新されているため、以下のバージョン表記は使用中のEdgeバージョンと置き換えて読んでください。

このリンクからMicrosoft Edge用のWeb Driverをダウンロードします。

ZIPを展開すると以下のファイルが入っています。

このファイルをSeleniumBasicをインストールしたフォルダにコピーします。
通常は %LOCALAPPDATA%\SeleniumBasic にインストールされていると思います。

VBAが実行できる環境を立ち上げます。
以下はExcel VBAで説明します。

参照設定で Selenium Type Libraryを参照します。

更新が止まっているSeleniumBasicで最新のMicrosoft EdgeとMicrosoft Edge webdriverを使う方法

SeleniumBasicはかなり古いプロダクトで、2016年3月を最後に更新が止まっています。
古いMicrosoft Edgeには対応しているのですが、新しいMicrosoft Edgeには対応していません。

対応していないのは、そもそもMicrosoft EdgeをコントロールするためのWebDriverの実行ファイル名が変わってしまっているためEdgeをコントロールする際のexeのフルPathを指定してあげる必要があります。

以下のサンプルコードでは、環境変数 %LOCALAPPDATA% の値を取得して、SeleniumBasic標準のインストールパスを元に新しい新しいMicrosoft Edgeに対応したWebdriverへのフルPathをSetBinaryで指定しています。

コード(>は半角に置き換えてください)

Option Explicit

Sub TestNewEdge()
    Dim driver As New Selenium.EdgeDriver
    Dim elmLoop As WebElement
    Dim sTmp As String
    With driver
        .SetBinary Environ$("LOCALAPPDATA") & "\SeleniumBasic\msedgedriver.exe"
        .Get "https://www.yahoo.co.jp/"
        With .FindElementByCss("form > fieldset > span")
            .FindElementByCss("input").SendKeys "Selenium"
            .FindElementByCss("button").Click
        End With
        For Each elmLoop In .FindElementsByClass("sw-CardBase")
            sTmp = elmLoop.FindElementByCss("a.sw-Card__titleInner").Attribute("onmousedown")
            sTmp = Mid$(sTmp, InStr(sTmp, "'") + 1)
            sTmp = Left$(sTmp, InStr(sTmp, "'") - 1)
            sTmp = Replace(sTmp, "%3A", ":")
            Debug.Print elmLoop.FindElementByCss("h3").Text
            Debug.Print , sTmp
        Next
        .Wait 15000
        .Quit
    End With
End Sub

実行結果

2020/12/18 更新 最新のEdgeで動かない時は

サンプルが動かなくなっていたので調査してみました。
どうやら SetBinaryが何らかの不具合が発生している様です。

msedgedriver.exe を edgedriver.exe という名前で上書きし、 SetBinaryをコメントアウトしたら動くようになりました。

なぜSetBinaryすると動かなくなるのかはさらに調査してみないとわからないですね。

コメント

  1. ひらさわ より:

    コメントというより質問になってしまい、申し訳ないです。
    上記手順を基に、プログラムを作成しているのですが、
    「.Get "http://www.yahoo.co.jp/"」
    を実行した際に、タイムアウトエラーが発生してしまいます。
    原因がわからず、ChromiumのMicrosoft Edgeを使用している方が検索できなかったため、
    確認させていただいております。
    ご存じでしたら、教えていただけないでしょうか?

    Microsoft Edge:87.0.664.57

    *エラー内容*
    実行時エラー '21'

    TimeoutError
    The driver failed to open the listening port 127.0.0.1:49410 within 10s

    試しにChromeで実行してみたのですが、Chromeは無事開くことができました。

    • IT土方 より:

      気が付くのが遅くなってしまい申し訳ないです。
      SetBinaryがうまく機能していないようで、とりあえず対応とはなりますが、
      追記の対応で動くようにはなりました。

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