見出し画像

【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

ドラッグアンドドロップが必要な場面に当たったことがないので、
さてさて、どう作ってやるかな。


いいなと思ったら応援しよう!