2

我使用Capybara,selenium-webdriver gem和chromedriver來驅動我的啓用javascript的測試。水豚/硒在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事件的模板。當觸發事件發生時,我們會顯示一個模式說明登錄成功,然後執行location.reload()

+0

待辦事項你的應用程序中有什麼(機架攻擊等)來限制請求?如果沒有,請檢查您的test.log,以獲取有關請求是否實際完成以及應用程序在做什麼的信息。另外,你有什麼'Capybara.server'設置? –

+0

我知道我昨天說過我能夠在本地複製,但今天很難做到這一點來檢查日誌。沒有請求限制。我不是手動將服務器設置爲任何東西,所以它是默認值。 –

+1

如果您沒有將Capybara.server設置爲默認爲Webrick的任何內容,則可能存在多個同時發生的請求問題。嘗試設置'Capybara.server =:puma',看看這是否有所作爲。 –

回答

0

原來,這不是排除在JS中做location.reload()。它有時只是訪問一個頁面。

對我來說,解決方案是創建了硒司機HTTP客戶端,並指定更長的超時值:用我自己的訪問方法的版本

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

解決類似的問題:

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