12

在Rails應用程序中,我試圖在Rspec中使用Capybara和capybara-webkit驅動程序測試Bootstrap modaljQuery TokenInput field。有問題的部分如下:通過Capybara(v2)與Bootstrap模式交互的問題

click_link 'Create Team Modal' 
sleep 1 

within('div#modal_popup') do 
    fill_in 'input#token-input-team_name', with: 'Fancy team name' 
    sleep 1 
    fill_in 'input#token-input-team_name', with: '\t' 
    sleep 1 

    click_button 'Create Team' 
end 

page.should have_content('Fancy team name') 
  • 點擊按鈕獲取模式
  • 填寫TokenInput與隊名
  • 模擬一個Tab按鍵讓它選擇
  • 創建團隊
  • 驗證名稱顯示在頁面

這隻會在工作與所有那些sleep 1 S IN的地方;否則水豚在崩潰have_content,最終導致服務器錯誤,因爲球隊的名字從來沒有能夠適當地選擇。其他引導模態沒有一個TokenInput場不需要sleep 1加載完畢之前,但是。

說了這麼多,有沒有什麼辦法擺脫睡覺,並有這種正常進行?水豚2掏出wait_until(有很好的理由),因爲它會默認等待時間內等待測試的東西...但是,這似乎並沒有在我上面的測試中得到體現;就好像水豚並不在等待週期在進入/退出這個模式搞。有人對此有經驗嗎?使用Rails 3.2.10,Rspec的2.12,水豚2,水豚-webkit的0.14.0,TokenInput 1.6。

+2

這可能會有所幫助:http://blog.crowdint.com/2013/09/20/poltergeist-and-bootstrap-modals.html – Matt

回答

10

嘗試在測試ENV禁用動畫,佈局/ applicaiton.html.erb

<% if Rails.env.test? %> 
<style type="text/css"> 
    .modal.fade, .fade { 
     -webkit-transition: opacity 0.01s; 
     -moz-transition: opacity 0.01s; 
     -ms-transition: opacity 0.01s; 
     -o-transition: opacity 0.01s; 
     transition: opacity 0.01s; 
    } 
</style> 
<%end%> 
+1

作爲[croudint文章]中指出(HTTP://博客。 crowdint.com/2013/09/20/poltergeist-and-bootstrap-modals.html)@matt鏈接,這也可以在一個單獨的樣式表。 –

+0

哪個版本的Bootstrap適用於?我遇到了同樣的問題,但我使用的是Bootstrap 3,上面的建議似乎沒有解決我的問題。 – danielricecodes

+0

這對我的作品上引導V3.0.2 – hooverlunch

8

我建議加上falowing CSS測試ENV:

div, a, span, footer, header { 
     -webkit-transition: none !important; 
     -moz-transition: none !important; 
     -ms-transition: none !important; 
     -o-transition: none !important; 
     transition: none !important; 
    } 

    .modal { 
    display: none !important; 
    } 

    .modal.in { 
    display: block !important; 
    } 

    .modal-backdrop { 
    display: none !important; 
    } 

加入這個js的和身體的:

$(".fade").removeClass("fade"); 

這已經解決了我的大部分水豚和引導問題。

+0

同時,還需要(對我來說)使用'寶石「水豚,webkit'' – jmarceli

+0

這包括所有的情況下,不同的是接受的答案 – babonk

0

我們只是做到這一點,似乎工作(例如點擊$('.tp-header-login'):

# instead of find(".tp-header-login") 

find(".tp-header-login") # still do the find so you are sure its loaded then... 
execute_script "$('.tp-header-login').click()" 
0

對於希望避免Rails.env.___?黑客*的,以下似乎工作(到目前爲止 - 手指交叉)避免測試jQuery UI drag-and-drop functionality基於Bootstrap模式的問題。

首先,我們已經「等待」的模式出現,使用一個輔助方法是這樣的:

def wait_for_modal_to_appear 
    modal = wait_until { 
    # Look for the modal by ID/whatever... 
    } 
    raise Capybara::ModalNotFound.new('...') if modal.nil? 
    return modal 
end 

然而,我們仍然努力的時候是具有僞問題拖 - 放該模式中的元素。下面的代碼此外,加入剛剛return前行,似乎已經完成了招:

page.execute_script("document.getElementById('#{modal[:id]}').classList.remove('fade');") 

*只是這樣一個黑客最近導致了在我公司工作,需要一個緊急部署與...不良的代碼更改設法使其投入生產,因爲它僅由if Rails.env.production?限定符激活;否則它將失敗一半的測試套件。