回答編集履歴

2

誤字修正

2019/05/30 23:41

投稿

suama
suama

スコア1997

test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
  testモードでCapybaraでのE2Eテストをする際に、ヘッドレスモードにしていますか?
146
146
 
147
- もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
147
+ もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
148
148
 
149
149
 
150
150
 
@@ -210,6 +210,6 @@
210
210
 
211
211
 
212
212
 
213
- まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。
213
+ まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。(ソースありがとうございます!)
214
214
 
215
215
  もしよければ試してみてくださいね。

1

追記しました。

2019/05/30 23:41

投稿

suama
suama

スコア1997

test CHANGED
@@ -129,3 +129,87 @@
129
129
 
130
130
 
131
131
  長くなりましたが、全く外していましたらご容赦くださいませ...。
132
+
133
+
134
+
135
+ ### 追記
136
+
137
+
138
+
139
+ #### CKEditor not definedの件
140
+
141
+
142
+
143
+ まず、developmentモードではただしくCKEditorが表示される場合。
144
+
145
+ testモードでCapybaraでのE2Eテストをする際に、ヘッドレスモードにしていますか?
146
+
147
+ もしCIではなくローカ開発環境で実行しているようでしたら、可能だったらブラウザが開いて自動で操作が進むなか、CKEditorが描画されるところまでいっているか眺めてみてください。
148
+
149
+
150
+
151
+ 描画されない場合:CKEditorの設定を確認
152
+
153
+ 描画される場合:テストをwaitさせてみる
154
+
155
+
156
+
157
+ 自動でテストの場合はブラウザでの読み込みが完了する前にテストのステップが進行してしまうので、「そんな要素は無いよ」といったエラーになることがあります。
158
+
159
+ CKEditorは上記の通りAjaxで後追いで読み込まれるので、操作をする少し前に、sleep処理を挟んだりAjax処理が完了するのを待つ処理を入れたりするといいのかもしれません。
160
+
161
+
162
+
163
+ CKEditorではないのですが、わたしもAjaxの処理を待つ関係で以下のような処理を入れています。
164
+
165
+
166
+
167
+
168
+
169
+ [参考:RSpec+Capybaraでajaxとかcssとかを待つ](https://qiita.com/xojan0120/items/09bb0e5257e06a4bd948)
170
+
171
+
172
+
173
+
174
+
175
+ #### JSを使わない方法
176
+
177
+
178
+
179
+ Capybara + CKEditor + RSpecだと情報が少ないかもしれませんが、CKEditor + Selenium だと、もう少し情報が出てきそうです。
180
+
181
+ ちょっと探したら以下のようなものがありました。
182
+
183
+
184
+
185
+ Pythonのコードですが、page.execute_script() ではなく一般的な「HTMLの要素を見つけてそこにテキストをセットする」方法です。
186
+
187
+
188
+
189
+ 本来はこちらのほうが自然な気はしますね。
190
+
191
+ [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/)
192
+
193
+
194
+
195
+ やり方としては、Capybaraでの page が現在のメインのページを表しているので、以下の流れになっています。
196
+
197
+
198
+
199
+ - 念の為CKEditorが描画されるまで少し待つ(ここでもsleepで待っている感じです)
200
+
201
+ - CKEditorを描画しているiframe側に操作対象を移す
202
+
203
+ - ブラウザで表示の際、CKEditorを描画しているifarmeがありませんか?ターゲットはそこになります
204
+
205
+ - 操作対象をiframeに切り替え、その中の body (CKEditorのテキストエリア部分)を特定する
206
+
207
+ - editor_body.send_keys("Test Body") を実行
208
+
209
+ - 入力後 iframeから外れる場合は操作対象を切り替え
210
+
211
+
212
+
213
+ まだ手元では試していないのですが、わたしも知っておいてこれは良さそう!と思いましたので、やってみようと思います。
214
+
215
+ もしよければ試してみてくださいね。