SeleniumbasicでWebスクレイピングする際に、クリック動作を一括で処理したい時に役立つ方法を紹介します。今回はSeleniumBaisicの操作(応用編)第2回目として、Actionsクラスの活用方法について解説していきます。
ブラウザの起動 |
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にてデバッグ実行します。
オブジェクト設定
文法
ActionsクラスはWebDriverの配下にあり、変数に置き換えて操作することはあまりありません。
Actionsクラスは複数のメソッドを利用することができます。文法は以下のとおりです。
driver.Actions.[メソッド1].[メソッド2].….[メソッドn].Perform
操作したいメソッドを完結させるために最後にPerformメソッドを利用します。
メソッド一覧は以下記事を参照ください。
活用例
Actionsクラスの使い方として3例挙げてみたいと思います。最初に基本的なActionsクラスの使い方の例を解説します。その後、よくあるエラー発生の回避方法としてActionsクラスを使用した解決方法を2例解説します。
基本的な使い方
ここではGoogleトップページを開き、検索ボックスに文字列("hoge")を入力してから検索結果を表示させるところまで操作します。
Private Sub action_basic()
Dim Keys As New Selenium.Keys
Dim Driver As New ChromeDriver
Dim ele As WebElement
Driver.Get "https://google.co.jp"
Set ele = Driver.FindElementByName("q")
Driver.Actions.Click(ele).SendKeys("hoge").Wait(2000).SendKeys(Keys.Enter).Wait(2000).Perform
Driver.Quit
End Sub
- 2行目
-
特殊キー(Enterキー)を入力するためにKeysClassの変数を設定。Keysクラスの内容は以下関連記事参照。
- 7行目
-
Actionsクラスにメソッドを入力。「検索ボックスをクリック」⇒「"hoge"を入力」⇒「2秒待機」⇒「Enterキーの入力」⇒「2秒待機」
上記例では無理やりActionsクラスで全て操作していますが、要素取得後は以下の様にコード実行しても良いです。
ele.SendKeys "hoge"
driver.Actions.Wait(2000).SendKeys(keys.Enter).Wait(2000).Perform
要素をクリックできない(element not interactable)
要素を取得した後、クリック操作した時に失敗することがあります。ホームページ表面上はクリックが可能なリンクで手動操作時には問題なくクリックできますが、SeleniumBasicで要素を取得しても要素に対してクリックできない場合です。これは、HTMLで要素を非表示に設定しているためです。マクロ実行して表示されるエラー名称は「element not interactable」になります。
Actionsクラスを利用した解決方法として、クリックしたい要素の近くにある取得可能な要素を一度取得し、そこからXY座標軸の移動設定することで半ば無理やり要素をクリックすることができます。以下例で解説します。
Private Sub NearElement_Click()
Dim driver As New ChromeDriver
Dim elm As WebElement, nearElm As WebElement
driver.Get "https://programan.org/"
Set elm = driver.FindElementByXPath("//*[@id='fix_header']/div/div[2]/ul/li[2]/a")
If Not elm.IsDisplayed Then
Set nearElm = driver.FindElementByXPath("//*[@id='header']/div[2]/div[1]/h1/a")
driver.Actions.MoveToElement(nearElm).MoveByOffset(670, 10).Click.Perform
Else
elm.Click
End If
driver.Wait 2000
driver.Quit
End Sub
- 5行目
-
Programanホームページのメニューにある「Selenium」の要素を取得
- 6行目
-
IsDisplayedメソッドを使用して、要素の非表示有無で場合分け。
- 7行目
-
メニュー欄にあるProgramanロゴの要素を取得
- 8行目
-
Actionsクラスにメソッドを入力。「nearElmに移動」⇒「nearElmからX軸方向に670ピクセル、Y軸方向に10ピクセル移動」⇒「移動した先をクリック」
その他にも解決方法はありますが、それはエラー事例集(element not interactable)を参照してください。
要素をクリックできない(element click intercepted)
Seleniumで座標軸をクリックしようとした時、ブラウザのウィンドウ枠外に要素の座標軸がある場合、座標軸をキャッチできずエラーが発生します。ウィンドウサイズが小さい場合、エラー発生する確率が高くなります。Web要素をクリックしようとした場合、ブラウザのウィンドウサイズが小さい状況でクリック実行しようとすると発生するエラーです。マクロ実行して表示されるエラー名称は「element click intercepted」になります。
Actionsクラスを利用した解決方法として、ウィンドウサイズが狭くとも、Web要素まで移動すればウィンドウサイズ枠内に収まるため、エラー回避することができます。以下例で解説します。
Private Sub element_click_intercepted_MoveElement()
Dim driver As New ChromeDriver
Dim elm As WebElement
driver.AddArgument "--window-size=200,400" '横幅,縦幅
driver.Get "https://programan.org/"
Set elm = driver.FindElementByCss("#categories-2 > ul > li.cat-item.cat-item-5 > a")
driver.Actions.MoveToElement(elm).Click.Perform
driver.Wait 2500
driver.Quit
End Sub
- 4行目
-
ウィンドウサイズを幅狭に変更。
- 7行目
-
Actionsクラスにメソッドを入力。「Elmに移動」⇒「移動した先をクリック」
その他にも解決方法はありますが、それはエラー事例集(element click intercepted)を参照してください。