ruby+webdriverで入力する際の標準コマンドsend_keys
inputフォームにおいてtext、textarea、selectに対応するコマンドはsend_keysが主流となっています。
driver.find_element(:id, 'textarea').send_keys('こんにちわ')
今まで当然のようにこのまま実装していました。
textareaへの入力速度が遅いというクレームが来た
textareaとなると数千文字を入力する必要がある場合があると思います。
私の環境はwindow10+ruby2.3.3+chromedriverなのですが、send_keysでテキストを入力していくと、
高速ではあるのですが、1文字1文字入力していく形となり、同様の動作を1000件のように大量に行う必要があると、
大変な時間が掛かって来てしまいます。
私が開発依頼を請けたシステムも3000文字ほどの入力を1000件続けて行うような要件となっていました。
「selenium IDEでは一瞬で文字が貼り付けられたのにこれでは遅すぎる」というお叱りを受けることになったのです。
#コピペ的なことで速度をあげたい
textareaに一気に入力するのであればコピペっぽいことでいけるでしょうということで以下が必要だなと考えました。
・クリップボードへ値をつっこむ
・入力したいtextareaにカーソルを合わせる
・クリップボードの中身をペーストする
#クリップボードへのコピーを実装
とりあえずクリップボードに入力する値を取り込む必要があるので clipboard をいうgemを使ってみました。
ターミナルに以下を入力してインストール。
gem install clipboard
インストールができたら以下でクリップボードに値をつっこみましょう。
require 'clipboard'
str = variable # variableには代入したい値が入っている
Clipboard.copy(str)
これでクリップボードの中に値が入りました。
#ペーストしたいtextareaにカーソルを合わせる
ペーストしたいtextareaにカーソルがあっている必要があるので、要素をclickしましょう。
driver.find_element(:id, 'textarea').click
#seleniumでキーボード操作を行う
clipboardにはペースト用に文字通り"paste"というものも用意されているのですが、なぜか私が実装したいサービスでは動かなかったので、
キーボードの操作をseleniumの ActionBuilder クラスで実装しました。
driver.action.key_down(:control).send_keys("v").key_up(:control).perform
これで必要なコードは揃いましたね。
#まとめ
では、以上までのコードをまとめてみましょう。
require 'selenium-webdriver'
require 'clipboard'
driver = Selenium::WebDruver.for :chrome
driver.find_element(:id, 'textarea').click
str = variable
Clipboard.copy(str)
d.action.key_down(:control).send_keys("v").key_up(:control).perform
これでコピペのようにtextareaに値を入力することができるので高速化が実現できました。
たぶんjsを使ったりとかいろいろ高速化できる方法はあると思いますので、代替案があったらコメントにバンバン書き込んでいただければと思います。
#自分のブログの紹介
ruby + selenium webdriverに関するブログをやっていますので、そちらもよろしくお願い致します。
katsulog
それとこれが最初の記事になりますので、何か改善した方が良い部分があったら是非コメントください。