【ExcelVBA】ScrollIntoViewでビューに要素をスクロールする【SeleniumBasic】

自分の覚書もかねて、スクレイピングするときのScrollIntoViewについて分かったことをまとめておきます。

表示領域にないと要素を取得できない

まずは基本です。

Webの要素を取得するためには、画面に表示されていないといけません。

例えば、次のように縦に長いサイトがあったとします。画面表示がこの図の四角の枠の状態だったとき、一番下の方にある「検索」ボタンは、押せません。

ボタンの要素(Element)もまだ画面上に表示されていないから、FindElementBy〇〇で取得しようとしてもエラーになります。そのためにブラウザを操作してスクロールダウンや横スクロールする訳です。

SeleniumのScrollIntoView

SeleniumBasicにはScrollIntoViewが用意されていますが、サイトによっては使い方に注意が必要です。

ScrollIntoViewというのは、指定した要素を画面の表示内にまでもってきてくれるメソッドです。

ScrollIntoViewをVBEのオブジェクトブラウザで見たところ

引数にはBoolean型を指定します。

ところが、私が最初に実験したときうまくいきませんでした。

試したコード

私が試したコードは以下のとおりです。

   'フリーワード
    Dim vFree As Variant
    vFree = sh.Range("B8").Value
    If vFree <> "" Then
        vFree = StrConv(vFree, vbWide)
        'AND検索のラジオボタン
        Set el = driver.FindElementByXPath("//*[@id=""ID_freeWordRadioBtn1""]")
        '少し画面の下の方にあるので、ScrollIntoViewしておく
        el.ScrollIntoView True
        driver.Wait clWAIT
        el.Click        '・・・・・【 A 】
        driver.Wait clWAIT
        'フリーワードインプットボックス
        Set el = driver.FindElementByXPath("//*[@id=""ID_freeWordInput""]")
        el.ScrollIntoView True
        driver.Wait clWAIT
        el.Clear
        driver.Wait clWAIT
        el.SendKeys vFree
        driver.Wait clWAIT
    End If

ハロワの求人検索で、フリーワードを検索するときに、OR検索かAND検索かを選べるのですが、AND検索を選びたいと思い、ラジオボタンをクリックするために画面をスクロールしてビュー(=見えている範囲)に入れようとしました。

ScrollIntoView TrueのTrueは、画面の上端と要素の上端が重なる位置までスクロールするという意味です。

実行結果

ところがエラーとなりました。エラーとなった個所は、コード内の【 A 】とあるところです(クリックするところ)。

エラーメッセージはこちら↓

このときのブラウザはこの通り↓

エラーの原因

エラーメッセージを見ると、ラジオボタンの要素はクリックが妨げられたとあります。

何に妨げられたかというと、ヘッダーの要素に妨げられたとのこと。

見てのとおり、ハロワのパンくずリストなどがあるヘッダー部分がかぶっています(NOT検索の上にフリーワードを入力するインプットボックスがあり、その直前にAND検索のラジオボタンがあります。見えていませんが)。

手動で少しスクロールしてAND検索ボタンが見えるようにしたところ

少しスクロール位置をずらせば見えるようになるのですが、そういった微調整はScrollIntoViewではできないのでした。

解決策

オプションをTrueでなくFalseにしてみたところ、うまくいきました。

Falseというのは、画面の下端と要素の下端が重なる位置までスクロールしてくれるオプションです。

ScrollIntoView Falseにしたときのブラウザ表示。「AND検索」が画面の下ギリギリの位置に表示された。

まとめ

今回のサイトではヘッダー部分が常に上部に覆いかぶさる仕様だったため、ScrollIntoView Trueだとうまくいきませんでした。ScrollIntoView Falseとすることでうまくいきました。

これが、逆にフッター部分が覆いかぶさるような仕様のサイトだったら、Trueとしないといけないでしょう。この辺の調整は、サイトによって異なります。

あまりないとは思いますが、もしヘッダーもフッターも覆いかぶさるような仕様のサイトだった場合は、ScrollIntoViewは使えません。そういうときは、JavaScriptで直接座標を指定してスクロールするしかないと思います(SeleniumでJavaScriptを使うときは、ExecuteScriptを使います。詳しいことはググってください)。

本日紹介したコードが入っているマクロブックはこちら↓です。以前この記事で紹介したものと同じです。

https://kn-sharoushi.com/wp-content/uploads/2023/03/20230324getJobSeekerInfo.zip

ZIPファイルにしてあるので、解凍してから使ってください(SeleniumBasicがインストールしてある必要があります。.Net Frameworkも必要です。ChromeのWebドライバーも環境にあったものをダウンロードしておく必要があります)。