右クリックなどマウスの操作を再現してみる
早速ですが質問をいただきましたので紹介していきます。
Webスクレイピングでマウスの右クリックは再現出来るのか?
という質問でした。
結論から申し上げますと可能です。専用のメソッドが用意されています。
Seleniumbasicにはマウスの操作を再現するメソッドが各種用意されています。
加えてこのような質問をいただきました。
アプリ内で右クリックした後に出てくる選択肢をクリックしたい
特定の要素を右クリックしないと出てこない選択肢を選びたいのですが方法が分からないとの事でした。
これは「右クリック後にマウスを選択肢まで動かしてからクリックする」という作業の再現になります。
具体的には「マウスホバー」+「クリック」という2つの操作を行います。
マウスホバーはマウスオーバーと呼ばれることもある様です。同じ意味です。
このあと動画とコードを使って順番に解説していきます。
ご注意ください
ここで紹介する操作はApp側で右クリックに対する操作が用意されているものを使用しています。
右クリック後に出てくるダイアログに配置された各要素にパスが用意されているという意味です。
(例)Chromeでブラウザ上を右クリックすると以下のようなダイアログが表示されます。
このダイアログに出てくる要素はXPathが取得出来ないので要素を掴む事ができません。
ここで表示されている要素を選択するというコードは紹介していません。ご注意ください。
この本で勉強しました
表紙で「ちょっと大丈夫か・・・」と思ってしまうのですが非常に良く出来ている本です。
Seleniumの本はよくあるのですがSeleniumbasicについて解説されている本は非常に少ないです。
Seleniumbasicに関する記事は20ページほどしか無いですが十分勉強になりました。
他にはPythonとコラボや機械学習についても書かれています。
関連記事
Webスクレイピングは初期設定(環境構築)がマストです。紹介した記事にてイチから説明しています。
ブラウザはChromeを想定していますがEdgeで準備される方向けにも記事を用意しています。
マウスでの操作を再現する
4つの操作を紹介します。
まずは記事のタイトルにもある様に右クリックと関連操作を紹介します。
後半でダブルクリックとクリック(左クリック)を紹介します。
- 右クリック
- マウスホバー(右クリック後に表示される選択肢を選ぶ)
- ダブルクリック
- クリック(左クリック)
右クリック
マウスでの右クリックと全く同じです。
Seleniumbasicの各種ドライバーに用意されているメソッドを使う事で操作を再現しています。
具体的なコードはマウスホバーと一緒に書いています。以下ご覧ください。
マウスホバー
マウスを指定した要素の上に置く事で要素の上にカーソルが浮いた状態でセットされている事になります。
この見た目の状態を「ホバー」と呼んでいます。「空中で停止する」というようなイメージです。
このマウスホバーについても動画で解説しています。
URL内の特定の要素の上までマウスのカーソルを運ぶという作業を再現できます。
よって右クリックと合わせた作業に限らずURL上の特定の要素を掴む事ができます。
再現というのが重要なポイントです。実際にカーソルが動いてきて要素を選ぶことはしません。
カーソルは見えませんが裏ではしっかり要素を掴む事ができています。
右クリックと合わせてコードを紹介します。その後解説していきます。
事例
以下のような事例を用意しました。
事例は右クリック後に出てくるダイアログ内の要素にPathが用意されているAppでの操作になります。
画像内の1~3を説明します。
- Web内の「AAA」を右クリック
- 「BBB」を含んだシートが表示される
- 「BBB」にマウスホバー
- 「CCC」を含んだシートが表示される
- 「CCC」をクリック
- ここは通常のクリック(左クリック)を予定しています
最終的には「CCC」をクリックしたいのですが最初からは表示されてないので1と2の作業をしています。
続いてコードを紹介します。
コード
コードです。画像で紹介した事例の作業をしています。
Sub 右クリック等()
'変数の定義
Dim wem As WebElement
Dim dr As New ChromeDriver
'Webドライバーを省略
With dr
.Start "chrome"
.Get "指定したURL"
'中略
'「AAA」を右クリック Contextメソッドを使用する
.FindElementByXPath("AAAのXPath").ClickContext
'変数wenにWebElementを格納する
Set wem = .FindElementByXPath("BBBのXPath")
'Mouseプロパティ→MouseクラスのMoveToメソッドでelementに変数wemを格納
'変数wemで指定したWebElementまでマウスホバーしたのと同じ状態を作り出している
.Mouse.MoveTo element:=wem
'「CCC」をクリック
.FindElementByXPath("CCCのXPath").Click
End With
End Sub
要素の指定はXPathを使っています。XPathの使い方が分からない方は以下記事をご覧ください。
解説
1、Web内の「AAA」を右クリック
13行目のコードです。
FindElementByXpathメソッドの戻り値(WebElement)が持つClickContextメソッドを使用します。
このClickContextメソッドが右クリックを再現しています。
2、「BBB」にマウスホバー
16行目と19行目のコードです。
FindElementByXpathメソッドの戻り値のWebElementクラス(オブジェクト)を変数wemに格納します。
続いてChromeDriverクラスのMouseプロパティ→MouseクラスのMoveToメソッドを使います。
変数wemをelementに代入します。これで変数wemへのマウスホバーを再現しています。
3、「CCC」をクリック
21行目のコードです。
WebElementクラス(オブジェクト)のClickメソッドです。
よくある作業の左クリックと同じ作業です。
ダブルクリック
WebElementクラス(オブジェクト)にClockDoubleというメソッドが用意されています。
WebDriver.FindElementByXPath(“指定のXPath”).ClickDouble
FindElementByXPathメソッドはWebElementを返します。
WebElmentクラス(オブジェクト)のClickDoubleメソッドを使うとダブルクリックを再現できます。
クリック(左クリック)
事例で紹介したコードの21行目と同じ操作です。
FindElement・・・メソッドで指定したWebElementのClickメソッドを使い左クリックを再現しています。
まとめ
これでマウスを使った操作の大半は再現出来る様になりました。
できる事も格段に増えます。
Webスクレイピングもワークシートを使った操作も対象物が違うだけで考え方は同じです。
オブジェクトを掴んでからオブジェクトに対して操作するという事の繰り返しです。
Webであれば表示されている要素です。ワークシートであればワークシートやセル(Range)ですね。
「要素を指定してから右クリック」や「要素を指定してからマウスホバー」を再現してみました。
関連記事
今回は要素を指定する際にXPathを使いましたが他のタグでもコードを紹介しています。
nameタグでWebスクVBA×Selenium×ChromeでWebスクレイピング|nameタグを使う
要素を取得する際表示されている要素がつかめない事もあります。
一例を挙げるとリンクをクリックし新規タブで新しいURLが展開される際です。
この状態ではウインドウのフォーカスは1つ前のウインドウに残っています。
ウインドウの切り替えを行うことで要素の取得が可能になります。
スクロールと合わせて使える【selenium×ExcelVBA】ウインドウ、タブを切り替える
応用編
Webスクレイピングに慣れてくるとこんなことが出来るようになります。
Excelのワークシート上にYahooのニューストピックスをハイパーリンク付きで抽出する事ができます。
もちろん1クリックで可能です。加えて再現性もあるので何度でもニューストピックスを取得できます。