こんにちは、blueです。
スクレイピングの最中に以下のような表示が出たことはないでしょうか?
これはJavaScriptによって表示されるダイアログなのですが、HTMLで表示されているわけはない為、これまでのような要素の取得による方法では操作ができません。またダイアログにも種類がある為それぞれの方法を使う必要があります。
そこで今回はSelenium-VBAにおけるアラート操作について説明をします。
この記事を読むと
・アラートを含めた各種ダイアログを操作できる
・Basic認証を処理できる
ようになります。コードは簡単に書けるのでぜひ勉強していってください。
VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。今回のアラートダイアログやBasic認証に関する処理についても記載がなされており、困ったときに参考になります。
VBAの書籍の中でSeleniumBasicを取り上げている数少ない書籍です。ページ数としては20ページほどですがとてもわかりやすく書かれています。またVBA全般を網羅した内容が書かれており、長く使用することができます。
ダイアログについて
Webページを表示した際にポップアップするボックスはJavaScriptによって作成されています。
JavaScriptのダイアログには以下のようなものがあります。
- アラートダイアログ
- 確認ダイアログ
- 入力ダイアログ
それぞれに対するスクレイピングの方法について以降で説明します。
なお今回のサンプルとしては以下のサイトを使用しました。
JavaScriptだけではなくHTMLやCSSのサンプルコードが記載されているサイトですが、今回ダイアログ操作用に使わせていただきます。
アラートダイアログ1(クリック時)
以下のようなダイアログをアラートダイアログ、警告ダイアログといいます。
ボタンクリック時に出るアラートダイアログを操作するコードは以下になります。
アラートダイアログのサイトは以下を使っています。
ちなみにそのまま実行すると処理が早すぎてアラートダイアログなどが見れません。
F8キーなどで一つずつ処理してみてください。
Sub 警告ダイアログのOKを押す1()
Dim Driver As New Selenium.WebDriver
Driver.Start "Chrome"
Driver.Get "https://www.tagindex.com/javascript/window/alert1.html"
Driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
Driver.SwitchToAlert.Accept
End Sub
ここで使用しているのはSwitchToAlertメソッドとAcceptメソッドになります。
- Driver.SwitchToAlert.Accept
このメソッドを使うことで、ページ中のアラートダイアログにフォーカスを移すことができます。
またAcceptメソッドを使うことにより、警告ダイアログを受け入れることができます。
アラートダイアログ2(ページ移動時)
ページ移動時に出るアラートダイアログを操作するコードは以下になります。
アラートダイアログのサイトは以下を使っています。
Sub 警告ダイアログのOKを押す2_ページ移動時に表示するタイプ()
Dim Driver As New Selenium.WebDriver
Dim a As String
Dim instance As Actions
Driver.Start "Chrome"
Driver.Get "https://www.tagindex.com/javascript/window/alert2.html"
Driver.FindElementByCss("#content > section.overview > figure > p > a:nth-child(1)").Click
’広告が表示されるためもう一度戻って処理を行う
Driver.Get "https://www.tagindex.com/javascript/window/alert2.html"
Driver.FindElementByCss("#content > section.overview > figure > p > a:nth-child(1)").Click
Driver.SwitchToAlert.Accept
End Sub
F8キーで確認してもらうとわかると思いますが、同じサイトを2回表示させているのは途中に広告が表示されるためです。
広告の処理は少し難しい為ここでは割愛しますが、一度Cookieに記憶させてしまえば2回目からは広告が出ない性質を利用して、再度処理を行っています。
なお、アラートダイアログに対するコードは前回と同じでSwitchToAlertメソッドを使っています。
確認ダイアログ
以下のようなダイアログを確認ダイアログといいます。
「OK」ボタンと「キャンセル」ボタンがついているのが特徴です。
確認ダイアログを操作するコードは以下になります。
確認ダイアログのサイトは以下を使っています。
こちらもF8キーなどで一つずつ処理してみてください。
Sub 確認ダイアログのOKを押す()
Dim Driver As New Selenium.WebDriver
Driver.Start "Chrome"
Driver.Get "https://www.tagindex.com/javascript/window/confirm.html"
Driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
'OKの場合
Driver.SwitchToAlert.Accept
'キャンセルの場合
'Driver.SwitchToAlert.Dismiss
'Driver.SwitchToAlert.Accept
End Sub
ここで使用しているのもSwitchToAlertメソッドとAcceptメソッド、Dismissメソッドになります。
- Driver.SwitchToAlert.Accept
- Driver.SwitchToAlert.Dismiss
ページ中のダイアログにフォーカスを移すのは同じですが、ウィンドウにボタンが2つ存在するので「OK」の場合はAcceptメソッド、「キャンセル」の場合はDismissメソッドを使います。このサイトの場合キャンセルの後は再度アラートダイアログが表示されるのでAcceptメソッドを使っています。
入力ダイアログ
以下のようなダイアログを入力ダイアログといいます。
ユーザーに入力を促すテキストボックスを表示させているのが特徴です。
入力ダイアログを操作するコードは以下になります。
アラートダイアログのサイトは以下を使っています。
こちらもF8キーなどで一つずつ処理してみてください。
ちなみにここではテキストボックスに「tama」を入力していますが、表示はされません。
ただ入力はうまくいっているので問題はありません。
Sub 入力ダイアログに入力する()
Dim Driver As New Selenium.WebDriver
Dim Alert As Alert
Driver.Start "Chrome"
Driver.Get "https://www.tagindex.com/javascript/window/prompt.html"
Driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
Driver.SwitchToAlert.SendKeys "tama"
Driver.SwitchToAlert.Accept
End Sub
ここで使用しているのはSwitchToAlertメソッドとSendKeysメソッドになります。
- Driver.SwitchToAlert.SendKeys
ページ中のダイアログにフォーカスを移すのは同じで、テキストボックスへの入力にSendKeysメソッドを使っています。入力後は「OK」ボタンをクリックする為、Acceptメソッドを使用しています。
おまけ:Basic認証を処理する
以下のようなダイアログをBasic認証といいます。
Basic認証とはインターネットにもともと用意されている認証機能です(引用:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)
Basic認証を処理するコードは以下になります。
Basic認証のサイトは以下を使っています。
こちらもF8キーなどで一つずつ処理してみてください。
ちなみにここではユーザー名に「kaiin」、パスワードに「naisyo」を使用しています。
Sub Basic認証を入力する()
Dim Driver As New Selenium.WebDriver
Dim Alert As Alert
Driver.Start "Chrome"
Driver.Get "http://kaiin:naisho@leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/"
Driver.FindElementByCss("body > a").Click
End Sub
Basic認証に関してですが、WebDriverはこのダイアログを直接操作できません。その為以下のようにアクセスする際のURLに細工を行って処理します。
- Driver.Get(“http://ユーザー名:パスワード@サイト名)
GetメソッドのURLのhttp://の後にユーザー名とパスワード@を入力することでBasic認証のダイアログを表示させずに処理することができるようになります。
今回のまとめ
今回は
・アラートを含めた各種ダイアログの操作
・Basic認証の処理
について説明をしました。
ダイアログはJavaScriptの為、FindElementBy〇〇メソッドなどからは操作できませんが、SwitchToAlertメソッドを駆使すれば操作可能です。
この記事を読むことでダイアログの処理について少しでも参考になってもらえれば幸いです。
VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。今回のアラートダイアログやBasic認証に関する処理についても記載がなされており、困ったときに参考になります。
VBAの書籍の中でSeleniumBasicを取り上げている数少ない書籍です。ページ数としては20ページほどですがとてもわかりやすく書かれています。またVBA全般を網羅した内容が書かれており、長く使用することができます。
↓困ったときは以下が頼りになります。私も利用させてもらってます😊。
Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ
【ExcelVBA‐Selenium】【永久保存版】スクレイピングに必要なSeleniumのインストール方法教えます
【Selenium-VBA】Yahooメールへのログイン方法をわかりやすく説明する
ChromeでのWebスレイピングをできる限りわかりやすく説明する(Excel VBA)
【ExcelVBA‐Selenium】Chrome driverのバージョンエラーが出た時の対処法(2021/10/7更新)
【Selenium-VBA】Seleniumを用いたスクレイピングでテーブル情報を取得する1
【Selenium-VBA】スクレイピングをするのに必要なHTMLについて説明します1
【Selenim-VBA】起動済みのChromeを用いてSeleniumによるスクレイピングを行う
【Selenium-VBA】JavaScriptを使ってスクレイピングをしてみる1
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
コメント