2

私は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()を実行します。

+0

ドゥリクエストを抑制するアプリ内に何かがある(ラックアタックなど)?そうでない場合は、リクエストが実際に行われたかどうか、アプリが何をしていたかについての情報をtest.logで確認してください。また、 'Capybara.server'はどのように設定されていますか? –

+0

私は昨日私がローカルで再現することができたと知っているが、今日はログをチェックするのが苦労していることは分かっている。リクエスト抑制なし。私は手動でサーバを何かに設定しているわけではないので、デフォルトは何でも構いません。 –

+1

'Capybara.server'に何も設定していない場合は、デフォルトでWebrickになります.Webbrickは複数の同時リクエストに問題がある可能性があります。 'Capybara.server =:puma'を設定してみて、違いがあるかどうか確認してください。 –

答えて

0

これはJSでlocation.reload()を実行することに排他的ではないことが判明しました。時折、単にページを訪れたときに起こったことがあります。訪問方法の私自身のバージョンを使用して、

Capybara.register_driver :chrome do |app| 
    client = Selenium::WebDriver::Remote::Http::Default.new 
    client.read_timeout = 120 

    Capybara::Selenium::Driver.new(app, {browser: :chrome, http_client: client}) 
end 
+0

これは私にとってはうまくいかず、私はエラーを引き続き受けました –

0

解決同様の問題:

私のためのソリューションは、セレンドライバのためのHTTPクライアントを作成し、長いタイムアウトを指定した

def safe_visit(url) 
    max_retries = 3 
    times_retried = 0 
    begin 
    visit url 
    rescue Net::ReadTimeout => error 
    if times_retried < max_retries 
     times_retried += 1 
     puts "Failed to visit #{current_url}, retry #{times_retried}/#{max_retries}" 
     retry 
    else 
     puts error.message 
     puts error.backtrace.inspect 
     exit(1) 
    end 
    end 
end 
関連する問題