Selenium の SendKeys は遅かったです。
webdriver でテキスト入力するときは、SendKeys で入力するのが簡単でしたが、どうしても速さに限界がありました。
そこで、テキストボックスに長い文字列を入力するときは、『executeScript』で入力するのがおすすめです。
executeScript を使用したら、テキストエリアの value に、直接テキストを入力することができました。
Python の場合は .execute_script()
というメソッドを使用します。
入力したい文字列を直接代入できたので、長いテキストも、一瞬で入力できるようになりました。
その方法を紹介します。
Selenium の高速化が必要なときにおすすめです。
テキストボックスに文字列を入力するコード
入力フォームのテキストボックス・テキストエリア・インプットボックスに、一瞬でテキストを入力するコード例です。
executeScript で Javascript を実行することで、テキストボックスに文字列を入力します。
SendKeys と違って、タグの value に直接代入できたので、入力が一瞬で完了しました。
コード例
Python のコード例です。
Python でジャバスクリプトの文字列を組み立てて、エクセキュートスクリプトに渡しています。
ところで、複数形の getElementsBy~ では、配列が返りました。
ここでは例として、最初の要素 [0] を指定しました。
"""テキストボックスに文字列を高速入力するコード"""
w.execute_script('document.getElementById("id属性").value="%s";' % text)
w.execute_script('document.getElementsByName("name属性")[0].value="%s";' % text)
w.execute_script('document.getElementsByClassName("class名(class属性)")[0].value="%s";' % text)
# 変数の説明 w: ウェブドライバー text: 入力するテキスト
(補足です)テキストボックスではなく、div タグなどに『テキストや HTML コード』を追加したいときは、.value
の代わりに .innerHTML
に代入します。
(developer.mozilla.org) Element.innerHTML
(developer.mozilla.org) element.insertAdjacentHTML
(補足終わり)
Selenium – executeScript のマニュアル
Selenium で任意の Javascript を実行する『executeScript』メソッドのページです。
Ruby、Java、Python、C#(CSharp) のドキュメント(マニュアル)がありました。
ここでは、Python 用のマニュアルを紹介します。
https://www.selenium.dev/ ⇒ Downloads ⇒ Selenium Client & WebDriver Language Bindings ⇒ Python ⇒ API Docs ⇒ Selenium documentation
(2022年4月20日 追記)リンクが復活したようです(追記終わり)
(www.selenium.dev) selenium.webdriver.remote.webdriver
(www.selenium.dev) execute_script(script, *args)
(2019/11/30 リンク切れ)
Selenium-WebDriver API Commands and OperationsUsing JavaScript – executeScript のマニュアル https://www.seleniumhq.org/docs/03_webdriver.jsp#using-javascript
MDN Web Docs – Javascript のマニュアル
Javascript の使い方のページをまとめました。
以下のジャバスクリプトを、セレニウムのエクセキュートスクリプトに渡して使います。
Javascript でタグを取得するメソッドが載っているページです。
(developer.mozilla.org) Document – Web API | MDN
タグの id 属性で取得するメソッドです。
(developer.mozilla.org) document.getElementById(String id)
タグのクラス名(クラス属性)で取得するメソッドです。
(developer.mozilla.org) Document.getElementsByClassName()
タグの name 属性で取得するメソッドです。
(developer.mozilla.org) document.getElementsByName(String name)
タグ名で取得するメソッドです。
(developer.mozilla.org) Document.getElementsByTagName()
SendKeysで文字列を入力するコード
従来通り、SendKeys でフォームのテキストボックスに入力するコードです。
コード例
Python のコード例です。
複数形の find_elements は配列が返るので、ここでは例として、最初の要素 [0] を指定しました。
"""send_keysで入力する方法"""
w.find_element_by_id('id属性').send_keys(text)
w.find_element_by_name('name属性').send_keys(text)
w.find_elements_by_class_name('class名(class属性)')[0].send_keys(text)
# 変数の説明 w: ウェブドライバー text: 入力するテキスト
タグの取得方法(Selenium公式マニュアル)
Selenium でタグを取得するメソッドのマニュアルをまとめました。
Ruby、Java、Python、C#(CSharp) のドキュメント(マニュアル)がありました。
ここでは、Python 用のタグの取得メソッドの『一部』を紹介します。
https://www.selenium.dev/ ⇒ Downloads ⇒ Selenium Client & WebDriver Language Bindings ⇒ Python ⇒ API Docs ⇒ Selenium documentation
(www.selenium.dev) selenium.webdriver.remote.webdriver
(2022年4月20日 追記)リンクが復活したようです(追記終わり)
タグ取得メソッドには、単数形の『element』と、複数形 plural の『elements』という、『2種類』が用意されているものもありました。
By ID – タグの『id 属性』で取得
(www.selenium.dev) find_element_by_id(id_)
By Class Name – タグの『クラス名(クラス属性)』で取得
(www.selenium.dev) find_elements_by_class_name(name)
By Tag Name – タグの『name 属性』で取得
(www.selenium.dev) find_element_by_name(name)
By Name – 『タグ名』で取得
(www.selenium.dev) find_elements_by_tag_name(name)
By CSS – 『CSS セレクタ』で取得
(www.selenium.dev) find_elements_by_css_selector(css_selector)
By XPath – 『XPath』で取得
(www.selenium.dev) find_elements_by_xpath(xpath)
SendKeys は遅い
Selenium の SendKeys はキー入力を再現しているためか、どうしても input・textarea・テキストボックスへの文字入力が遅かったです。
なので、長いテキストを入力するときやテストの高速化が必要な時は、executeScript で Javascript を使う方法がおすすめです。
executeScript('Javascript')で高速入力
テキストエリアに一瞬で入力するには、executeScript(エクセキュートスクリプト)で、文字列代入の Javascript を書きます。
Javascript でテキストエリアの .value に代入すれば、一瞬で入力が完了します。
クリップボードからテキストを貼り付けるように、『パッ!』と文字列が入りました。
Selenium は、テキストの取得はできますが、テキストの入力方法となると SendKey くらいしかないんですよね。
そのあたりをカバーしてくれるのが、executeScript になります。
Javascript の実行さえ許可されていれば、テキスト入力が一瞬でできるようになります。
テキスト入力はセレニウムが苦手とするところですので、executeScript('Javascript')
で入力するアプローチは良かったです。
SendKeysでコピー&ペーストするアプローチ
SendKeys でも、クリップボードを使えばテキストの高速入力が可能です。
SendKeys でコピー&ペーストのキーボード操作を再現する方法になります。
Javascript を使わなくても高速入力ができるので、こちらもひとつのアプローチだと思います。
以上です。