ホームページ操作している中で、下図の様なダイアログボックスが出現することがあります。
ダイアログボックスのボタンを操作するには、専用のクラスが用意されています。そこで、今回はSeleniumBaisicの操作(応用編)第1回目として、下図Web操作フロー図の中の「ダイアログボックスの操作」について解説していきます。
ブラウザの起動 |
Web操作 |
ブラウザを閉じる |
Web要素のキャッチ |
ウィンドウの操作 |
フレームの移動 |
スクリーンショットの取得 |
HTML情報の取得 |
Cookie情報取得 |
クリック |
文字列入力 |
チェックボックス操作 |
ドラッグアンドドロップ |
ドロップダウンリスト選択 |
ダイアログボックスの操作 |
テーブルデータの取得 |
ファイルダウンロード |
Web要素のプロパティ取得 |
マクロファイル ダウンロード
このページで掲載しているVBAのマクロファイルを以下リンクからダウンロードできます。必要に応じてファイルダウンロードして活用ください。
ダウンロードファイルのマクロ実行注意事項(ここをクリック)
ファイルダウンロード後、マクロ実行するまでの注意事項を記載しておきます。
マクロファイルを実行するには、事前にSeleniumBasicをインストールしておく必要があります。同時にChromeDriverを現在のChromeブラウザのバージョンに合わせて更新しておきます。SeleniumBasicのインストールとChromeDriverの更新については以下記事を参照ください。
マクロファイルを開き、「コンテンツの有効化」をクリックします。
Web上からダウンロードしたマクロファイルはデフォルトで実行できない様に設定されています。ダウンロードしたマクロファイルを開いて以下の様に(このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。)表示される場合はファイルプロパティを変更します。
ファイルプロパティを開いて、セキュリティ項目の「許可する」にチェックを入れ、「OK」をクリックする。
VBE(Visual Basic Editor)画面の参照設定を開き、「Selenium Type library」にチェックを入れて、OKをクリックします。
一度ファイルを閉じて、再度ファイルを開き、「コンテンツの有効化」をクリックします。その後、マクロ実行します。ダウンロードファイルは基本的に実行ボタンを実装していませんので、マクロファイルを実行するには、VBEを開き、デバッグ実行によって、スクリプト実行します。
Excelファイルを開いた後、Alt + F11にてVBEエディタを開き、該当のプロシージャまでカーソル移動して、F5にてデバッグ実行します。
オブジェクト設定
ダイアログボックスを操作する際はよくオブジェクトを変数に格納して操作します。
変数設定例は以下のとおりです。
Dim dlg As Alert
続いてオブジェクトの設定は以下の様にします。
Set dlg = driver.SwitchToAlert()
変数dlgに対していくつかのメソッドが用意されていますので、各メソッドについてこれから説明していきます。
ダイアログボックスの操作
ダイアログボックスの操作の基本的な流れは以下のとおりです。
「ホームページを開く」⇒「Web要素のキャッチ」⇒「Web要素をクリック」⇒(ダイアログボックスの出現)⇒「ドライバーをダイアログボックスに移す」⇒「ダイアログボックスの操作」
今回は、(ダイアログボックスの出現)⇒「ドライバーをダイアログボックスに移す」⇒「ダイアログボックスの操作」について解説します。
「OK」の選択(Accept)
ダイアログボックスが出現した後、「OK」や「はい」等の承認ボタンを選択するメソッドを解説します。
Private Sub Handle_DialogBox_Accept()
Dim driver As New ChromeDriver
driver.Get "https://www.tagindex.com/javascript/window/confirm.html"
' ダイアログを表示
driver.FindElementByXPath("//*[@id='content']/section[1]/figure/p/input").Click
'dlgオブジェクトにダイアログボックスを代入
Dim dlg As Alert: Set dlg = driver.SwitchToAlert
driver.Wait 2000
dlg.Accept '「OK」ボタンをクリック
driver.Wait 2000
driver.Quit
End Sub
- 5行目
-
ダイアログボックスを出現させるリンクをクリック
- 8行目
-
アラート型変数dlgを設定し、ドライバーをdlgに移す。
- 10行目
-
「OK」ボタンを押下。dlgのメソッド「Accept」を使用。
ダイアログボックスに対象ドライバーを移動しなければエラーが発生
「キャンセル」の選択(Dissmiss)
ダイアログボックスが出現した後、「キャンセル」や「いいえ」等の承認ボタンを選択するメソッドを解説します。
Private Sub Handle_DialogBox_Dismiss()
Dim driver As New ChromeDriver
driver.Get "https://www.tagindex.com/javascript/window/confirm.html"
' ダイアログを表示
driver.FindElementByXPath("//*[@id='content']/section[1]/figure/p/input").Click
'dlgオブジェクトにダイアログボックスを代入
Dim dlg As Alert: Set dlg = driver.SwitchToAlert
driver.Wait 2000
dlg.Dismiss '「キャンセル」ボタンをクリック
driver.Wait 2000
dlg.Accept '「OK」ボタンをクリック
Debug.Print dlg.Text
driver.Wait 2000
driver.Quit
End Sub
- 5行目
-
ダイアログボックスを出現させるリンクをクリック
- 8行目
-
アラート型変数dlgを設定し、ドライバーをdlgに移す。
- 10行目
-
「キャンセル」ボタンを押下。dlgのメソッド「Dissmiss」を使用。
- 13行目
-
続いて出現するダイアログボックスに対して「OK」ボタンを押下。
ドライバーは既にダイアログボックスに移っている状態なので、SwitchToAlertは不要。
ChromeDriverクラスのFindElementByCssメソッドを利用してWeb要素をキャッチします。また、elmオブジェクトに当該のWeb要素を代入します。
文字列の入力(SendKeys)
ダイアログボックスに文字列を入力する場合の例を以下で解説します。
Private Sub InputText_DialogBox()
Dim driver As New ChromeDriver
driver.Get "https://www.tagindex.com/javascript/window/prompt.html"
driver.FindElementByXPath("//*[@id='content']/section[1]/figure/p/input").Click
'dlgオブジェクトにダイアログボックスを代入
Dim dlg As Alert: Set dlg = driver.SwitchToAlert
driver.Wait 2000
dlg.SendKeys "tama"
dlg.Accept
driver.Wait 2000
driver.Quit
End Sub
- 4行目
-
ダイアログボックスを出現させるリンクをクリック
- 7行目
-
アラート型変数dlgを設定し、ドライバーをdlgに移す。
- 9行目
-
入力ボックスに「tama」を入力。dlgのメソッド「SendKeys」を使用。
- 13行目
-
続いて出現するダイアログボックスに対して「OK」ボタンを押下。
ドライバーは既にダイアログボックスに移っている状態なので、SwitchToAlertは不要。
ダイアログボックス関連のエラー
UnexpectedAlertOpenError
UnexpectedAlertOpenError
unexpected alert open: {Alert text : }
(Session info: chrome=・・・)
(Driver info: chromedriver=・・・)
原因
予期せぬアラートが発生した場合に出現するエラーです。詳細は、usage_alertで解説しています。
対処方法
予期せぬアラートが出た場合、アラート画面のOKボタンをクリックした上でエラー発生をOn Error GoTo ErrHandleでエラー回避し、処理を続行しています。
Private Sub UnexpectedAlert_handle()
On Error GoTo ErrHandle
Dim driver As New ChromeDriver
driver.SetCapability "unexpectedAlertBehaviour", "accept"
driver.Get "https://www.tagindex.com/javascript/window/confirm.html"
driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
Dim dlg As Alert: Set dlg = driver.SwitchToAlert(Raise:=False)
ErrResume:
driver.Get "https://www.tagindex.com/javascript/window/alert1.html"
driver.Wait 2000
driver.Quit
Exit Sub
ErrHandle:
Debug.Print Err.Description
Resume ErrResume
End Sub
エラー発生例
Private Sub UnexpectedAlert_Error()
On Error GoTo ErrHandle
Dim driver As New ChromeDriver
driver.SetCapability "unexpectedAlertBehaviour", "ignore"
driver.Get "https://www.tagindex.com/javascript/window/confirm.html"
driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
Dim dlg As Alert: Set dlg = driver.SwitchToAlert(Raise:=False)
driver.Get "https://www.tagindex.com/javascript/window/alert1.html" 'ここでエラーが発生
Exit Sub
ErrHandle:
Debug.Print Err.Description
driver.Wait 2000
driver.Quit
End Sub
NoAlertPresentError
NoAlertPresentError
no such alert
(Session info: chrome=・・・)
(Driver info: chromedriver=・・・)
原因
ダイアログボックスが出現していない状態で、ダイアログボックスハンドルをしようとした場合に発生するエラーです。
対処方法
ダイアログボックスが出現しないことが事前に分かっている場合は、ダイアログボックスハンドルをしなければエラー回避することができます。
エラー発生例
Private Sub NoAlertPresent_Error()
On Error GoTo ErrHandle
Dim driver As New ChromeDriver
driver.Get "https://www.tagindex.com/javascript/window/alert1.html"
Dim dlg As Alert: Set dlg = driver.SwitchToAlert 'ここでエラー発生
driver.Quit
Exit Sub
ErrHandle:
Debug.Print Err.Description
driver.Quit
End Sub