Selenium webdriver 如何等待和接受含水豚/硒的警报框

Selenium webdriver 如何等待和接受含水豚/硒的警报框,selenium-webdriver,rspec,capybara,alert,unobtrusive-javascript,Selenium Webdriver,Rspec,Capybara,Alert,Unobtrusive Javascript,我在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 } } i

我在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
单击按钮
触发一个不引人注目的javascript调用,该调用显示一个警报弹出窗口。但是,仅在大约50%的测试运行中成功关闭警报框,我想这是因为在运行命令
page.driver.browser.switch_to.alert.accept
时,警报框并不总是在屏幕上。当然,如果警报框未关闭,下一个测试用例将运行“超时错误”


如果我在
单击按钮
警报之间使用
睡眠1
,它总是正常工作。接受
,但这不是一个很好的解决方案。有什么想法吗?

这是我用于此的一些代码

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