VBA[001]SeleniumBasic Tips

<SeleniumBasic の保存フォルダを開く>

Sub OpenSeleniumFolder()
    Const LOCAL_APPDATA As Long = 28   
    With CreateObject("Shell.Application")
        .Explore .Namespace(LOCAL_APPDATA).self.Path & "\SeleniumBasic"
    End With   
End Sub




<プログラム終了後にブラウザを閉じない>

  • プロシージャの外部(宣言部)でドライバの変数を宣言する。
Option Explicit
Private webDrv As New Selenium.WebDriver	'// 宣言部で変数宣言
Sub OpenYahoo()   
    With webDrv
        .Start "Edge"
        .Get "https://www.yahoo.co.jp/"
    End With
End Sub




<アラートの[OK]ボタンを押す>

    webDrv.SwitchToAlert.accept




<要素の属性の値を取得する>

  • コード例:onClick属性の値を取得
    val = webDrv.FindElementByName("hoge").Attribute("onClick")




チェックボックスの on、off を切り替える>

    '// 未チェックならチェックする
    With webDrv.FindElementByName("hoge")
        If Not .IsSelected Then .Click
    End With




<ページが読み込まれるまで待つ>

  • Selenium側で自動的に待機してくれるが完璧ではない。
  • Busyプロパティや、ReadyStateプロパティのようなものはないので、指定した要素が読み込まれるまで一定時間の待機を繰り返す。
  • コード例:name属性が "user_id" の要素が読み込まれてない場合は200ミリ秒待つ
    Dim n As Long
    Dim t As Long    
    Do While n < 1
        n = webDrv.FindElementsByName("user_id").Count
        webDrv.Wait 200
        
        '// 無限ループにならないように最大20秒で終了する
        t = t + 200
        If t > 20000 Then
            MsgBox "ブラウザの応答がありません。"
            Exit Do
        End If
    Loop




<テキストボックスへの入力>

  • SendKeysメソッドは追記されるので、一旦テキストボックスをクリアにしてから入力する。
  • コード例:
    With webDrv.FindElementByName("userName")
        .Clear
        .SendKeys "Bill Gates"
    End With




JavaScriptを実行する>

  • コード例:
    Dim jsStr as String
    jsStr = "setUserId('A0001'), onForcusSubmit('/system/UserChangeAction.action', 'userChange')"
    webDrv.ExecuteScript jsStr




<画像をクリックする>

  • src属性に含まれている画像のファイル名で img要素を特定する。
  • コード例:
    Dim elm
    For Each elm In webDrv.FindElementsByTag("img")
        If InStr(elm.Attribute("src"), "hoge.png") > 0 Then
            elm.Click
            Exit For
        End If
    Next elm




<操作対象をポップアップウィンドウに切り替える>

    webDrv.SwitchToNextWindow




<指定した要素までスクロールする>

  • コード例:4番目の aタグまでスクロールする場合
    webDrv.FindElementsByTag("a")(3).ScrollIntoView




<Windowのタイトルを取得する>

  • コード例:
    Dim wTitle as String
    wTitle = webDrv.Window.Title




<エラーで終了した場合にプロセスが残らないようにする(例外処理)>

  • VBAには、try ~ catch 構文がないので、例外処理は On Error Goto ステートメントで行う。
  • コード例:
Sub Main()
    On Error Goto label
    '---
    '---
    '---
    Exit Sub
label:
    webDrv.Quit
End Sub