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. Следующий тестовый сценарий, конечно, запускается в «Ошибка тайм-аута», если окно предупреждения не закрыто.

Он работает всегда правильно, если я использую sleep 1 между click_button и ...alert.accept, но это не очень хорошее решение. Есть идеи?

ответ

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) 
Смежные вопросы