1 はじめに
以下のblueさんの記事の末尾に「おまけ:Basic認証を処理する」として、SeleniumBasicを利用したBasic認証のコードの記載がありました。
今回、認証サイトは同じものを利用しまして、SeleniumVBAを利用したコードによりログインを実現したいと思います。
上の記事で紹介のありました「URL埋込による方法での認証」に加えて「Chrome DevTools Protocol(CDP)を利用して認証」も「おまけ」して紹介します。
あれ?VBAでもCDPが利用できるの?と思われたかもしれません。SeleniumVBAではSelenium4で追加されたCDPサポートにも対応していて、ExcecuteCDPメソッドによりCDPのコマンドが利用できます。(SeleniumBasicでは対応していません)
他に、以下のログイン画面を表示してからSendKeysを利用して、キー送信する方法もありますので紹介します。
2 ExcelVBAコード
以下のコードを丸ごとコピーしてSeleniumVBA.xlsmに新規の標準モジュールを作成して貼り付けますと、実際に動作確認ができます。
もし、SeleniumVBAがまったく初めての方は、こちらの記事を参考に新規の標準モジュール作成まで行ってください。
Sub BasicAuth()
'=======================================
'URL指定によるBasic認証
'=======================================
Dim driver As SeleniumVBA.WebDriver
Dim caps As SeleniumVBA.WebCapabilities
Dim userName As String
Dim pw As String
Set driver = SeleniumVBA.New_WebDriver
With driver
.StartChrome
Set caps = .CreateCapabilities()
'ドライバを終了してもブラウザは開いたまま
caps.SetDetachBrowser True
.OpenBrowser caps
userName = "kaiin"
pw = "naisho"
'ログインポップアップを出さずにURLで認証
.NavigateTo "http://" & userName & ":" & pw & "@leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/"
.FindElement(By.XPath, "//a[text()='ここ']").Click
'ドライバ終了(画面はそのまま)
.Shutdown
End With
End Sub
Sub CDP_BasicAuth()
'=======================================
'CDP利用によるBasic認証
'=======================================
Dim driver As SeleniumVBA.WebDriver
Dim caps As SeleniumVBA.WebCapabilities
Dim userName As String
Dim pw As String
Dim params As Dictionary
Dim authString As String
Set driver = SeleniumVBA.New_WebDriver
With driver
.StartChrome
Set caps = .CreateCapabilities()
'ドライバを終了してもブラウザは開いたまま
caps.SetDetachBrowser True
.OpenBrowser caps
.NavigateTo "http://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/"
userName = "kaiin"
pw = "naisho"
.ExecuteCDP "Network.enable"
authString = "Basic " & EncodeStringToBase64(userName & ":" & pw)
Set params = New Dictionary
params.Add "headers", New Dictionary
params("headers").Add "authorization", authString
.ExecuteCDP "Network.setExtraHTTPHeaders", params
.FindElement(By.XPath, "//a[text()='ここ']").Click
.Shutdown
End With
End Sub
Private Function EncodeStringToBase64(text As String) As String
Dim bytes() As Byte
Dim domDoc As Object
Dim domElem As Object
bytes = StrConv(text, vbFromUnicode)
Set domDoc = CreateObject("MSXML2.DOMDocument")
Set domElem = domDoc.createElement("b64")
domElem.DataType = "bin.base64"
domElem.nodeTypedValue = bytes
EncodeStringToBase64 = Replace(domElem.text, vbLf, "")
End Function
Sub SendKeys_Auth()
'=======================================
'SendKeysによるBasic認証
'=======================================
Dim driver As SeleniumVBA.WebDriver
Dim caps As SeleniumVBA.WebCapabilities
Dim userName As String
Dim pw As String
Set driver = SeleniumVBA.New_WebDriver
With driver
.StartChrome
Set caps = .CreateCapabilities()
'ドライバを終了してもブラウザは開いたまま
caps.SetDetachBrowser True
.OpenBrowser caps
.NavigateTo "http://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/"
.FindElement(By.XPath, "//a[text()='ここ']").Click
userName = "kaiin"
pw = "naisho"
'ログインポップアップを表示してからSendKeys
VBA.SendKeys userName, True
.Wait 1000 '1秒待機
VBA.SendKeys "{TAB}", True
.Wait 1000 '1秒待機
VBA.SendKeys pw, True
.Wait 1000 '1秒待機
VBA.SendKeys "{ENTER}", True
.Wait 1000 '1秒待機
'ドライバ終了(画面はそのまま)
.Shutdown
End With
End Sub
「秘密の会員ページへようこそ!」が表示されていれば正常に動作しています。
3 出典
以下のとおり、SeleniumVBA.xlsmの標準モジュール内のサンプルコードを利用しました。
(1) URL埋込によるBasic認証
「SeleniumVBA.xlsm」⇒標準モジュール「test_Authentication」⇒プロシージャ「test_BasicAuthentication」
(2) CDP利用によるBasic認証
「SeleniumVBA.xlsm」⇒標準モジュール「test_Sendkeys」⇒プロシージャ「test_CDP_BasicAuthentication」
4 おわりに
(2025/4/12更新)
これまでSebdKeysToOSメソッドを利用する方法を紹介していましたが、vbsファイルを実行しており、将来動作しなくなるおそれがあるため、標準のSendKeysの利用に差し替えました。