-
-
Save michaelglass/8610317 to your computer and use it in GitHub Desktop.
module AlertConfirmer | |
class << self | |
def reject_confirm_from &block | |
handle_js_modal 'confirm', false, &block | |
end | |
def accept_confirm_from &block | |
handle_js_modal 'confirm', true, &block | |
end | |
def accept_alert_from &block | |
handle_js_modal 'alert', true, &block | |
end | |
def get_alert_text_from &block | |
handle_js_modal 'alert', true, true, &block | |
get_modal_text 'alert' | |
end | |
def get_modal_text(name) | |
page.evaluate_script "window.#{name}Msg;" | |
end | |
private | |
def handle_js_modal name, return_val, wait_for_call = false, &block | |
modal_called = "window.#{name}.called" | |
page.execute_script " | |
window.original_#{name}_function = window.#{name}; | |
window.#{name} = function(msg) { window.#{name}Msg = msg; window.#{name}.called = true; return #{!!return_val}; }; | |
#{modal_called} = false; | |
window.#{name}Msg = null;" | |
block.call | |
if wait_for_call | |
timed_out = false | |
timeout_after = Time.now + Capybara.default_wait_time | |
loop do | |
if page.evaluate_script(modal_called).nil? | |
raise 'appears that page has changed since this method has been called, please assert on page before calling this' | |
end | |
break if page.evaluate_script(modal_called) || | |
(timed_out = Time.now > timeout_after) | |
sleep 0.001 | |
end | |
raise "#{name} should have been called" if timed_out | |
end | |
ensure | |
page.execute_script "window.#{name} = window.original_#{name}_function" | |
end | |
end | |
end |
# this should catch the following alert | |
# | |
# <button onclick="alert('totally alerted')">make an alert happen!</button> | |
# | |
AlertConfirmer.get_alert_text_from do | |
click_buttton 'make an alert happen!' | |
end.should == 'totally alerted' |
You can either pull this module into somewhere, or add an "include Capybara::DSL" after L2
Thanks @michaelglass for the awesome hack to work around Poltergeist's glaring deficiency here!
@tesserakt I deleted the class << self
block and saved the file as spec/support/alert_confirmer.rb
. Then I told RSpec to load it like so:
RSpec.configure do |config|
config.include AlertConfirmer, type: :feature
end
and now I can use the helper methods directly in my feature specs (i.e. accept_confirm_from do ... end
instead of AlertConfirmer.get_alert_text_from do ... end
).
@abevoelker I used this moudle like you
accept_confirm_from do
click_buttton 'confirm'
end
but when I run this test. there is a error:
NoMethodError:
undefined method `click_buttton' for #<RSpec::ExampleGroups::FindRoom:0x007fe7bb97e960>
@fgcui1204 I was getting the same error. I had to include the alerts_and_confirms.rb file in my support folder and remove the class << block. Then I could use accept_alert_from do...
undefined local variable or method
page' for AlertConfirmer:Module # ./spec/support/alerts_and_confirms.rb:52:in
ensure in handle_js_modal'