0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VBA_Selenium_ブラウザ操作(Chrome)

Last updated at Posted at 2023-09-07

今回はVBAにてSeleniumを使用したブラウザ操作(準備/使用例)についてです。
本投稿はChromeDriverの使用を前提とします。

SeleniumBasicの導入

GitHubのリリースページからSeleniumBasicをダウンロードします。
2023090610_qt.png

落としたexeファイルを実行し、セットアップ画面を進めます。
途中で必要なコンポーネントにチェックを入れ、インストール場所を指定して終了です。

WebDriverの準備

今回はChromeを操作するのでChromeDriverをダウンロード。
注意点として、ブラウザのバージョンに合わせてDriverを選ぶ必要があります。

<ブラウザのバージョン確認方法>
・アドレスバーに「chrome://settings/help」と入力
または 設定>[Chromeについて] より確認
2023090611_qt.png

VBE事前設定

SeleniumBasicが導入されていると
ツール>参照設定>[Selenium Type Library] が表示されるのでチェックを入れます。
2023090608_qt.png

クラスやメソッドについて

下記のヘルプファイルに記載されていますが、ご覧の通り英文です。
私は翻訳して使っています。
(フォルダパス:C:\Users\ユーザ名\AppData\Local\SeleniumBasic)
2023090604_qt.png

使用例

ブラウザ起動、ページ偏移

・WebDriverクラス Getメソッド:指定したページに偏移

Const strUrl   As String = "https://www.google.com"
Dim driver     As New Selenium.ChromeDriver

'ブラウザ起動、指定ページ表示
driver.Get (strUrl)

操作中は下の図のように自動操作中と表示されます。
2023090601_qt.png
また、プロファイルを指定して立ち上げる場合はSetProfileメソッドを使います。
下図では隠しましたが赤枠のところにパスが記載されています。
パスの確認方法は下記のとおり
・指定したいGoogleアカウントにログイン後、
 Chromeのアドレスバーに「chrome://version/」と入力。
・デフォルトだと下記パス直下にあるユーザープロファイルフォルダのパスを指定
 C:\Users\ユーザ名\AppData\Local\Google\Chrome\User Data
2023090603_qt.png

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の場合の手順は下記のとおり。
2023090605_qt.png
また、取得した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を取得します。
2023090607_qt.png

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

ログインに失敗すると、下記画面のように「ログインに失敗しました」と表示されるようです。この表示を拾って次の処理に繋げてみます。
2023090609_qt.png

ログインページにて、エラー文言が表示されたら処理を中断する場合

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?