SeleniumBasicの操作(応用編)第1回:ダイアログボックスの操作

 ホームページ操作している中で、下図の様なダイアログボックスが出現することがあります。

 ダイアログボックスのボタンを操作するには、専用のクラスが用意されています。そこで、今回はSeleniumBaisicの操作(応用編)第1回目として、下図Web操作フロー図の中の「ダイアログボックスの操作」について解説していきます。

スクロールできます
ブラウザの起動
Web操作
ブラウザを閉じる

Web要素のキャッチ
ウィンドウの操作
フレームの移動
スクリーンショットの取得
HTML情報の取得
Cookie情報取得
(Web操作の代表的な操作例)

クリック
文字列入力
チェックボックス操作
ドラッグアンドドロップ
ドロップダウンリスト選択
ダイアログボックスの操作
テーブルデータの取得
ファイルダウンロード
Web要素のプロパティ取得
(Web要素キャッチ後のメソッド例)
目次

マクロファイル ダウンロード

 このページで掲載しているVBAのマクロファイルを以下リンクからダウンロードできます。必要に応じてファイルダウンロードして活用ください。

ダウンロードファイルのマクロ実行注意事項(ここをクリック)

 ファイルダウンロード後、マクロ実行するまでの注意事項を記載しておきます。

STEP
SeleniumBasicのインストール、ChromeDriverの更新

 マクロファイルを実行するには、事前にSeleniumBasicをインストールしておく必要があります。同時にChromeDriverを現在のChromeブラウザのバージョンに合わせて更新しておきます。SeleniumBasicのインストールとChromeDriverの更新については以下記事を参照ください。

STEP
コンテンツの有効化

マクロファイルを開き、「コンテンツの有効化」をクリックします。

STEP
セキュリティ リスク設定の確認

 Web上からダウンロードしたマクロファイルはデフォルトで実行できない様に設定されています。ダウンロードしたマクロファイルを開いて以下の様に(このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。)表示される場合はファイルプロパティを変更します。

STEP
ファイルプロパティの変更

 ファイルプロパティを開いて、セキュリティ項目の「許可する」にチェックを入れ、「OK」をクリックする。

STEP
Selenium Type libraryのチェック

 VBE(Visual Basic Editor)画面の参照設定を開き、「Selenium Type library」にチェックを入れて、OKをクリックします。

STEP
デバッグ実行

 一度ファイルを閉じて、再度ファイルを開き、「コンテンツの有効化」をクリックします。その後、マクロ実行します。ダウンロードファイルは基本的に実行ボタンを実装していませんので、マクロファイルを実行するには、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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAを中心とした自動化、効率化の手法を紹介しています。現在は、SeleniumBasicのexamplesを紹介しています。その内、SeleniumBasic以外の手法も掲載したいと思っております。

目次