12

W aplikacji Rails próbuję przetestować Bootstrap modal przy użyciu jQuery TokenInput field w Rspec przy użyciu Capybara ze sterownikiem capybara-webkit. Część o którym mowa jest w następujący sposób: przyciskProblemy z interakcjami z modami Bootstrap przez Capybara (v2)

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') 
  • Kliknij aby uzyskać modalne
  • Wypełnij TokenInput z nazwą zespołu
  • Symulacja naciśnięcia klawisza Tab, aby dostać wybrany
  • Stworzy Zespół
  • Sprawdź nazwę pokazuje się na stronie

będzie to tylko praca z wszystkimi tymi sleep 1 s na miejscu; w przeciwnym razie Capybara ulega awarii pod numerem have_content, co może doprowadzić do błędu serwera, ponieważ nazwa zespołu nigdy nie została poprawnie wybrana. Inne modemy Bootstrap: bez pole TokenInput nie wymaga jednak przed załadowaniem sleep 1.

Z tym wszystkim, co powiedziane, czy istnieje sposób na pozbycie się snu i czy postępowanie to przebiega normalnie? Kapibara 2 wyjęła wait_until (bez ważnego powodu), ponieważ będzie czekać w domyślnym czasie oczekiwania na przetestowanie czegoś ... ale to nie wydaje się być odzwierciedlone w powyższym teście; to tak, jakby Capybara nie angażowała się w ten okres oczekiwania po wejściu/wyjściu z tego modalu. Ktoś ma jakieś doświadczenie z tym? Używanie Rails 3.2.10, Rspec 2.12, Capybara 2, capybara-webkit 0.14.0, TokenInput 1.6.

+2

Może to być pomocne: http://blog.crowdint.com/2013/09/20/poltergeist-and-bootstrap-modals.html – Matt

Odpowiedz

10

Spróbuj wyłączyć animacje w teście env, układy/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

Jak wskazano w artykule [croudint] (http: // blog. crowdint.com/2013/09/20/poltergeist-and-bootstrap-modals.html), który jest połączony @matt, można go również umieścić w osobnym arkuszu stylów. –

+0

Do której wersji Bootstrapu ma to zastosowanie? Napotykam ten sam problem, ale używam Bootstrap 3, a powyższe zalecenie nie rozwiązuje problemu. – danielricecodes

+0

Działa to dla mnie na Bootstrap v3.0.2 – hooverlunch

8

Proponuję dodać falowing css w teście 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; 
    } 

Dodaj ten js w organizmie i :

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

To rozwiązało większość moich problemów z kapibarami i bootstrapem.

+0

Wymagane było również (w moim przypadku) użycie 'gem 'capybara-webkit'' – jmarceli

+0

Obejmuje to wszystkie przypadki, w przeciwieństwie do zaakceptowanej odpowiedzi – babonk

0

Po prostu to zrobić i wydaje się działać (na przykład kliknąć na $('.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

Dla tych, którzy chcą uniknąć Rails.env.___? hacki * następujące wydawało do pracy (do tej pory - kciuki) w unikaniu problemów z testowaniem jQuery UI drag-and-drop functionality na modach opartych na Bootstrap.

Po pierwsze, byliśmy już „czeka” dla modalna do stawienia się, stosując metodę pomocnika tak:

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 

Jednak nadal byliśmy problemy fałszywych podczas próby przeciągnij i upuść elementy tego modalu.Poniższy dodanie kodu dodaje się tuż przed linią return, wydaje aby zrobić trick:

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

* właśnie taki hack niedawno doprowadził do konieczności stosowania rozmieszczenia awaryjnego w firmie, w której pracuję ze ... Złą zmianą kodu udało się wprowadzić do produkcji, ponieważ została aktywowana tylko przez kwalifikator if Rails.env.production?; w przeciwnym razie nie powiodłaby się połowa testu.