From ec4d32f7d2ebee92dab73aaa61753f8fbd00c716 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Mon, 14 Aug 2017 16:25:57 -0700 Subject: [PATCH] Ensure modal methods receive a block when using headless chrome --- lib/capybara/selenium/driver.rb | 6 ++++-- spec/shared_selenium_session.rb | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/capybara/selenium/driver.rb b/lib/capybara/selenium/driver.rb index 0c58609e..436c6c0a 100644 --- a/lib/capybara/selenium/driver.rb +++ b/lib/capybara/selenium/driver.rb @@ -245,8 +245,9 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base def accept_modal(_type, options={}) if headless_chrome? + raise ArgumentError, "Block that triggers the system modal is missing" unless block_given? insert_modal_handlers(true, options[:with], options[:text]) - yield if block_given? + yield find_headless_modal(options) else yield if block_given? @@ -260,8 +261,9 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base def dismiss_modal(_type, options={}) if headless_chrome? + raise ArgumentError, "Block that triggers the system modal is missing" unless block_given? insert_modal_handlers(false, options[:with], options[:text]) - yield if block_given? + yield find_headless_modal(options) else yield if block_given? diff --git a/spec/shared_selenium_session.rb b/spec/shared_selenium_session.rb index 4a9048a1..f070ff41 100644 --- a/spec/shared_selenium_session.rb +++ b/spec/shared_selenium_session.rb @@ -57,12 +57,18 @@ RSpec.shared_examples "Capybara::Session" do |session, mode| describe "#accept_alert" do it "supports a blockless mode" do - skip "Headless Chrome doesn't support blockless modal methods" if @session.driver.send(:headless_chrome?) @session.visit('/with_js') + skip "Headless Chrome doesn't support blockless modal methods" if @session.driver.send(:headless_chrome?) @session.click_link('Open alert') @session.accept_alert expect{@session.driver.browser.switch_to.alert}.to raise_error(Selenium::WebDriver::Error::NoAlertPresentError) end + + it "raises if block is missing" do + @session.visit('/with_js') + skip "Only Headless Chrome requires the block due to system modal JS injection" unless @session.driver.send(:headless_chrome?) + expect { @session.accept_alert }.to raise_error(ArgumentError) + end end context "#fill_in with { :clear => :backspace } fill_option", requires: [:js] do