SeleniumBasicの操作(応用編)第2回:キー入力の一括操作(Actionsクラス活用)

 SeleniumbasicでWebスクレイピングする際に、クリック動作を一括で処理したい時に役立つ方法を紹介します。今回はSeleniumBaisicの操作(応用編)第2回目として、Actionsクラスの活用方法について解説していきます。

スクロールできます
ブラウザの起動
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にてデバッグ実行します。

オブジェクト設定

文法

 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)を参照してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次