前回の記事で Autoit で Microsoft Edge を操作するための準備を紹介しました。
今回は、Autoit で Microsoft Edge を操作するサンプルコードを紹介します。
準備が正しくないとコードも正しく動作しませんので、よく確認をしてから実行してください。
サンプルコードで出来ること
- Edge ブラウザーを開く(WebDriverを通して)
- 新しいタブを開く
- 現在のタブを閉じる(最後に開いたタブ)
- 最後に開いたタブのページのソースを取得し、メモ帳で開く
- ウィンドウの最大化と元に戻す(縮小)
- ウィンドウの最小化と元に戻す
- 現在のタブ(最後に開いたタブ)で指定した URL を開く
サンプルコード
If @OSArch <> “X64” Then Exit で 64ビットではない OS では起動できないようにしています。
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <wd_core.au3>
#include <Array.au3>
#include-once
If @OSArch <> "X64" Then Exit
Global $sess, $sCurrentTabHandle, $Running = 0, $aa[1], $tab = 0
$ProgramFilesDir = @HomeDrive & '\Program Files (x86)'
; WebDriver の場所は環境に応じて変更してください。
$EdgeDriver = $ProgramFilesDir & "\autoit3\WebDriver\msedgedriver.exe"
$sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"ms:edgeOptions": {"binary": "' & _
StringReplace($ProgramFilesDir, "\", "/") & '/Microsoft/Edge/Application/msedge.exe"}}}}'
; コンボボックスに表示する URL
$url = "https://windows-waza.com/forced-upgrade-to-windows-11-is-not-recommended/" & "|" & _
"https://windows-waza.com/downgrade-from-windows-11-to-windows-10/" & "|" & _
"https://windows-waza.com/windows-11-boot-option/" & "|" & _
"https://windows-waza.com/win10-win11-create-a-password-reset-disk/" & "|" & _
"https://windows-waza.com/win10-win11-troubleshooting-tool/"
Setup($EdgeDriver); Web ドライバー コンソール アプリを起動します。
If @error Then
MsgBox(4096, "Error", "WebDriver が起動できませんでした。ファイルのパスを確認してください。")
Exit
EndIf
$Form1 = GUICreate("Form1", 474, 429, -1, -1, -1, $WS_EX_TOPMOST)
$Button1 = GUICtrlCreateButton("ウィンドウを最大化", 24, 56, 209, 57, $BS_MULTILINE)
$Button2 = GUICtrlCreateButton("ウィンドウを最小化", 248, 56, 209, 57, $BS_MULTILINE)
$Button3 = GUICtrlCreateButton("新しいタブを開く", 24, 128, 209, 57)
$Button4 = GUICtrlCreateButton("ページのソースを取得" & @LF & "(最後のページ)", 248, 128, 209, 57, $BS_MULTILINE)
$Button5 = GUICtrlCreateButton("Edge を開く(WebDriverを通して)", 24, 272, 433, 65)
$Button6 = GUICtrlCreateButton("現在のタブを閉じる(最後に開いたタブ)", 24, 352, 433, 65)
$Combo1 = GUICtrlCreateCombo("", 24, 200, 433, 25, $CBS_DROPDOWN)
GUICtrlSetData(-1, $url)
$Button7 = GUICtrlCreateButton("上のURLを開く(最後に開いたタブで開く)", 24, 232, 433, 25)
$Label1 = GUICtrlCreateLabel("MicroSoft Edge ブラウザーを操作するサンプルを作ってみました。" & @LF & _
"なるべく簡単なコードにしてみましたので、参考にしてみて下さい。", 24, 8, 400, 40)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_WD_DeleteSession($sess); 既存のセッションを削除
_WD_Shutdown(); Webdriverを終了
Exit
Case $Button1
If $Running Then
If GUICtrlRead($Button1) = "ウィンドウを最大化" Then
_WD_Window($sess, 'MAXIMIZE'); ウィンドウを最大化
GUICtrlSetData($Button1, "ウィンドウを元に戻す" & @LF & "(縮小)")
GUICtrlSetData($Button2, "ウィンドウを最小化")
Else
_WD_Window($sess, 'rect', '{"handle":"' & $sCurrentTabHandle & '"}')
GUICtrlSetData($Button1, "ウィンドウを最大化")
EndIf
EndIf
Case $Button2
If $Running Then
If GUICtrlRead($Button2) = "ウィンドウを最小化" Then
_WD_Window($sess, 'MINIMIZE'); ウィンドウを最小化
GUICtrlSetData($Button2, "ウィンドウを元に戻す" & @LF & "(デフォルト)")
GUICtrlSetData($Button1, "ウィンドウを最大化")
Else
_WD_Window($sess, 'rect', '{"handle":"' & $sCurrentTabHandle & '"}')
GUICtrlSetData($Button2, "ウィンドウを最小化")
EndIf
EndIf
Case $Button3
If $Running Then
_WD_NewTab($sess); 新しいタブを開く
$aa[$tab] = $sCurrentTabHandle
$tab += 1
ReDim $aa[$tab + 1]
EndIf
Case $Button4
If $Running Then
$Source = _WD_GetSource($sess); ページのソースを取得
If $Source Then
; 取得したソースをテキストファイルに書き込む
$open = FileOpen(@TempDir & "\a.txt", 2)
FileWrite($open, $Source)
FileClose($open)
ShellExecute(@TempDir & "\a.txt"); 取得したソースをメモ帳で表示
EndIf
EndIf
Case $Button5
If Not $Running Then
; Web ドライバーから新しいセッションを要求します(Edge を開く)
$sess = _WD_CreateSession($sDesiredCapabilities)
_WD_Navigate($sess, "about:blank"); Edge を起動した時最初に表示する URL
$Running = 1
EndIf
Case $Button6
If $Running Then
If Not $tab Then
_WD_DeleteSession($sess); 既存のセッションを削除
$Running = 0
GUICtrlSetData($Button1, "ウィンドウを最大化")
GUICtrlSetData($Button2, "ウィンドウを最小化")
Else
_WD_Window($sess, "CLOSE"); 最後に開いたタブを閉じる
_WD_Window($sess, 'Switch', '{"handle":"' & $aa[$tab - 1] & '"}')
$tab -= 1
EndIf
EndIf
Case $Button7
If $Running Then
_WD_Navigate($sess, GUICtrlRead($Combo1)); 指定したURLを開く
If @error Then
MsgBox(4096, "Error", "指定した URL を開けません。URL が正しいか確認してください。", 0, $Form1)
EndIf
EndIf
Case $Label1
EndSwitch
WEnd
Func Setup($Driver)
_WD_Option('Driver', $Driver)
_WD_Option('Port', 9515)
_WD_Option('DriverParams', '--verbose --log-path="' & @ScriptDir & '\msedge.log"')
_WD_Startup()
EndFunc ;==>Setup
;https://www.autoitscript.com/forum/topic/208633-webdriver-udf-w3c-compliant-version-20221003/ より。一部変更しています。
Func _WD_NewTab($sSession, $lSwitch = True, $iTimeout = -1)
Local Const $sFuncName = "_WD_NewTab"
Local $sTabHandle = '', $sLastTabHandle, $hWaitTimer, $iTabIndex, $aTemp
If $iTimeout = -1 Then $iTimeout = $_WD_DefaultTimeout
Local $aHandles = _WD_Window($sSession, 'handles')
If @error <> $_WD_ERROR_Success Or Not IsArray($aHandles) Then
Return SetError(__WD_Error($sFuncName, $_WD_ERROR_Exception), 0, $sTabHandle)
EndIf
$iTabCount = UBound($aHandles)
; Get handle to current last tab
$sLastTabHandle = $aHandles[$iTabCount - 1]
; Get handle for current tab
$sCurrentTabHandle = _WD_Window($sSession, 'window')
If @error = $_WD_ERROR_Success Then
; Search for current tab handle in array of tab handles. If not found,
; then make the current tab handle equal to the last tab
$iTabIndex = _ArraySearch($aHandles, $sCurrentTabHandle)
If @error Then
$sCurrentTabHandle = $sLastTabHandle
$iTabIndex = $iTabCount - 1
EndIf
Else
_WD_Window($sSession, 'Switch', '{"handle":"' & $sLastTabHandle & '"}')
$sCurrentTabHandle = $sLastTabHandle
$iTabIndex = $iTabCount - 1
EndIf
_WD_ExecuteScript($sSession, 'window.open()', '{}')
If @error <> $_WD_ERROR_Success Then
Return SetError(__WD_Error($sFuncName, $_WD_ERROR_Exception), 0, $sTabHandle)
EndIf
$hWaitTimer = TimerInit()
While 1
$aTemp = _WD_Window($sSession, 'handles')
If UBound($aTemp) > $iTabCount Then
$sTabHandle = $aTemp[$iTabIndex + 1]
ExitLoop
EndIf
If TimerDiff($hWaitTimer) > $iTimeout Then Return SetError(__WD_Error($sFuncName, $_WD_ERROR_Timeout), 0, $sTabHandle)
Sleep(10)
WEnd
If $lSwitch Then
_WD_Window($sSession, 'Switch', '{"handle":"' & $sTabHandle & '"}')
Else
_WD_Window($sSession, 'Switch', '{"handle":"' & $sCurrentTabHandle & '"}')
EndIf
Return SetError($_WD_ERROR_Success, 0, $sTabHandle)
EndFunc ;==>_WD_NewTab
※Edge が開かない場合は WebDriver が古い可能性があります。お使いの Edge のバージョンと同じバージョンの WebDriver をダウンロードしてください。
なるべくわかりやすく書いてみましたので、サンプルコードを参考にいろいろと変更してみてください。
「_WD_Startup ==> General Error: Error launching web driver!」エラーが出る
2023/03/26:
コードを実行すると「_WD_Startup ==> General Error: Error launching web driver!」というエラーが表示され、WebDriver が起動できないことがあります。
筆者の環境でも先日(深夜)にこのエラーが出ましたが、翌朝には正常に起動できるようになっていました。
このエラーが出た場合、しばらく時間をおいて実行してみてください。
コメント(降順)