4

一個警告框,我用我的RSpec的測試下面的代碼:如何等待和接受與水豚/硒

describe "Save should create a BasketItem and a Basket" do 
    subject { 
    lambda { 
     click_button I18n.t(:create_basket_and_add_items) 
     page.driver.browser.switch_to.alert.accept # close the alert box 
    } 
    } 
    it { should change(BasketItem, :count).by(1) } 
    it { should change(Basket,  :count).by(1) } 
end 

click_button火一個不顯眼的JavaScript調用,顯示一條警告彈出窗口。然而,關閉警報框僅在約50%的測試運行中成功,我猜是因爲在命令page.driver.browser.switch_to.alert.accept正在運行時警報框並非總是在屏幕上。當然,如果警告框未關閉,下一個測試用例會遇到「超時錯誤」。

它工作總是正確的,如果我在click_button...alert.accept之間使用sleep 1,但它不是一個很好的解決方案。任何想法?

回答

16

這是我用於此的一些代碼。

wait = Selenium::WebDriver::Wait.new ignore: Selenium::WebDriver::Error::NoAlertPresentError 
alert = wait.until { page.driver.browser.switch_to.alert } 
alert.accept 
1
expect{ 
    accept_alert "Are you sure?" do 
    click_link "Destroy" 
    end 
    sleep 1.second # !important 
}.to change(Post, :count).by(-1)