【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>
SeleniumのJavaScriptクリック確認ページでボタンの上に別の要素が重なり未クリックとなっている画面

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
Excel VBAとSeleniumBasicで通常のClickとExecuteScriptを使用したJavaScriptクリックを比較するコード

実行結果と確認ポイント

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

Excel VBAとSeleniumBasicのExecuteScriptでJavaScriptクリックを実行しクリック成功と表示された画面

取得済み要素ならtarget.ExecuteScript "this.click();"でも操作できます。今回はdriver.ExecuteScriptを使用します。

JavaScriptクリックを使用するときの注意点

JavaScriptのclick()は実際のマウス操作とは異なります。まず重なりや待機の原因を解消することを優先しましょう。無効なボタンやユーザー操作が必要な処理では動かない場合もあります。

最後に

いかがでしたでしょうか。今回は、ExecuteScriptでクリックする方法をご紹介しました。必要に応じて使い分けてください。参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA