【Selenium】SendKeysの文字入力が遅いときは『executeScript』で入力すると一瞬

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: 入力するテキスト

Selenium – executeScript のマニュアル

Seleniumで任意のJavascriptを実行する『executeScriptエクセキュート スクリプト』メソッドのページです。

Ruby、Java、Python、C#(CSharp) のドキュメント(マニュアル)がありました。

ここでは、Python 用のマニュアルを紹介します。

https://selenium.dev/ ⇒ Downloads ⇒ Selenium Client & WebDriver Language Bindings ⇒ Python ⇒ API Docs ⇒ Selenium documentation

selenium.webdriver.remote.webdriver — Selenium documentation

execute_script(script, *args) のマニュアル

(2019/11/30 リンク切れ)
Selenium-WebDriver API Commands and Operations

Using JavaScript – executeScript のマニュアル
 https://www.seleniumhq.org/docs/03_webdriver.jsp#using-javascript

MDN Web Docs – Javascript のマニュアル

Javascriptの使い方のページをまとめました。

以下のジャバスクリプトを、セレニウムのエクセキュートスクリプトに渡して使います。

Javascriptでタグを取得するメソッドが載っているページです。
Document – Web API | MDN

タグのid属性で取得するメソッドです。
document.getElementById(String id)

タグのクラス名(クラス属性)で取得するメソッドです。
Document.getElementsByClassName()

タグのname属性で取得するメソッドです。
document.getElementsByName(String name)

タグ名で取得するメソッドです。
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://selenium.dev/ ⇒ Downloads ⇒ Selenium Client & WebDriver Language Bindings ⇒ Python ⇒ API Docs ⇒ Selenium documentation

selenium.webdriver.remote.webdriver — Selenium documentation

タグ取得メソッドには、単数形の『element』と、複数形 pluralプルーラル の『elements』という、『2種類』が用意されているものもありました。

By ID – タグの『id属性』で取得
find_element_by_id(id_)

By Class Name – タグの『クラス名(クラス属性)』で取得
find_elements_by_class_name(name)

By Tag Name – タグの『name属性』で取得
find_element_by_name(name)

By Name – 『タグ名』で取得
find_elements_by_tag_name(name)

By CSS – 『CSSセレクタ』で取得
find_elements_by_css_selector(css_selector)

By XPath – 『XPath』で取得
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を使わなくても高速入力ができるので、こちらもひとつのアプローチだと思います。

タイトルとURLをコピーしました