2014-01-23 39 views
8

我在使用同一字段(「電子郵件」)在兩個表單上訪問兩個表單時遇到問題。如果我不手動睡覺,水豚似乎在測試的第二部分首次訪問時找到「電子郵件」字段。當第一頁與第二頁具有相同字段時等待第二頁加載的正確方法

# visit the first form and fill out a subscription 
visit new_front_form_subscription_path(@web_form_1.id) 
fill_in "Email", with: "[email protected]" 
fill_in "Field 1", with: "my first data" 
click_button "Subscribe" 

# visit the second form and fill out a subscription 
visit new_front_form_subscription_path(@web_form_2.id) 
sleep 1 
fill_in "Email", with: "[email protected]" 
fill_in "Field 2", with: "my second data" 
click_button "Subscribe" 

隨着睡眠在那裏,規格通過與飛行的顏色。如果沒有睡眠,第二次表單提交會得到一個驗證錯誤 - 指責一個空白的「電子郵件」值。

有沒有適當的方法來處理這個問題?我討厭在我們的規格中引入手動睡眠。我更願意告訴Capybara忽略頁面上已有內容的概念,或者沿着這些方向。

謝謝。

回答

5

這裏有一對夫婦的方式使用它你可以解決它:

  1. 使用另一種定位器是一種僅在第二頁,選擇「電子郵件」字段:

    find('#second_page #email').set('[email protected]') 
    
  2. 寫一個等待第二頁而不是睡眠的聲明:

    visit new_front_form_subscription_path(@web_form_2.id) 
    expect(page).to have_css('locator_present_only_at_second_page') 
    fill_in "Email", with: "[email protected]" 
    
+0

這有點kludgey,但可能是最好的方式來做到這一點。感謝您的答覆! – Alex

+0

也許我錯了,但如果第二頁尚未加載,那麼'expect'行會失敗嗎? – aceofbassgreg

+2

@aceofbassgreg幾乎所有的水豚方法都會自動等待(包括rspec matchers) - https://github.com/jnicklas/capybara#asynchronous-javascript-ajax-and-friends –

1

如果你使用了上面的Andrey的2),你可能想看看holdon gem,這將允許你寫一個等待元素加載的塊,然後在該元素加載時移動到fill_in方法。

+2

等效於'e = HoldOn.until(超時:60,區間:5){ s.first(:css,「div#bastard」)}'''e = find('div#bastard',wait:60,match::first)'。寶石寶石是完全沒有必要的。但我不想通過':match' param:'find('div#bastard',wait:60)' –

0

一般來說,可以這樣做。例如,要點擊加載模式彈出窗口(或其他頁面)後找到的按鈕,請將以下塊添加到您的宏文件中。

def wait_until_modal 
    page.has_css?('.modal') 
end 

這裏的class .modal可以在彈出的頁面找到。

3

上述答案是正確的,但如果您有大型測試套件,則很難實現,因爲您必須在每個頁面上找到唯一的元素。如果您是邁克爾哈特爾鐵路學校的畢業生,那麼有一個簡單的方法可以解決這個問題。 Hartl教導爲每個控制器操作設置不同的@title實例變量。然後在application.html.erb中爲每個頁面設置一個html標題元素。

我當然這樣做,它允許一個非常簡單的方法來修復所有我失敗的片狀測試,因爲頁面沒有正確加載。您無法找到標題標籤,因爲它不可見。所以我所做的是放在application.html.erb的底部,下面的代碼;

<%= content_tag :div, "[#{title}]", class: 'rspec_eyes_only' if Rails.env.test? %> 

如果您處於測試模式,則插入帶標題文本的div,並用方括號括起來。然後,我寫了一個幫手進去rails_helper.rb

def wait_for_page_load(title) 
    find('div.rspec_eyes_only', text: title) 
end 

我已經有另一個助手來測試正確的標題,所以我修改了它在wait_for_page_load加我。Ë;

def title_is_correct(title) 
    full_title = "#{BaseTitle} | #{title}" 
    wait_for_page_load "[#{full_title}]" 
    expect(page.title).to eq full_title 
end 

這些簡單的更改清理了幾乎所有的片狀測試。