質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

3回答

6552閲覧

Seleniumでtextareaに絵文字入りのテキストをReturnキーで送信できません。

masa0411

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

1クリップ

投稿2020/05/03 22:51

編集2020/05/04 02:53

前提・実現したいこと

とあるチャットサイトで、Seleniumでtextareaに絵文字入りのテキストを入力&Returnキーで
送信したいのですが、Returnキーが反応せず、送信できなくなりました。
テキスト入力まではできます。
対処方法を助言いただけないでしょうか。

このサイトでは、送信ボタンなどもなく、Returnキーのみのチャット送信になっています。
以前はReturnキーでテキストを送信できていましたが、期間を置いて試したところ、
送信できなくなりました。

SeleniumもしくはJavascriptでReturnキーを有効化&送信できるような方法がないか、
もしくは、そのほか対処方法があれば、助言いただけないでしょうか。

ソースコードは以下になります。

発生している問題・エラーメッセージ

下記コードをChromeで実行してますが、Pythonのログも、 Chromeデベロッパーツールのconsoleも、エラーは発生していません。

該当のソースコード

python

1textarea_element = u"//textarea[contains(@class,\"hoge\")]" 2 3text = u'''????test''' 4 5JS_ADD_TEXT_TO_INPUT = """ 6console.log( "start" ); 7try { 8 var elm = arguments[0], txt = arguments[1]; 9 elm.value += txt; 10 11 elm.dispatchEvent(new Event('change')); 12} catch(e) { 13 console.log( e.message ); 14} 15""" 16 17 18elem = driver.find_element(by=By.XPATH, value=textarea_element) 19 20driver.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) 21# driver.find_element_by_xpath(textarea_element).send_keys(text) 22 23driver.find_element(by=By.XPATH, value=textarea_element).send_keys(Keys.RETURN); 24 25

試したこと

・textは、「u'''test'''」に変えても送信できません。

・コメントアウトしているsend_keysで実行する場合、「u'''test'''」は送信できますが、
絵文字を交えた「u'''????test'''」で送信するとエラーが発生する
(unknown error: ChromeDriver only supports characters in the BMP)ため、
send_keysは使わず、execute_scriptを使っています。

・Seleniumでtextareaに自動入力後、手動でReturnキーを叩いても、
Returnキーが作動しません。
ただし、自動入力後のテキストに、手入力で先頭に任意の1文字入力した場合は、
正常にReturnキーが作動します。
※この挙動がよく分かっていないのですが、サイト側で、textareaのSeleniumの入力を検知して、
Returnキーの作動を止めているのでしょうか。。。

補足情報(FW/ツールのバージョンなど)

Google Chrome Canary:84.0.4134.0
ChromeDriver:83.0.4103.14
selenium(pipでインストール):3.141.0
Python:3.7.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/03 23:33

Retuenキー とは何でしょうか
masa0411

2020/05/03 23:34 編集

キーボードのEnterキーです。
masa0411

2020/05/03 23:37

修正しました。ご指摘ありがとうございます。
otn

2020/05/04 01:13

ENTERでは?
masa0411

2020/05/04 01:31 編集

コメントありがとうございます。 下記ENTERでも試しましたが、反応はしません。 driver.find_element_by_xpath(textarea_element).send_keys(Keys.ENTER); driver.find_element(by=By.XPATH, value=textarea_element).send_keys(Keys.ENTER);
guest

回答3

0

自己解決

最終的に、以下で解決することができました。
execute_scriptで絵文字入りテキストを入力後、
RETURNの前にsend_keysで任意の文字列を送ることで、解決しました。
send_keysで手入力で入力したように後処理することで、問題を回避しました。
コメントいただいた皆様ありがとうございました!

python

1textarea_element = u"//textarea[contains(@class,\"hoge\")]" 2 3text = u'''????test''' 4 5JS_ADD_TEXT_TO_INPUT = """ 6console.log( "start" ); 7try { 8 var elm = arguments[0], txt = arguments[1]; 9 elm.value += txt; 10 11 elm.dispatchEvent(new Event('change')); 12} catch(e) { 13 console.log( e.message ); 14} 15""" 16 17 18elem = driver.find_element(by=By.XPATH, value=textarea_element) 19 20driver.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) 21 22driver.find_element_by_xpath(textarea_element).send_keys(" ") 23driver.find_element(by=By.XPATH, value=textarea_element).send_keys(Keys.RETURN);

投稿2020/05/04 09:47

masa0411

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

・Seleniumでtextareaに自動入力後、手動でReturnキーを叩いても、

Returnキーが作動しません。

ただし、自動入力後のテキストに、手入力で先頭に任意の1文字入力した場合は、

正常にReturnキーが作動します。

とあるので、JavaScriptでtextareaに文字入力をした後、必要なイベントが発火していないのでは?
elm.dispatchEvent(new Event('change')); でChangeイベントは発火させているようですが、DevToolsで他に登録されているイベントリスナーが無いかどうか確認してみてください。
(確認の仕方は、 https://developers.google.com/web/tools/chrome-devtools/console/events?hl=ja のEvent Listeners Inspector などを参照してください)

投稿2020/05/04 03:53

編集2020/05/04 03:55
tsuemura

総合スコア663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa0411

2020/05/04 09:09 編集

大変助かります、助言ありがとうございます。 今検証しているChromeのUIが、お知らせいただいた記事と異なりましたので、下記の記事が参考になりました。 https://teratail.com/questions/258591# ``` Event Listeners では Ancestors と Framework listeners のオプションがあります。Ancestors は、現在選択されているノードのイベントリスナーに加えて、そのノードの祖先のイベントリスナーも表示するオプションです。Ancestors のチェックがオフになっている場合、現在選択されているノードのイベントリスナーのみが表示されます。 ``` 対象のtextareaを選択し、Ancestorsをオフにすると、以下のイベントリスナーのみ存在することが分かりました。 ``` Invalid ◻︎◻︎▼textarea.hoge ◻︎◻︎◻︎◻︎▼handler: f(e,t,n) ◻︎◻︎◻︎◻︎◻︎◻︎▶︎[[Scopes]]: Scopes[2] ◻︎◻︎◻︎◻︎◻︎◻︎◻︎[[FunctionLocation]]: <unknown> ◻︎◻︎◻︎◻︎◻︎◻︎▶︎__proto__: f () ◻︎◻︎◻︎◻︎◻︎◻︎▶︎prototype: {constructor: f} ◻︎◻︎◻︎◻︎◻︎◻︎◻︎name: ◻︎◻︎◻︎◻︎◻︎◻︎◻︎Length: 3 ◻︎◻︎◻︎◻︎◻︎◻︎◻︎caller: (...) ◻︎◻︎◻︎◻︎◻︎◻︎◻︎arguments: (...) ◻︎◻︎◻︎◻︎◻︎◻︎once: false ◻︎◻︎◻︎◻︎◻︎◻︎passive: false ◻︎◻︎◻︎◻︎◻︎◻︎useCapture: false ``` そのため、elm.dispatchEvent「change」を「invalid」に変えて再度実行しましたが、状況変わらずでした。 concoleエラーログも吐かれてません。 ``` JS_ADD_TEXT_TO_INPUT = """ console.log( "start" ); try { var elm = arguments[0], txt = arguments[1]; elm.value += txt; elm.dispatchEvent(new Event('invalid')); } catch(e) { console.log( e.message ); } """ ``` f(e,t,n)となっているので、引数をセットしないといけないのかもしれませんが、ひとまず状況報告させていただきます。 ありがとうございます。
guest

0

最終的に、以下で解決することができました。
execute_scriptで絵文字入りテキストを入力後、
RETURNの前にsend_keysで任意の文字列を送ることで、解決しました。
send_keysで手入力したように後処理することで、問題を回避しました。
コメントいただいた皆様、ありがとうございました!

python

1textarea_element = u"//textarea[contains(@class,\"hoge\")]" 2 3text = u'''????test''' 4 5JS_ADD_TEXT_TO_INPUT = """ 6console.log( "start" ); 7try { 8 var elm = arguments[0], txt = arguments[1]; 9 elm.value += txt; 10 11 elm.dispatchEvent(new Event('change')); 12} catch(e) { 13 console.log( e.message ); 14} 15""" 16 17elem = driver.find_element(by=By.XPATH, value=textarea_element) 18driver.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) 19driver.find_element_by_xpath(textarea_element).send_keys(" ") 20driver.find_element(by=By.XPATH, value=textarea_element).send_keys(Keys.RETURN);

投稿2020/05/04 09:48

編集2020/05/04 09:52
masa0411

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問