今回はVBAにてSeleniumを使用したブラウザ操作(準備/使用例)についてです。
本投稿はChromeDriverの使用を前提とします。
SeleniumBasicの導入
GitHubのリリースページからSeleniumBasicをダウンロードします。
落としたexeファイルを実行し、セットアップ画面を進めます。
途中で必要なコンポーネントにチェックを入れ、インストール場所を指定して終了です。
WebDriverの準備
今回はChromeを操作するのでChromeDriverをダウンロード。
注意点として、ブラウザのバージョンに合わせてDriverを選ぶ必要があります。
<ブラウザのバージョン確認方法>
・アドレスバーに「chrome://settings/help」と入力
または 設定>[Chromeについて] より確認
VBE事前設定
SeleniumBasicが導入されていると
ツール>参照設定>[Selenium Type Library] が表示されるのでチェックを入れます。
クラスやメソッドについて
下記のヘルプファイルに記載されていますが、ご覧の通り英文です。
私は翻訳して使っています。
(フォルダパス:C:\Users\ユーザ名\AppData\Local\SeleniumBasic)
使用例
ブラウザ起動、ページ偏移
・WebDriverクラス Getメソッド:指定したページに偏移
Const strUrl As String = "https://www.google.com"
Dim driver As New Selenium.ChromeDriver
'ブラウザ起動、指定ページ表示
driver.Get (strUrl)
操作中は下の図のように自動操作中と表示されます。
また、プロファイルを指定して立ち上げる場合はSetProfileメソッドを使います。
下図では隠しましたが赤枠のところにパスが記載されています。
パスの確認方法は下記のとおり
・指定したいGoogleアカウントにログイン後、
Chromeのアドレスバーに「chrome://version/」と入力。
・デフォルトだと下記パス直下にあるユーザープロファイルフォルダのパスを指定
C:\Users\ユーザ名\AppData\Local\Google\Chrome\User Data
Const strProfile As String = "hoge" '実際にはプロファイルのパスを指定
'プロファイルの指定
driver.SetProfile strProfile
また、プロファイルを指定して起動した際、
既に指定のプロファイルを使用しているウィンドウがある場合、エラーとなります。
ブラウザを終了
下記のように、どこまで閉じるかによってメソッドが変わってきます。
・WebDriverクラス Quitメソッド:ブラウザごと閉じる
・WebDriverクラス Closeメソッド:開いているタブを閉じる
driver.quit
'driver.close タブを閉じる場合
処理待機について
・WebDriverクラス Waitメソッド:次の処理までの待機時間指定(ミリ秒)
driver.Wait 1000 '1秒待機
クリック操作
今回はこちらWebスクレイピング入門さんのサイトで動作を確認します。
<完全一致するリンクテキストをクリックする場合>
・WebDriverクラス FindElementByLinkTextメソッド:完全一致するリンクテキストの検索
Const lnkLogin As String = "ログイン"
driver.FindElementByLinkText(lnkLogin).Click 'リンク「ログイン」押下
<XPathを指定してクリックする場合>
ブラウザの開発ツール(ショートカット:F12)より取得できます。
Chromeの場合の手順は下記のとおり。
また、取得したXPathは次のようにダブルクォートを付ける必要があります。
変更前:"//[@id="nav-mobile"]/li[1]/a"
変更後:"//[@id=""nav-mobile""]/li[1]/a"
・WebDriverクラス FindElementByXPathメソッド
Const lnkLogin As String = "//*[@id=""nav-mobile""]/li[1]/a"
driver.FindElementByXPath(lnkLogin).Click
テキストの送信
ログインページの赤枠部分の送信です。
上記手順と同じくXPathを取得します。
XPathを取得したら、入力したいテキストをSendkeysの後ろに指定します。
削除する場合はClearを使用します。
Const txtLoginUser As String = "//*[@id=""username""]" '赤枠部分
Const strUserName As String = "test"
'ユーザ名入力
driver.FindElementByXPath(txtLoginUser).SendKeys strUserName
'削除する場合
driver.FindElementByXPath(txtLoginUser).Clear
ログインボタン押下もXPathを取得し、先程と同様にクリック処理をします。
Const btnLogin As String = "//*[@id=""login-btn""]"
'ログインボタン押下
driver.FindElementByXPath(btnLogin).Click
ログインに失敗すると、下記画面のように「ログインに失敗しました」と表示されるようです。この表示を拾って次の処理に繋げてみます。
ログインページにて、エラー文言が表示されたら処理を中断する場合
Const errLogin As String = "/html/body/main/center/h5"
Dim strMsg As String
'表示されたテキストを取得し識別
strMsg = driver.FindElementByXPath(errLogin).Text
If strMsg = "ログインに失敗しました" Then
driver.Quit
End If
おわりに
(Seleniumを使用して良い環境ということを前提で)
定型業務にかける時間の削減や、人為的な操作ミスがなくなる、
といった便利な点がある一方、
当然、アクセス先になるべく負荷を与えないよう注意する必要があります。
WebDriverの更新やダイアログ操作についても今後書けたらと思います。
参考サイト:
・https://scraping-for-beginner.readthedocs.io/ja/latest/src/1.html
使用サイト:
・https://github.com/florentbr/SeleniumBasic/releases/tag/v2.0.9.0
・https://sites.google.com/chromium.org/driver/downloads
・https://scraping-for-beginner.herokuapp.com/
エンジニアファーストの会社 株式会社CRE-CO S.K