【ExcelVBA】ScrollIntoViewでビューに要素をスクロールする【SeleniumBasic】
- [記事公開]2023.03.29
- VBA
- ExcelVBA, ScrollIntoView, SeleniumBasic
自分の覚書もかねて、スクレイピングするときのScrollIntoViewについて分かったことをまとめておきます。
表示領域にないと要素を取得できない
まずは基本です。
Webの要素を取得するためには、画面に表示されていないといけません。
例えば、次のように縦に長いサイトがあったとします。画面表示がこの図の四角の枠の状態だったとき、一番下の方にある「検索」ボタンは、押せません。
ボタンの要素(Element)もまだ画面上に表示されていないから、FindElementBy〇〇で取得しようとしてもエラーになります。そのためにブラウザを操作してスクロールダウンや横スクロールする訳です。
SeleniumのScrollIntoView
SeleniumBasicにはScrollIntoViewが用意されていますが、サイトによっては使い方に注意が必要です。
ScrollIntoViewというのは、指定した要素を画面の表示内にまでもってきてくれるメソッドです。
引数には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検索のラジオボタンがあります。見えていませんが)。
少しスクロール位置をずらせば見えるようになるのですが、そういった微調整はScrollIntoViewではできないのでした。
解決策
オプションをTrueでなくFalseにしてみたところ、うまくいきました。
Falseというのは、画面の下端と要素の下端が重なる位置までスクロールしてくれるオプションです。
まとめ
今回のサイトではヘッダー部分が常に上部に覆いかぶさる仕様だったため、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ドライバーも環境にあったものをダウンロードしておく必要があります)。
-
前の記事
グレーゾーン解消制度 2023.03.28
-
次の記事
タイミーに登録してみた 2023.03.30