21
18

【Excel】TinySeleniumVBA(Chromium版Edge)を使用したWebアプリ操作

Last updated at Posted at 2021-12-21

はじめに

これは、Visual Basic Advent Calendar 2021の22日目の記事となります。

Microsoftから2022年6月にInternet Explorer 11デスクトップアプリケーションのサポートが終了されるとの発表がありました。

IEサポート終了による影響

サポート終了により、IEオートメーション系のマクロが使えなくなります。

Set objIE = CreateObject("InternetExplorer.Application")
Or
Set objIE = New InternetExplorer

【2022/03/28追記】
オートメーションでの IE11 起動も Edge にリダイレクトされるという仕様は撤回されました。
よって、引き続き IE を使い続ける事もできます。

TinySeleniumVBAの紹介

うえぞうさん(uezochan)がWebDriverを使ってブラウザー操作を行うSeleniumクライアント「TinySeleniumVBA」を公開されています。

TinySeleniumVBAの機能追加版(SeleniumVBA)の紹介

Tinyとは小さいの意味で、最低限の機能のみになっています。
単純な要件であれば基本的に問題ないのですが、凝り出すと機能が足りなくて困ってしまう。
オープンソースですからフォークされて機能追加されたリポジトリがあります。

WebDriverの自動更新

WebDriverと現在ブラウザのバージョンが違うと下記エラーメッセージが出ます。
ユーザーにWebDriverを手動更新してもらうことになります。
例 This version of MSEdgeDriver only supports MSEdge version 96
Current browser version is 101.0.121.053 with binary path
image.png

WebDriverを自動更新させるモジュールが下記サイトにあります。

機能追加版(SeleniumVBA)には、WebDriverを自動更新用クラス「WebDriverManager.cls」が用意されています。

Mac対応版

IEMode対応

Issueに改良方法を記載してあります。32bit版IEドライバーの方が動作が軽いとのこと

機能追加版(SeleniumVBA)には、dev版としてIEモードが組み込まれています。まだ少し問題点もあり、discussionsが用意されています。

TinySeleniumVBAの導入

Microsoft Scripting Runtime を参照

ツール>参照設定から Microsoft Scripting Runtime に参照を通してください
image.png

モジュールをプロジェクトに追加

TinySeleniumVBAの最新版をダウンロードする。

WebDriver.cls、WebElement.cls、JsonConverter.basをプロジェクトに追加してください。
※プロジェクトに追加する前に注意事項を先にお読みください
image.png

注意事項

WebDriver.cls、WebElement.cls、JsonConverter.basは、githubに公開する関係と思われるが、改行コードがLfになっています。
そのままではクラスモジュール(WebDriver.cls、WebElement.cls)が標準モジュールにインポートされてしまいます。
その状態で実行すると、「VERSION 1.0 CLASS」のところでコンパイルエラーになります。
image.png
サクラエディタなどを使用して、改行コードをCRLFとして保存し直しなおしてください。

【2022/03/22追記】

ヘッドレスモードなど設定がしやすくなったv0.1.2をリリースしました。プロジェクトへのインポートがうまくいかない問題にも対応済みです。ドラッグ&ドロップでインポートできます。お試しくださいませ

v0.1.2以降であれば、ドラッグ&ドロップでそのままインポートできるようになっていました。
現時点の最新版v0.1.3で確認しました。

WebDriverのダウンロード

WebDriverをダウンロードしてください(ブラウザのメジャーバージョンと同じもの)

自分のPC 64bit、Office 365 32bitという環境で、PCに合わせてEdge64bit版をダウンロードしました。
C:¥Tools¥edgedriver_win64フォルダ配下に格納しました。
image.png

TinySeleniumVBAの修正(WebDriver Ver.128以降)

WebDriver Ver.128以降からデフォルトポート 9515をやめてランダムに変更されました。

これにより、ポート指定をしていなかったTinySeleniumVBAでエラーが発生するようになりました。
下記の部分を修正してください。

WebDriver.cls
' Launch Edge Driver
Public Sub Edge(ByVal driverPath As String, Optional ByVal driverUrl As String = "http://localhost:9515")
    start driverPath & " --port=9515", driverUrl, "MicrosoftEdge"
End Sub

' Launch Chrome Driver
Public Sub Chrome(ByVal driverPath As String, Optional ByVal driverUrl As String = "http://localhost:9515")
    start driverPath & " --port=9515", driverUrl, "chrome"
End Sub

TinySeleniumVBAのサンプル

TinySeleniumVBAに最初に入っている「Example.bas」ではグーグル検索で「"yomoda soba"」を検索するようになっています。
image.png
たまにエラーが出るときがありました。しかし、デバッグしていくとエラーが出ません。
image.png

Sleepの追加

たぶん処理が速すぎるのかと思い、Sleepを入れたところ安定するようになりました。
image.png

Example.bas
' ==========================================================================
' Example
' ==========================================================================
Option Explicit

Private Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal ms As Long)

Public Sub main()
    ' Start WebDriver (Edge)
    Dim Driver As New WebDriver
    'Driver.Edge "path\to\msedgedriver.exe"
    Driver.Edge "C:\Tools\edgedriver_win64\msedgedriver.exe"

    ' Open browser
    Driver.OpenBrowser
    
    ' Navigate to Google
    Driver.Navigate "https://www.google.co.jp/?q=selenium"

    ' Get search textbox
    Dim searchInput
    Set searchInput = Driver.FindElement(By.Name, "q")
    
    ' Get value from textbox
    Debug.Print searchInput.GetValue
    
    ' Set value to textbox
    searchInput.SetValue "yomoda soba"
    
    ' 1秒待機
    sleep 1000

    ' Click search button
    Driver.FindElement(By.Name, "btnK").Click
    
    ' Refresh - you can use Execute with driver command even if the method is not provided
    Driver.Execute Driver.CMD_REFRESH
End Sub

TinySeleniumVBAでWebアプリ操作

前記事でVB.NETにてWebView2コントロールを使用して、体脂肪率を計算するサイトで身長と体重をセットして体脂肪率を求めました。

TinySeleniumVBAのサンプルでも同じようにしてみます。
Excelらしくセルに身長と体重をセットして、体脂肪率のセルに値をセットされるようにします。
image.png
体脂肪率ボタンをクリックすると、Keisan 生活や実務に役立つ計算サイト - 体脂肪率のサイトが開きます。身長と体重をセットして自動で計算ボタンをクリックします。
image.png
体脂肪率の結果を取得して、体脂肪率セルに値をセットします。
image.png

ソースコード

Example.bas
Option Explicit

Private Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal ms As Long)

Public Sub main()
    ' Start WebDriver (Edge)
    Dim Driver As New WebDriver
    Driver.Edge "C:\Tools\edgedriver_win64\msedgedriver.exe"
    
    ' Open browser
    Driver.OpenBrowser
    
    ' BMI計算サイト
    Driver.Navigate "https://keisan.casio.jp/exec/system/1161228728"

    ' 身長をセット
    Dim height
    Set height = Driver.FindElement(By.ID, "var_身長")
    height.SetValue Cells(1, 2).value
    
    ' 体重をセット
    Dim weight
    Set weight = Driver.FindElement(By.ID, "var_体重")
    weight.SetValue Cells(2, 2).value
    
    ' ボタンクリック
    Driver.FindElement(By.ID, "executebtn").Click
    
    ' 1秒待機
    sleep 1000
    
    ' BMIをセット
    Dim bmi
    Set bmi = Driver.FindElement(By.ID, "ans1")
    Cells(3, 2).value = bmi.GetText

    ' Shutdown
    Driver.Shutdown
End Sub

最後に

現在リリースされている Windows 10 LTSC や Windows Server は IE11 アプリのサポート終了の対象外となるため、OSサポート終了の2029年が IE11の真の終焉となるようです。
EdgeのIEモードでWebページの操作は難しいようです。APIを駆使すればできるようですが、それなら素直にTinySeleniumVBAを使いましょう。

21
18
91

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18