2020年2月19日水曜日

SeleniumBasic:SendKeysを使わずにテキストを入力

VBAでブラウザを操作するのに、IEからSeleniumBasic+Chromeへ移行してしばらく経ちます。不便に感じていたのがテキストボックスへの文字列の入力です。
IEならValueプロパティに値を設定すればよかったですが、 SeleniumBasicではなぜかそれができません。ネットで調べるとクリップボードに値を設定して、テキストボックス上でCtrl+vをSendKeysで実行するのが定番のようでした。なので今まではこうしていました。

Dim objDriver As ChromeDriver
Dim objKeys As Selenium.Keys
Dim objTemp As Object

    Set objDriver = New ChromeDriver
    objDriver.Get (URL)
    objDriver.Window.Activate
    Set objKeys = New Selenium.Keys

(中略)

    Set objTemp = objDriver.FindElementByName("txtExample")
    objTemp.Clear
    objDriver.SetClipBoard Sheet1.Range("A1")
    objTemp.SendKeys objKeys.Control, "v"

1回入力するくらいなら問題ありませんが、数十回数百回とループさせる場合は実行速度が遅く感じます。また実行中にうっかり他のアプリケーションでコピーしてしまうと、当然それがペーストされてしまいます。

解決しようとさらに調べていたところ、 ExecuteScriptというメソッドがあることに気づきました。JavaScriptの文字列を実行できるようで、これならValueに値を設定できることがわかりました。
上の(中略)以下は1行で済みました。

    objDriver.ExecuteScript "document.getElementsByName('txtExample')[0].value=" & Sheet1.Range("A1")

とりあえずこれで解決です。