その他

VBA:seleniumBasic&WebDriver(chrome,Edge等)&ハンドル情報(hwnd)[No73]

投稿日:2020年10月21日 更新日:

スポンサーリンク

動作準備

次の記事のエクセル、プログラムを利用前提の紹介となります。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

イントロ

seleniumBasicではwebdriver.hwndやgethandleのような関数でハンドルを取得できない。

以前objIE.hwndで取得できたがseleniumでは標準にメソッドの用意されていない。

次の記事で紹介している「ハンドル情報出力」か「GetAllParentHwnd」を使うことで、ブラウザのハンドルの情報を取得できます。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

プログラム(メイン)


Option Explicit

Sub ShowWebSite_HwndTest_AllWebDriver()
    Dim driver As New Selenium.WebDriver
    Call SettingWebDriver(driver)
    With driver
        .Get "http://www.yahoo.co.jp/"
        .Window.Maximize
        .Close
    End With
End Sub

Sub ShowWebSite_HwndTest_EdgeDriver()
    Dim driver As New Selenium.WebDriver
'    Dim driver As New Selenium.ChromeDriver
'    Dim driver As New Selenium.EdgeDriver
'    Dim driver As New Selenium.IEDriver
'    Dim driver As New Selenium.OperaDriver

'    Dim driver As New Selenium.FirefoxDriver
'    Dim driver As New Selenium.PhantomJSDriver
    
    Call SettingWebDriver(driver)
    With driver
        .Get "http://www.yahoo.co.jp/"
        .Window.Maximize
        .Close
    End With
End Sub

プログラム(サブ)


Option Explicit

'ウィンドウを最前面にする
'Excel 64bit用
#If VBA7 Then
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
'Excel 32bit用
#Else
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If
'ウィンドウが最小化か調べる
Declare Function IsIconic Lib "user32.dll" (ByVal hwnd As Long) As Long
'ウィンドウを元のサイズに戻す
Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function SetWindowPos Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal hWndInsertAfter As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal uFlags As Long _
    ) As Long
Private Const HWND_TOPMOST = -1     '常に最前面に設定する
Private Const HWND_NOTOPMOST = -2   '常に最前面を解除する
Private Const SWP_NOSIZE = &H1      'サイズ変更しない
Private Const SWP_NOMOVE = &H2      '位置変更しない
Private Const SWP_SHOWWINDOW = &H40 'ウィンドウを表示

Private Const SWP_NOACTIVATE = &H10  'アクティブにしない

'ウィンドウを最小化する
Private Declare Function CloseWindow Lib "user32.dll" _
   (ByVal hwnd As Long) As Long

'1ディスプレイの場合
Public Const BROWSER_TOP     As Long = 40
Public Const BROWSER_LEFT    As Long = 600
Public Const BROWSER_WIDTH   As Long = 766
Public Const BROWSER_HEIGHT  As Long = 700

Public Sub SettingWebDriver(driver As Selenium.WebDriver)

    Dim bootBrowserCaptionName
    
    'chrome(WebDriverまたはChromeDriver)の場合
    driver.Start "chrome"
    bootBrowserCaptionName = "data:, - Google Chrome"

    'MicrosoftEdge(WebDriverまたはEdgeDriver)の場合
'    driver.Start "MicrosoftEdge"
'    bootBrowserCaptionName = "data:, - プロファイル"
  
    'Internet Explorer(WebDriverまたはIEDriver)の場合
'    driver.Start "ie"
'    bootBrowserCaptionName = "空白のページ - Internet Explorer"
   
    'opera(WebDriverまたはOperaDriver)の場合
'    driver.Start "opera"
'    bootBrowserCaptionName = "data:, - Opera"

    driver.Window.SetPosition BROWSER_TOP, BROWSER_LEFT
    driver.Window.SetSize BROWSER_WIDTH, BROWSER_HEIGHT
    
    Dim BrowserHwndNo As Long
    BrowserHwndNo = GetWindowHwndNo(bootBrowserCaptionName)
    
    If BrowserHwndNo = 0 Then
        MsgBox "Error. SettingWebDriver"
        Exit Sub
    End If
    
'    '動作確認のため10秒ウィンドウを最小化
'    CloseWindow (BrowserHwndNo)
'    driver.Wait 10000

    If IsIconic(BrowserHwndNo) Then
        ShowWindowAsync BrowserHwndNo, &H9
    End If
End Sub

Public Function GetWindowHwndNo(ByVal tempCaptionName As String) As Long
    'シートにハンドル情報を出力したい場合(GetAllParentHwnd処理含)
    Call ハンドル情報出力
    'ハンドル情報を配列に格納だけしたい場合
'    Call GetAllParentHwnd
    
'   ハンドル情報の入っている配列
'   Array_hwndTypeName | Array_hwndNo | Array_captionName |Array_className
    Dim i As Long
    For i = LBound(Array_hwndTypeName) To UBound(Array_hwndTypeName)
        If InStr(1, Array_captionName(i), tempCaptionName, vbBinaryCompare) <> 0 Then
            GetWindowHwndNo = Array_hwndNo(i)
'            MsgBox Array_captionName(i)
            Exit For
        End If
    Next i
End Function

Public Sub TOPMOST_Window(hwnd As Long)
    'ウィンドウをアクティブにする
    SetForegroundWindow (hwnd)
    'ウィンドウを常に最前表示(手前表示)にする
    Call SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

Public Sub NOTOPMOST_Window(hwnd As Long)
    'ウィンドウを常に最前表示(手前表示)を解除する
    Call SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

一部コードの意味について

seleniumbasicでブラウザを起動した際のキャプション名は次の通りでした。

IE以外のブラウザはseleniumbasic起動後は「data:,」が選考に含まれていた。

  • chrome(WebDriverまたはChromeDriver)の場合

driver.Start "chrome"
bootBrowserCaptionName = "data:, - Google Chrome"
  • MicrosoftEdge(WebDriverまたはEdgeDriver)の場合

driver.Start "MicrosoftEdge"
bootBrowserCaptionName = "data:, - プロファイル"
  • Internet Explorer(WebDriverまたはIEDriver)の場合

driver.Start "ie"
bootBrowserCaptionName = "空白のページ - Internet Explorer"
  • opera(WebDriverまたはOperaDriver)の場合

driver.Start "opera"
bootBrowserCaptionName = "data:, - Opera"

動作イメージ、または補足

メインの「ShowWebSite_HwndTest_AllWebDriver」か「ShowWebSite_HwndTest_EdgeDriver」を実行すると次の動作をします。

1.SettingWebDriver関数で指定したWebDriverで初期設定しヤフーサイトを開く。

2.そのままではきちんとハンドルを取得できているか分かり難い。次のコメントアウトをなくすことで、10秒間最小化するので反映できているか分かりやすくなります。


'動作確認のため10秒ウィンドウを最小化
CloseWindow (BrowserHwndNo)
driver.Wait 10000

3.「GetWindowHwndNo」の「ハンドル情報出力」か「GetAllParentHwnd」のどちらか実行することでハンドル配列を取得できます。のでどちらかの実行は必須です。

4.「SettingWebDriver」関数の引数は「Selenium.WebDriver」。呼び出し時は「ShowWebSite_HwndTest_EdgeDriver」関数内のように例えば「Selenium.ChromeDriver」「Selenium.EdgeDriver」のインスタンス(driver)を引数にしても問題ない(「SettingWebDriver」の引数は変更しなくても良い)。

5.webdriverの初期設定は「SettingWebDriver」関数を参考にしてください。Excelのポジション(position)、ウィンドウ位置の設定をseleniumでも出来ます。


'動作確認のため10秒ウィンドウを最小化
driver.Window.SetPosition BROWSER_TOP, BROWSER_LEFT
driver.Window.SetSize BROWSER_WIDTH, BROWSER_HEIGHT

6.webdriverの場合、seleniumのstartでブラウザ指定する時の引数は以下です。


driver.Start "chrome"
driver.Start "MicrosoftEdge"
driver.Start "ie"
driver.Start "opera"

7.WebDriver毎のハンドルID、caption名、class名は以下でした。

別記事で紹介している「ハンドル情報出力」か「GetAllParentHwnd」で確認できます。

WebDriverHAND種類HANDIDcaptionNameclassName
Selenium.ChromeDriverHWND_NOW461392data:, - Google ChromeChrome_WidgetWin_1
Selenium.EdgeDriverHWND_NOW4327660data:, - プロファイル 1 - Microsoft? EdgeChrome_WidgetWin_1
Selenium.IEDriverHWND_NOW1443622空白のページ - Internet ExplorerIEFrame
Selenium.OperaDriverHWND_NOW657910data:, - OperaChrome_WidgetWin_1

関連記事

no image
ウィンドウハンドル関連の記事一覧[No74]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

タグ

-その他

© 2021 BookALittle