私はjavascript対応のテストを駆動するために、Capybara、セレンウェブドライブの宝石、クロムドライバを使用しています。Capybara/Seleniumはlocation.reload()でランダムにNet :: ReadTimeoutを取得します。
問題は、Net::ReadTimeout
というエラーが原因でビルドの約50%が失敗するという問題です。最初はこれは「要素を見つけることができませんでした」というエラーが表示されましたが、Capybaraのデフォルトの最大待機時間を30秒に引き上げた後、タイムアウトが開始されました。
私は、タイムアウトが発生したときのスクリーンショットを調べました.Javascript関数location.reload()
を使用してページをリロードする前に、簡単に表示された「正常にログインしました」というモーダルに固執しました。
私はテストをローカルで実行しましたが、無作為にそれを再現することもあります。時にはこのモーダルで詰め込み、リロードを非常に速くしてもそれをほとんど見ないことができます。
ユーザーがログインフォームにアクセスするために、その時点でサイトが既にロードされているため、資産のコンパイルの問題とは思われません。
これまで誰もがこれを見て解決策を知っているのだろうか?
特定コード:
visit login_path
page.within '#sign-in-pane__body' do
fill_in 'Email', with: user.email
click_button 'Submit'
end
expect(page).to have_content 'Enter Password'
page.within '#sign-in-pane__body' do
fill_in 'Password', with: user.password
click_button 'Submit'
end
expect(page).to have_text 'Home page landing text'
ハングアップはclick_button 'Submit'
とホームページのテキストを期待しての間で起こります。
タイムアウトを引き起こすロジックの流れは、ユーザーがログインフォームを送信したときに、サーバーが.js.erb
テンプレートをレンダリングし、ログインに成功するとJSイベントをトリガーするのを待ちます。そのトリガが発生すると、ログインが成功したというモーダルのメッセージが表示され、location.reload()
を実行します。
ドゥリクエストを抑制するアプリ内に何かがある(ラックアタックなど)?そうでない場合は、リクエストが実際に行われたかどうか、アプリが何をしていたかについての情報をtest.logで確認してください。また、 'Capybara.server'はどのように設定されていますか? –
私は昨日私がローカルで再現することができたと知っているが、今日はログをチェックするのが苦労していることは分かっている。リクエスト抑制なし。私は手動でサーバを何かに設定しているわけではないので、デフォルトは何でも構いません。 –
'Capybara.server'に何も設定していない場合は、デフォルトでWebrickになります.Webbrickは複数の同時リクエストに問題がある可能性があります。 'Capybara.server =:puma'を設定してみて、違いがあるかどうか確認してください。 –