Seleniumのsend_keysは遅いのでexecute_scriptで対応する

普段pythonでスクレイピングを行っているのですが、ウェブドライバーからテキストエリアに文字列を入力する際にsend_keys()を使用すると、まぁ遅い。

少ない文字の入力であればそれほど処理の遅さを実感しないので、send_keys()で事足りると思うのですが、割と大きい文字列を入力すると入力がもっさりします。

目次

execute_script()に置き換える

そんなときは、send_keys()execute_script()に置き換えて高速化を図ります。

execute_script()はJavaScriptを直接実行する関数なので、早いです。

これまで

これまではこんな感じ

input_text = "teststring......." # めっちゃ長い文字列
driver.send_keys(input_text)

これから

高速化のためexecute_script()で置き換える

input_text = "teststring......." # めっちゃ長い文字列
driver.execute_script("document.getElementById('form_codes').value='%s';" % input_text)

これで一瞬でテキストエリアに入力できました。

説明し忘れてましたが...

テキストエリアの要素を取得する方法は
javascriptのid属性を取得するか、name属性を取得するか、class属性を取得するかで若干記述が異なります
(構文はJavaScriptなのでJSをやっている方ならすぐに理解できるでしょう。)

driver.execute_script("document.getElementById('id属性').value='%s';" % input_text)
driver.execute_script("document.getElementsByName('name属性')[0].value='%s';" % input_text)
driver.execute_script("document.getElementsByClassName('class名(class属性)')[0].value='%s';" % input_text)

改行を含む文字列のexecute_script()の記述について

ただ、send_keys()execute_script()に置き換えただけの記事を書きたかったのではないです。
僕の場合テキストエリアに入力する文字列に改行が含まれていたので上記の方法では上手く行かず、少し記述に苦戦しました..。(というのを共有したかった)

改行を含んだ文字列の場合は以下の記述になります

input_text = "test\nhogehoge\nabc123...." # めっちゃ長い改行を含んだ文字列
driver.execute_script("document.getElementById('form_codes').value='%s';" % input_text.replace('\n', '\\n'))

改行コードにエスケープ文字を付与してあげるんですね。
そうすることでJavaScript側でしっかり読みこんでくれます

ここらへんの記述は様々な記事で改行コードは\r\nとするべきだとか、そもそもreplace()で置き換える必要もないなどの論争がありますが、僕の場合はこれで上手くいったということを共有しておきます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる