teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤字修正

2019/05/30 23:41

投稿

suama
suama

スコア1997

answer CHANGED
@@ -71,7 +71,7 @@
71
71
 
72
72
  まず、developmentモードではただしくCKEditorが表示される場合。
73
73
  testモードでCapybaraでのE2Eテストをする際に、ヘッドレスモードにしていますか?
74
- もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
74
+ もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
75
75
 
76
76
  描画されない場合:CKEditorの設定を確認
77
77
  描画される場合:テストをwaitさせてみる
@@ -104,5 +104,5 @@
104
104
  - editor_body.send_keys("Test Body") を実行
105
105
  - 入力後 iframeから外れる場合は操作対象を切り替え
106
106
 
107
- まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。
107
+ まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。(ソースありがとうございます!)
108
108
  もしよければ試してみてくださいね。

1

追記しました。

2019/05/30 23:41

投稿

suama
suama

スコア1997

answer CHANGED
@@ -63,4 +63,46 @@
63
63
  [https://stackoverflow.com/questions/10957869/how-to-fill-ckeditor-from-capybara-with-webkit-or-selenium-driver](https://stackoverflow.com/questions/10957869/how-to-fill-ckeditor-from-capybara-with-webkit-or-selenium-driver)
64
64
 
65
65
 
66
- 長くなりましたが、全く外していましたらご容赦くださいませ...。
66
+ 長くなりましたが、全く外していましたらご容赦くださいませ...。
67
+
68
+ ### 追記
69
+
70
+ #### CKEditor not definedの件
71
+
72
+ まず、developmentモードではただしくCKEditorが表示される場合。
73
+ testモードでCapybaraでのE2Eテストをする際に、ヘッドレスモードにしていますか?
74
+ もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
75
+
76
+ 描画されない場合:CKEditorの設定を確認
77
+ 描画される場合:テストをwaitさせてみる
78
+
79
+ 自動でテストの場合はブラウザでの読み込みが完了する前にテストのステップが進行してしまうので、「そんな要素は無いよ」といったエラーになることがあります。
80
+ CKEditorは上記の通りAjaxで後追いで読み込まれるので、操作をする少し前に、sleep処理を挟んだりAjax処理が完了するのを待つ処理を入れたりするといいのかもしれません。
81
+
82
+ CKEditorではないのですが、わたしもAjaxの処理を待つ関係で以下のような処理を入れています。
83
+
84
+
85
+ [参考:RSpec+Capybaraでajaxとかcssとかを待つ](https://qiita.com/xojan0120/items/09bb0e5257e06a4bd948)
86
+
87
+
88
+ #### JSを使わない方法
89
+
90
+ Capybara + CKEditor + RSpecだと情報が少ないかもしれませんが、CKEditor + Selenium だと、もう少し情報が出てきそうです。
91
+ ちょっと探したら以下のようなものがありました。
92
+
93
+ Pythonのコードですが、page.execute_script() ではなく一般的な「HTMLの要素を見つけてそこにテキストをセットする」方法です。
94
+
95
+ 本来はこちらのほうが自然な気はしますね。
96
+ [https://bangladroid.wordpress.com/2016/08/20/switch-to-ckeditor-in-selenium-python/](https://bangladroid.wordpress.com/2016/08/20/switch-to-ckeditor-in-selenium-python/)
97
+
98
+ やり方としては、Capybaraでの page が現在のメインのページを表しているので、以下の流れになっています。
99
+
100
+ - 念の為CKEditorが描画されるまで少し待つ(ここでもsleepで待っている感じです)
101
+ - CKEditorを描画しているiframe側に操作対象を移す
102
+ - ブラウザで表示の際、CKEditorを描画しているifarmeがありませんか?ターゲットはそこになります
103
+ - 操作対象をiframeに切り替え、その中の body (CKEditorのテキストエリア部分)を特定する
104
+ - editor_body.send_keys("Test Body") を実行
105
+ - 入力後 iframeから外れる場合は操作対象を切り替え
106
+
107
+ まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。
108
+ もしよければ試してみてくださいね。