【SeleniumVBA】Basic認証を処理する

# １　はじめに
以下のblueさんの記事の末尾に[「おまけ：Basic認証を処理する」](https://powervbadesktop.com/web26/#toc6)として、SeleniumBasicを利用したBasic認証のコードの記載がありました。

今回、[認証サイト](https://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/)は同じものを利用しまして、SeleniumVBAを利用したコードによりログインを実現したいと思います。

https://powervbadesktop.com/web26/

上の記事で紹介のありました「**URL埋込による方法での認証**」に加えて「**Chrome DevTools Protocol（CDP）を利用して認証**」も「おまけ」して紹介します。

あれ？VBAでもCDPが利用できるの？と思われたかもしれません。SeleniumVBAではSelenium4で追加されたCDPサポートにも対応していて、ExcecuteCDPメソッドによりCDPのコマンドが利用できます。(SeleniumBasicでは対応していません)

:::note
他に、以下のログイン画面を表示してからSendKeysを利用して、キー送信する方法もありますので紹介します。
:::

![image-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/d2c193c7-614e-1dff-b23c-9a8403bcbd45.png)

# ２　ExcelVBAコード
以下のコードを丸ごとコピーしてSeleniumVBA.xlsmに新規の標準モジュールを作成して貼り付けますと、実際に動作確認ができます。

:::note
もし、SeleniumVBAがまったく初めての方は、[こちら](https://note.com/sele_chan/n/n61a67c4379de)の記事を参考に**新規の標準モジュール作成**まで行ってください。
:::

```vb:(1) URL指定によるBasic認証
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
```

```vb:(2) CDP利用によるBasic認証
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
```

```vb:(3) SendKeysによるBasic認証
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
```
:::note
「秘密の会員ページへようこそ！」が表示されていれば正常に動作しています。
:::

# ３　出典
以下のとおり、SeleniumVBA.xlsmの標準モジュール内のサンプルコードを利用しました。
## (1) URL埋込によるBasic認証
「SeleniumVBA.xlsm」⇒標準モジュール「test_Authentication」⇒プロシージャ「test_BasicAuthentication」

## (2) CDP利用によるBasic認証
「SeleniumVBA.xlsm」⇒標準モジュール「test_Sendkeys」⇒プロシージャ「test_CDP_BasicAuthentication」

# ４　おわりに
**(2025/4/12更新)**
これまでSebdKeysToOSメソッドを利用する方法を紹介していましたが、vbsファイルを実行しており、将来動作しなくなるおそれがあるため、標準のSendKeysの利用に差し替えました。