【Excel VBA×Selenium】JavaScriptを実行して要素をクリックする方法|通常のClickで動かない場合
みなさんこんにちは。
Excel VBAとSeleniumで、要素を取得できてもClickが動作しないことがあります。
今回は、原因の確認からExecuteScriptでJavaScriptクリックする方法までご紹介したいと思います。
通常のClickが動かない原因
まず、対象のID・表示・待機・スクロールを確認してください。要素の重なりにも注意しましょう。
通常のClickと違い、JavaScriptクリックは画面上の押しやすさを判定せず、要素の処理を呼び出します。
待機やスクロールについては、
も参考にしてください。
今回使用するテストHTML
次のHTMLをjavascript-click-test.htmlとして、Excelブックと同じフォルダに保存してください。
<!DOCTYPE html>
<html lang="ja"><meta charset="UTF-8">
<title>JSクリック確認</title>
<style>
#area{position:relative;width:320px;height:110px}
#targetButton{position:absolute;top:30px;left:30px;padding:12px}
#cover{position:absolute;inset:0;z-index:2;background:#ffd891aa}
</style>
<h2>JavaScriptクリック確認</h2>
<div id="area">
<button id="targetButton" onclick="document.getElementById('result').textContent='クリック成功'">テストボタン</button>
<div id="cover">重なっている要素</div>
</div>
<p id="result">未クリック</p>
</html>

ExecuteScriptでJavaScriptクリックする
「参照設定」でSelenium Type Libraryを有効にして、標準モジュールに入力してください。
Option Explicit
Sub JavaScriptClickSample()
Dim driver As New Selenium.ChromeDriver
Dim target As Selenium.WebElement
Dim filePath As String
' ExcelとHTMLは同じフォルダに保存する
filePath = ThisWorkbook.Path & "\javascript-click-test.html"
If ThisWorkbook.Path = "" Or Dir(filePath) = "" Then
MsgBox "ブックを保存し、HTMLを同じ場所に置いてください。"
Exit Sub
End If
On Error GoTo ErrHandler
driver.Start "chrome"
driver.Get "file:///" & Replace(filePath, "\", "/")
Set target = driver.FindElementById("targetButton", 3000)
' 重なっているボタンに通常のClickを試す
On Error Resume Next
target.Click
If Err.Number <> 0 Then
Debug.Print "通常Click:失敗/" & Err.Description
Err.Clear
End If
On Error GoTo ErrHandler
' JavaScriptのclick()でボタンを操作する
driver.ExecuteScript "document.getElementById('targetButton').click();"
Debug.Print "JSクリック後:" & driver.FindElementById("result").Text
MsgBox "結果を撮影したらOKを押してください。"
Done:
On Error Resume Next
driver.Quit
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume Done
End Sub

実行結果と確認ポイント
通常のClickが失敗しても、JavaScript側で「クリック成功」と表示される想定です。結果はCtrl + Gで確認できます。

取得済み要素ならtarget.ExecuteScript "this.click();"でも操作できます。今回はdriver.ExecuteScriptを使用します。
JavaScriptクリックを使用するときの注意点
JavaScriptのclick()は実際のマウス操作とは異なります。まず重なりや待機の原因を解消することを優先しましょう。無効なボタンやユーザー操作が必要な処理では動かない場合もあります。
最後に
いかがでしたでしょうか。今回は、ExecuteScriptでクリックする方法をご紹介しました。必要に応じて使い分けてください。参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
