如何等待并接受带有水豚/硒的警报箱

时间:2014-02-18 10:30:42

标签: rspec selenium-webdriver capybara alertdialog 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
    } 
  }
  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运行命令时并不总是在屏幕上。如果警报框未关闭,下一个测试用例当然会遇到“超时错误”。

如果我在sleep 1click_button之间使用...alert.accept,它总能正常工作,但这不是一个非常好的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:19)

以下是我用过的一些代码。

wait = Selenium::WebDriver::Wait.new ignore: Selenium::WebDriver::Error::NoAlertPresentError
alert = wait.until { page.driver.browser.switch_to.alert }
alert.accept

答案 1 :(得分:1)

expect{
  accept_alert "Are you sure?" do
    click_link "Destroy"
  end
  sleep 1.second # !important
}.to change(Post, :count).by(-1)