その他

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

スポンサーリンク

動作準備

今回は、以前の記事で扱ったエクセル、プログラムを利用することを前提としたお話になります。

まだ前回の記事を読まれていない方は、是非下記リンクから一読して頂けると嬉しいです。

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

経緯

seleniumBasicでは、webdriver.hwndやgethandleのような関数でハンドルを取得することができません。

以前はobjIE.hwndで取得することができましたが、seleniumでは標準にメソッドの用意がされていないため取得不可能となっています。

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

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

プログラム(メイン)


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]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

雑記

某うどんチェーン店にある「タル鶏天ぶっかけうどん」が美味しいと話題になっていますね。

私も先日食べてみたのですが、しっかり下味のついた鶏天と濃厚なタルタルソースがうどんの汁と絶妙な相性でした。揚げ物だし、タルタルソースも濃いし、少し重たそうなイメージを持っていたけど、実際に食べてみるとペロッと完食できました。

期間限定メニューなので、興味のある方は早めに食べに行ってみて下さい。

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

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

スポンサーリンク

-その他