VBAでIE自動化を行っています。
目的のサイトはログイン時にBasic認証があり、以下URL先のページを参考にコードを組みました。
https://www.vba-ie.net/collection/iebasic.php
※以下コードは、サイト様からの抜粋です。
VBA
1 2Sub sample() 3 4 Dim objIE As InternetExplorer 5 6 'Basic認証(ベーシック認証)ページへアクセスする 7 Call ieBasic(objIE, "http://www.vba-ie.net/basic/test3.html", "dXNlcjoxMjM0NTY=") 8 9End Sub 10 11Sub ieBasic(objIE As InternetExplorer, _ 12 urlName As String, _ 13 idPass As String) 14 15 Dim headValue As String 16 17 'IEのオブジェクトを作成する 18 Set objIE = CreateObject("InternetExplorer.Application") 19 20 'IEを表示 21 objIE.Visible = True 22 23 'Authorization情報 24 headValue = "Authorization: Basic " & idPass & vbCrLf 25 26 '指定したBasicURLのページを表示する 27 objIE.navigate urlName, , , , headValue 28 29 'IEが完全表示されるまで待機 30 Call ieCheck(objIE) 31 32End Sub
BASE64エンコードも正しく行い、一度目の認証はクリアしてログイン画面まで到達したのですが、
ログインボタンを押した後、再度Basic認証画面が出てきました。
上記サイト様の注意書きにもあるように、Basic認証は2つ出る場合があり、
2つ目の制御には直接キーを送信するSendkeyくらいしかないようなことが書かれていますが、
UI Automation値を取得するAccExplorerを使用して確認したところ、ウインドウとOKボタンが取得できており、
試しにAccExplorerの[Do It]ボタンを押すとOKが押されました。
ハンドルを全取得するツールを使用しても取得できなかったウインドウタイトルやクラス名が判明したため、
ウインドウハンドルを取得して、OKと名の付く値を押すよう、以下のコードを組みました。
▼OKボタンのパラメーター
ウインドウタイトル:"Windows セキュリティ"
ウインドウクラス :"Credential Dialog Xaml Host"
ボタンタイトル :"OK"
VBA
1 Dim objIE As InternetExplorer 2 Dim t As String 3 Dim o As Object 4 Dim objDocument As Object 5 Dim hwnd As LongPtr 6 Dim uiAuto As CUIAutomation 7 Dim elmIE As IUIAutomationElement 8 Dim elmNotificationBar As IUIAutomationElement 9 Dim elmSaveSplitButton As IUIAutomationElement 10 Dim elmSaveDropDownButton As IUIAutomationElement 11 Dim elmSaveMenu As IUIAutomationElement 12 Dim elmSaveMenuItem As IUIAutomationElement 13 Dim elmIEDialog As IUIAutomationElement 14 Dim elmSaveAsButton As IUIAutomationElement 15 Dim elmSaveAsWindow As IUIAutomationElement 16 Dim elmFileNameEdit As IUIAutomationElement 17 Dim elmSaveButton As IUIAutomationElement 18 Dim elmNotificationText As IUIAutomationElement 19 Dim elmCloseButton As IUIAutomationElement 20 Dim iptn As IUIAutomationInvokePattern 21 Dim vptn As IUIAutomationValuePattern 22 23 Const ROLE_SYSTEM_BUTTONDROPDOWN = &H38& 24 Call ieBasic(objIE, ログインページのURL, BASE64エンコード文字列=ベーシック認証ユーザー名,ベーシック認証パスワード) 25 Call wait(objIE) 26 27 Dim htmlDoc As HTMLDocument 28 Set htmlDoc = objIE.document 29 30 On Error Resume Next 31 htmlDoc.getElementsByName("username")(0).Value = ユーザー名 32 htmlDoc.getElementsByName("password")(0).Value = パスワード 33 htmlDoc.getElementsByClassName("login-button")(0).Click 34 35 Sleep 5000 36 37 hwnd = FindWindow("Credential Dialog Xaml Host", "Windows セキュリティ") 38 Set uiAuto = New CUIAutomation 39 Set elmIE = uiAuto.ElementFromHandle(hwnd) 40 41 '''Set objDocument = IEDOMFromhWnd(hwnd) 42 'ソースの確認 43 ''''Debug.Print objDocument.body.innerHTML 44 45 Dim hButton As Long 46 hButton = FindWindowEx(hwnd, 0&, "Credential Dialog Xaml Host", "OK") 47 48 Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする 49 Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする 50 51 '[Internet Explorer]ダイアログ((ファイル名) で行う操作を選んでください)取得 52 Do 53 Set elmIEDialog = _ 54 GetElement(uiAuto, _ 55 elmIE, _ 56 UIA_NamePropertyId, _ 57 "Credential Dialog Xaml Host", _ 58 UIA_WindowControlTypeId) 59 DoEvents 60 Loop Until (Not elmNotificationBar Is Nothing) Or _ 61 (Not elmIEDialog Is Nothing) 62 63 Do 64 Set elmSaveAsWindow = _ 65 GetElement(uiAuto, _ 66 uiAuto.GetRootElement, _ 67 UIA_NamePropertyId, _ 68 "OK", _ 69 UIA_WindowControlTypeId) 70 DoEvents 71 Loop While elmSaveAsWindow Is Nothing 72 73 Set elmSaveButton = _ 74 GetElement(uiAuto, _ 75 elmSaveAsWindow, _ 76 UIA_NamePropertyId, _ 77 "OK", _ 78 UIA_ButtonControlTypeId) 79 If elmSaveButton Is Nothing Then Exit Sub 80 Set iptn = elmSaveButton.GetCurrentPattern(UIA_InvokePatternId) 81 iptn.Invoke
Basic認証のウインドウハンドルは取得できているのですが、
最初のDoでループから抜けてくれません(以下部分)。
VBA
1 Do 2 Set elmIEDialog = _ 3 GetElement(uiAuto, _ 4 elmIE, _ 5 UIA_NamePropertyId, _ 6 "Credential Dialog Xaml Host", _ 7 UIA_WindowControlTypeId) 8 DoEvents 9 Loop Until (Not elmNotificationBar Is Nothing) Or _ 10 (Not elmIEDialog Is Nothing)
どこが間違っているのか見当がつかず、こちらにご相談させていただきました。
何かヒントになるようなことでも構いませんので、お教えいただけるとありがたいです。
どうか宜しくお願いいたします。
追記:2019/08/22 10:50
お伝えし忘れていました。
以下部分のコードは、UI Automationとは別の方法でボタンを押そうとしている処理です。
ウインドウハンドルは取得できていますが、ボタンが取得できていません。
変数hButtonの中身を見ると、0が代入されていました。
VBA
1 hwnd = FindWindow("Credential Dialog Xaml Host", "Windows セキュリティ") 2 Set uiAuto = New CUIAutomation 3 Set elmIE = uiAuto.ElementFromHandle(hwnd) 4 5 '''Set objDocument = IEDOMFromhWnd(hwnd) 6 'ソースの確認 7 ''''Debug.Print objDocument.body.innerHTML 8 9 Dim hButton As Long 10 hButton = FindWindowEx(hwnd, 0&, "Credential Dialog Xaml Host", "OK") 11 12 Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする 13 Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする 14
追記:2019/08/26 16:13
開発環境
Windows10 x64
Office Excel 2013 x86

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/26 07:16
2019/08/26 07:19
2019/08/26 08:52
2019/08/26 13:07