コードを修正する毎に「Chromeを新規起動し、ログインからやり直し」「Chromeを新規起動し、操作対象画面まで遷移する」など、頭からスクリプトを実行していませんか?
たかだか数秒かもしれませんがイライラしますし、塵積で相当の時間を消費することになります。また、ログインを何度も行うため、不正操作を疑われるのではないかとドキドキすることもあります。SeleniumBasicで起動済みChromeを操作できれば、このような懸念はなくなります。今回は、SeleniumBasicで起動済みChromeを操作する方法を紹介します。
事前準備
- テンポラリフォルダを作成する。場所は任意です。Chromeのユーザデータが保存されます。
例:D:\tmp\chrome_vba
- Chromeのショートカットを作成する。–user-data-dirには、先ほど作成したテンポラリフォルダをしてしてください。
“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” -remote-debugging-port=9222 –user-data-dir=D:\tmp\chrome_vba
- 先ほど作成したショートカットでChromeを起動しておく
サンプルプログラム(コピペでOK)
先ほど起動したChormeで、自動操作開始したいポイントまで画面を進めてください。ログインが必要ならばログインを先に行ってください。
自動操作を開始したいポイントまで操作したらマクロ起動してください。
今回のポイントは、dr.SetCapability “debuggerAddress”, “127.0.0.1:9222” です。事前準備で作成したショートカットにも9222ポートが指定されています。ここが肝になります。
Option Explicit
Sub sample()
Dim dr As New Selenium.WebDriver
Dim el As WebElement
dr.SetCapability "debuggerAddress", "127.0.0.1:9222" ' ★ここが肝です
dr.Start "chrome"
dr.Get "https://www.coingecko.com/ja"
Dim r As Range
Set r = ThisWorkbook.Worksheets(1).Range("A1")
For Each el In dr.FindElementsByXPath("//div[@class='coingecko-table']//tbody/tr")
r.Value = el.FindElementByXPath(".//td[contains(@class,'coin-name')]").Attribute("data-sort")
r.Offset(0, 1).Value = el.FindElementByXPath(".//td[contains(@class,'price')]/span").Text
Set r = r.Offset(1, 0)
Next
End Sub