【SeleniumVBA】あ~要素をダブルクリックしたい!ドラッグアンドドロップしたい!そんな時はAction Chainsを使おう【ブラウザ自動化】
どうもどうも。
いつものようにSeleniumVBAでスクレイピングしていました。
とある案件、とあるシステムで、ダブルクリックが必要な操作がありました。
あれっどないしよってなりました。
そんな話。
IEでブラウザ操作するときは、クリック関数あったけど、
ダブルクリックはなかった気がする( ^ω^)・・・
ダブルクリックが必要な時どうするんだろうか。
要素のX,Y座標を取得してクリックコマンドをSendするんだろうか・・・。
SeleniumVBAにはダブルクリック関数はありませんが、それに似たような動作をすることができます。
そう、Action Chainsならね。
■Action Chainsとは
その名の通り、一連の操作を実行するコマンドです。
例えば、
・シフトキーを押しながら要素をクリックする
・要素をダブルクリックしたい
・あるキーを入力したい
・・・などなど
感覚的にも動作的にもSendkeysに近いです。
要素を指定してSendKeysできるコマンドかな。
たとえば以下の記事内で使用しているコードにAction Chainsを使用している。
https://note.com/excel_vba/n/n33d1a0c22454?nt=comment_10254907
For Each内の「act_~」は作者が作成したAction Chainsを呼び出している。
Call act_DBC(actions,classObj)
actions.DoubleClick(classObj).Perform
■ActionChain例
ダブルクリック
Sub act_DBC(acts As seleniumVBA.WebActionChain,webEle As seleniumVBA.WebElement)
acts.DoubleClick(webEle).Perform
End Sub
Callではなく「actions.DoubleClick(classObj).Perform」のように直接書くことも可能
特定のキーを押しながら要素をクリック
sub act_ShiftClick(Keys As seleniumVBA.WebKeyboard,acts As seleniumVBA.WebActionChain,webEle As seleniumVBA.WebElement)
acts.KeyDown(Keys.shiftKey).Click(webEle).KeyUp(Keys.shiftKey).Perform
end sub
エンターキー送信
sub act_SendKey_Enter(Keys As seleniumVBA.WebKeyboard,acts As seleniumVBA.WebActionChain)
acts.KeyDown(Keys.EnterKey).KeyUp(Keys.EnterKey).Perform
end sub
ドラッグアンドドロップもできるので色々と試してみるといいかも。
Sub test_drag_and_drop()
Dim driver As SeleniumVBA.WebDriver
Dim from1 As SeleniumVBA.WebElement, to1 As SeleniumVBA.WebElement
Dim from2 As SeleniumVBA.WebElement, to2 As SeleniumVBA.WebElement
Dim from3 As SeleniumVBA.WebElement, to3 As SeleniumVBA.WebElement
Dim from4 As SeleniumVBA.WebElement, to4 As SeleniumVBA.WebElement
Set driver = SeleniumVBA.New_WebDriver
driver.StartChrome
driver.OpenBrowser
driver.NavigateTo "https://demo.guru99.com/test/drag_drop.html"
driver.Wait 500
Set from1 = driver.FindElement(By.XPath, "//*[@id='credit2']/a")
Set to1 = driver.FindElement(By.XPath, "//*[@id='bank']/li")
Set from2 = driver.FindElement(By.XPath, "//*[@id='credit1']/a")
Set to2 = driver.FindElement(By.XPath, "//*[@id='loan']/li")
Set from3 = driver.FindElement(By.XPath, "//*[@id='fourth']/a")
Set to3 = driver.FindElement(By.XPath, "//*[@id='amt7']/li")
Set from4 = driver.FindElement(By.XPath, "//*[@id='fourth']/a")
Set to4 = driver.FindElement(By.XPath, "//*[@id='amt8']/li")
driver.ScrollTo , 500
'WebDriver and WebElement DragAndDrop's method made from action chains
from1.DragAndDrop to1
from2.DragAndDrop to2
from3.DragAndDrop to3
from4.DragAndDrop to4
driver.Wait 2000
driver.CloseBrowser
driver.Shutdown
End Sub
ドラッグアンドドロップが必要な場面に当たったことがないので、
さてさて、どう作ってやるかな。