Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save mycargus/d1df3adc9d1246ab74c4011b3f29fbc3 to your computer and use it in GitHub Desktop.

Select an option

Save mycargus/d1df3adc9d1246ab74c4011b3f29fbc3 to your computer and use it in GitHub Desktop.

Revisions

  1. @rosskevin rosskevin revised this gist Feb 12, 2015. 1 changed file with 121 additions and 54 deletions.
    175 changes: 121 additions & 54 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -1,84 +1,111 @@
    # verified against log_in.feature for blake
    # https://github.com/jnicklas/capybara/issues/1443
    # turn on webkit driver debug
    $use_webkit = true
    $use_chrome_instead_of_firefox = false
    $webkit_debug = false
    $wait_time = 5
    $use_chrome_instead_of_firefox = true

    def set_webkit_driver()
    def webkit_driver
    if $webkit_debug
    Capybara.javascript_driver = :webkit_debug
    return :webkit_debug
    else
    Capybara.javascript_driver = :webkit
    return :webkit
    end
    end

    def webkit?()
    def webkit?
    [:webkit, :webkit_debug].include? Capybara.current_driver
    end

    # Possible values are :truncation and :transaction
    # The :transaction strategy is faster, but might give you threading problems.
    # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
    Cucumber::Rails::Database.javascript_strategy = :truncation
    def selenium?
    Capybara.javascript_driver == :selenium
    end

    if $use_chrome_instead_of_firefox
    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
    #else
    # Capybara.register_driver :selenium do |app|
    # require 'selenium/webdriver'
    # profile = Selenium::WebDriver::Firefox::Profile.new
    # profile['focusmanager.testmode'] = 'true'
    # Capybara::Selenium::Driver.new(app, :profile => profile)
    # end
    end

    # Unnecessary on mac
    if (!OS.mac? && !$headless_started)

    require 'headless'
    # allow display autopick (by default)
    # allow each headless to destroy_at_exit (by default)
    # allow each process to have their own headless by setting reuse: false
    headless_server = Headless.new(:reuse => false)
    headless_server.start
    # try to get a unique port, important for parallels tests
    # if ENV['TEST_ENV_NUMBER']
    test_env_number = ENV['TEST_ENV_NUMBER']
    test_env_number ||= 1
    test_port = 9887 + test_env_number.to_i
    #test_port += 1 while is_port_open?(@port) and not is_running_on_port?(@port)

    puts "Capybara::Server.port: #{test_port} for test process: #{test_env_number}"
    Capybara.server_port = test_port
    # end


    if $headless_server.nil?

    # Unnecessary on mac, see https://github.com/leonid-shevtsov/headless/issues/31#issuecomment-8933108
    if !OS.mac?
    require 'headless'
    # allow display autopick (by default)
    # allow each headless to destroy_at_exit (by default)
    # allow each process to have their own headless by setting reuse: false
    # $headless_server = Headless.new(reuse: false)
    $headless_server = Headless.new(reuse: true, destroy_at_exit: false)
    $headless_server.start

    $headless_started = true
    puts "Process[#{Process.pid}] started headless server display: #{headless_server.display}"
    puts "Process[#{Process.pid}] started headless server display: #{$headless_server.display}"
    end
    end

    at_exit do
    unless $headless_server.nil?
    puts "Process[#{Process.pid}] destroying headless server on display: #{$headless_server.display}"
    $headless_server.destroy
    end
    end

    # Set capybara-webkit as the default driver for javascript, it is 3x faster than selenium in a simple test YMMV
    set_webkit_driver()

    # first time around, we need this set.
    if $use_webkit
    Capybara.default_driver = webkit_driver
    # Capybara.current_driver = webkit_driver
    # Capybara.javascript_driver = webkit_driver
    end


    #
    # If the @show tag is present on a non-mac environment, ignore it,
    # otherwise allow the combination of @javascript @show to trigger the
    # :selenium driver (which is :chrome browser as configured above)
    #
    Around('@javascript') do |scenario, block|
    Before do |scenario|

    if $use_webkit
    Capybara.current_driver = webkit_driver
    Capybara.javascript_driver = webkit_driver
    end

    # problem on @show with backgrounds: https://github.com/cucumber/cucumber/issues/52
    if should_show(scenario)

    # for some reason, just using the `using_driver` doesn't get us all the way there, so set/reset the `javascript_driver` as necessary.
    original_driver = Capybara.javascript_driver
    begin
    Capybara.javascript_driver = :selenium
    Capybara.using_driver :selenium do
    block.call
    end
    ensure
    Capybara.javascript_driver = original_driver
    end
    else
    block.call
    Capybara.current_driver = :selenium
    Capybara.javascript_driver = :selenium # needed for @show with chrome, as it doesn't seem to explicitly set the javascript driver
    end
    # puts "Using #{Capybara.current_driver}/#{Capybara.javascript_driver}/#{Capybara.default_driver}"
    end


    After do |scenario|

    # problem on @show with backgrounds: https://github.com/cucumber/cucumber/issues/52
    # puts "Done #{Capybara.current_driver}/#{Capybara.javascript_driver}/#{Capybara.default_driver}"
    Capybara.use_default_driver
    end

    def should_show(scenario)
    OS.mac? && has_tag(scenario, '@show')
    OS.mac? && (has_tag(scenario, '@show') || has_tag(scenario, '@leave_browser_open') || has_tag(scenario, '@single_step'))
    end

    def has_tag(scenario, tag)
    @@ -96,22 +123,62 @@ def has_tag(scenario, tag)
    Capybara.default_wait_time = $wait_time
    end


    # webkit javascript check only
    AfterStep do
    if webkit?
    begin

    #puts "All Javascript errors: #{page.driver.error_messages}"
    real_error_messages = page.driver.error_messages
    #real_error_messages = []
    #page.driver.error_messages.each_with_index do |e, i|
    # # first two messages appear to be bogus, always.
    # if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
    # # discard message
    # else
    # real_error_messages << e
    # end
    #end

    raise "Javascript errors: #{real_error_messages}" if real_error_messages.length > 0
    #puts "All Javascript errors: #{page.driver.error_messages}"
    # puts "All console messages: #{page.driver.console_messages}"
    real_error_messages = page.driver.error_messages
    #real_error_messages = []
    #page.driver.error_messages.each_with_index do |e, i|
    # # first two messages appear to be bogus, always.
    # if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
    # # discard message
    # else
    # real_error_messages << e
    # end
    #end
    if real_error_messages.length > 0
    unless real_error_messages.first[:source].include?('https://a.stripecdn.com/manage/assets/application.manage')
    raise "Javascript errors: #{real_error_messages}"
    end
    end
    rescue
    puts "Failed to check javascript error messages."
    end
    end
    end

    After do |scenario|
    if (scenario.failed?)
    print_console_messages scenario
    end
    end

    def print_console_messages(scenario)
    return unless webkit?
    begin
    messages = page.driver.console_messages

    if messages.presence && messages.size > 0
    print "\n--------------------------------------------------------------------------------------------------------------------------------------------"
    print "\nConsole: #{scenario_unique_name(scenario)}: "
    print "\n---------------------------------------------------------------------------\n"
    messages.each do |console_message|
    print "\n"
    print console_message[:message]
    end
    print "\n--------------------------------------------------------------------------------------------------------------------------------------------"
    else
    print "\n--------------------------------------------------------------------------------------------------------------------------------------------"
    print "\nNo Console messages for: #{scenario_unique_name(scenario)}: "
    print "\n--------------------------------------------------------------------------------------------------------------------------------------------"
    end
    $stdout.flush
    rescue
    puts "Failed to write console messages."
    end
    end
  2. @rosskevin rosskevin revised this gist Dec 18, 2013. 1 changed file with 11 additions and 10 deletions.
    21 changes: 11 additions & 10 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -12,7 +12,7 @@ def set_webkit_driver()
    end

    def webkit?()
    [:webkit, :webkit_debug].include? Capybara.javascript_driver
    [:webkit, :webkit_debug].include? Capybara.current_driver
    end

    # Possible values are :truncation and :transaction
    @@ -101,15 +101,16 @@ def has_tag(scenario, tag)
    if webkit?

    #puts "All Javascript errors: #{page.driver.error_messages}"
    real_error_messages = []
    page.driver.error_messages.each_with_index do |e, i|
    # first two messages appear to be bogus, always.
    if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
    # discard message
    else
    real_error_messages << e
    end
    end
    real_error_messages = page.driver.error_messages
    #real_error_messages = []
    #page.driver.error_messages.each_with_index do |e, i|
    # # first two messages appear to be bogus, always.
    # if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
    # # discard message
    # else
    # real_error_messages << e
    # end
    #end

    raise "Javascript errors: #{real_error_messages}" if real_error_messages.length > 0
    end
  3. @rosskevin rosskevin revised this gist Nov 21, 2013. 1 changed file with 26 additions and 0 deletions.
    26 changes: 26 additions & 0 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -25,6 +25,13 @@ def webkit?()
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
    #else
    # Capybara.register_driver :selenium do |app|
    # require 'selenium/webdriver'
    # profile = Selenium::WebDriver::Firefox::Profile.new
    # profile['focusmanager.testmode'] = 'true'
    # Capybara::Selenium::Driver.new(app, :profile => profile)
    # end
    end

    # Unnecessary on mac
    @@ -87,4 +94,23 @@ def has_tag(scenario, tag)
    @scenario = scenario
    # reset to wait time in case something in the scenario upped it as it was long running
    Capybara.default_wait_time = $wait_time
    end

    # webkit javascript check only
    AfterStep do
    if webkit?

    #puts "All Javascript errors: #{page.driver.error_messages}"
    real_error_messages = []
    page.driver.error_messages.each_with_index do |e, i|
    # first two messages appear to be bogus, always.
    if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
    # discard message
    else
    real_error_messages << e
    end
    end

    raise "Javascript errors: #{real_error_messages}" if real_error_messages.length > 0
    end
    end
  4. @rosskevin rosskevin revised this gist Nov 20, 2013. 1 changed file with 36 additions and 16 deletions.
    52 changes: 36 additions & 16 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -1,34 +1,49 @@
    # gem 'os'
    # gem 'headless'
    # gem 'capybara-webkit'
    # turn on webkit driver debug
    $webkit_debug = false
    $wait_time = 5
    $use_chrome_instead_of_firefox = true

    def set_webkit_driver()
    if $webkit_debug
    Capybara.javascript_driver = :webkit_debug
    else
    Capybara.javascript_driver = :webkit
    end
    end

    def webkit?()
    [:webkit, :webkit_debug].include? Capybara.javascript_driver
    end

    # Possible values are :truncation and :transaction
    # The :transaction strategy is faster, but might give you threading problems.
    # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
    Cucumber::Rails::Database.javascript_strategy = :truncation


    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    if $use_chrome_instead_of_firefox
    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
    end

    # Unnecessary on mac
    if (!OS.mac? && !$headless_started)

    require 'headless'
    # allow display autopick (by default)
    # allow each headless to destroy_at_exit (by default)
    # allow each process to have their own headless by setting reuse: false
    headless_server = Headless.new(:reuse => false)
    headless_server.start
    require 'headless'
    # allow display autopick (by default)
    # allow each headless to destroy_at_exit (by default)
    # allow each process to have their own headless by setting reuse: false
    headless_server = Headless.new(:reuse => false)
    headless_server.start

    $headless_started = true
    puts "Process[#{Process.pid}] started headless server display: #{headless_server.display}"
    $headless_started = true
    puts "Process[#{Process.pid}] started headless server display: #{headless_server.display}"
    end

    # Set capybara-webkit as the default driver for javascript, it is 3x faster than selenium in a simple test YMMV
    Capybara.javascript_driver = :webkit
    set_webkit_driver()


    #
    # If the @show tag is present on a non-mac environment, ignore it,
    @@ -65,6 +80,11 @@ def has_tag(scenario, tag)
    end).include? tag
    end

    # Increase wait time for ajax retries
    Capybara.default_wait_time = $wait_time

    Before do |scenario|
    @scenario = scenario
    # reset to wait time in case something in the scenario upped it as it was long running
    Capybara.default_wait_time = $wait_time
    end
  5. @rosskevin rosskevin revised this gist Nov 20, 2013. 1 changed file with 10 additions and 16 deletions.
    26 changes: 10 additions & 16 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -39,8 +39,16 @@

    # problem on @show with backgrounds: https://github.com/cucumber/cucumber/issues/52
    if should_show(scenario)
    Capybara.using_driver :selenium do
    block.call

    # for some reason, just using the `using_driver` doesn't get us all the way there, so set/reset the `javascript_driver` as necessary.
    original_driver = Capybara.javascript_driver
    begin
    Capybara.javascript_driver = :selenium
    Capybara.using_driver :selenium do
    block.call
    end
    ensure
    Capybara.javascript_driver = original_driver
    end
    else
    block.call
    @@ -59,18 +67,4 @@ def has_tag(scenario, tag)

    Before do |scenario|
    @scenario = scenario
    end


    # supports fill_in f ''
    def trigger_event_for(selector, event)
    raise "Please supply a selector" if selector.blank?
    raise "Please use the @javascript tag on: \n\tFeature: #{@scenario.feature.name}\n\tScenario: #{@scenario.name}\n" unless has_tag(@scenario, '@javascript')
    if Capybara.javascript_driver == :selenium
    page.execute_script %Q{ $('#{selector}').trigger("#{event}") }
    end

    if Capybara.javascript_driver == :webkit
    page.find(selector).trigger(event.to_sym)
    end
    end
  6. @rosskevin rosskevin revised this gist Aug 21, 2013. 1 changed file with 21 additions and 10 deletions.
    31 changes: 21 additions & 10 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -2,23 +2,29 @@
    # gem 'headless'
    # gem 'capybara-webkit'

    # Possible values are :truncation and :transaction
    # The :transaction strategy is faster, but might give you threading problems.
    # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
    Cucumber::Rails::Database.javascript_strategy = :truncation


    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end

    Before do
    # Unnecessary on mac
    if !OS.mac? && !$headless_started
    # Unnecessary on mac
    if (!OS.mac? && !$headless_started)

    require 'headless'
    @headless = Headless.new
    @headless.start
    $headless_started = true
    end
    end
    # allow display autopick (by default)
    # allow each headless to destroy_at_exit (by default)
    # allow each process to have their own headless by setting reuse: false
    headless_server = Headless.new(:reuse => false)
    headless_server.start

    at_exit do
    @headless.destroy unless @headless.nil?
    $headless_started = true
    puts "Process[#{Process.pid}] started headless server display: #{headless_server.display}"
    end

    # Set capybara-webkit as the default driver for javascript, it is 3x faster than selenium in a simple test YMMV
    @@ -51,10 +57,15 @@ def has_tag(scenario, tag)
    end).include? tag
    end

    Before do |scenario|
    @scenario = scenario
    end


    # supports fill_in f ''
    def trigger_event_for(selector, event)
    raise "Please supply a selector" if selector.blank?
    raise "Please use the @javascript tag on: \n\tFeature: #{@scenario.feature.name}\n\tScenario: #{@scenario.name}\n" unless has_tag(@scenario, '@javascript')
    if Capybara.javascript_driver == :selenium
    page.execute_script %Q{ $('#{selector}').trigger("#{event}") }
    end
  7. @rosskevin rosskevin revised this gist Jul 11, 2013. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -8,12 +8,12 @@
    end

    Before do
    # Unnecessary on mac
    if !OS.mac? && !$headless_started
    # set this flag right away, Headless can throw exceptions on OSX and we don't care.
    $headless_started = true
    require 'headless'
    @headless = Headless.new
    @headless.start
    $headless_started = true
    end
    end

  8. @rosskevin rosskevin revised this gist Jul 11, 2013. 1 changed file with 14 additions and 1 deletion.
    15 changes: 14 additions & 1 deletion features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -8,7 +8,7 @@
    end

    Before do
    if !$headless_started
    if !OS.mac? && !$headless_started
    # set this flag right away, Headless can throw exceptions on OSX and we don't care.
    $headless_started = true
    require 'headless'
    @@ -49,4 +49,17 @@ def has_tag(scenario, tag)
    (scenario.source_tags.map do |tag|
    tag.name
    end).include? tag
    end


    # supports fill_in f ''
    def trigger_event_for(selector, event)
    raise "Please supply a selector" if selector.blank?
    if Capybara.javascript_driver == :selenium
    page.execute_script %Q{ $('#{selector}').trigger("#{event}") }
    end

    if Capybara.javascript_driver == :webkit
    page.find(selector).trigger(event.to_sym)
    end
    end
  9. @rosskevin rosskevin revised this gist Jul 11, 2013. 1 changed file with 17 additions and 14 deletions.
    31 changes: 17 additions & 14 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -7,6 +7,20 @@
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end

    Before do
    if !$headless_started
    # set this flag right away, Headless can throw exceptions on OSX and we don't care.
    $headless_started = true
    require 'headless'
    @headless = Headless.new
    @headless.start
    end
    end

    at_exit do
    @headless.destroy unless @headless.nil?
    end

    # Set capybara-webkit as the default driver for javascript, it is 3x faster than selenium in a simple test YMMV
    Capybara.javascript_driver = :webkit

    @@ -16,22 +30,11 @@
    # :selenium driver (which is :chrome browser as configured above)
    #
    Around('@javascript') do |scenario, block|

    # problem on @show with backgrounds: https://github.com/cucumber/cucumber/issues/52
    if should_show(scenario)
    original_driver = Capybara.javascript_driver
    begin
    Capybara.javascript_driver = :selenium
    block.call
    ensure
    Capybara.javascript_driver = original_driver
    end
    elsif Capybara.current_driver == :selenium
    require 'headless'
    headless = Headless.new
    begin
    headless.start
    Capybara.using_driver :selenium do
    block.call
    ensure
    headless.destroy
    end
    else
    block.call
  10. @rosskevin rosskevin revised this gist Jul 5, 2013. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,7 @@
    # gem 'os'
    # gem 'headless'
    # gem 'capybara-webkit'

    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
  11. @rosskevin rosskevin revised this gist Jul 5, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@
    Capybara.javascript_driver = :webkit

    #
    # If the @show tag is present on a non-mac environment, ignore it use default,
    # If the @show tag is present on a non-mac environment, ignore it,
    # otherwise allow the combination of @javascript @show to trigger the
    # :selenium driver (which is :chrome browser as configured above)
    #
  12. @rosskevin rosskevin created this gist Jul 5, 2013.
    45 changes: 45 additions & 0 deletions features-support-javascript.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    # Register chrome browser for the :selenium driver, can be triggered below with the combination of @javascript @show
    Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end

    # Set capybara-webkit as the default driver for javascript, it is 3x faster than selenium in a simple test YMMV
    Capybara.javascript_driver = :webkit

    #
    # If the @show tag is present on a non-mac environment, ignore it use default,
    # otherwise allow the combination of @javascript @show to trigger the
    # :selenium driver (which is :chrome browser as configured above)
    #
    Around('@javascript') do |scenario, block|
    if should_show(scenario)
    original_driver = Capybara.javascript_driver
    begin
    Capybara.javascript_driver = :selenium
    block.call
    ensure
    Capybara.javascript_driver = original_driver
    end
    elsif Capybara.current_driver == :selenium
    require 'headless'
    headless = Headless.new
    begin
    headless.start
    block.call
    ensure
    headless.destroy
    end
    else
    block.call
    end
    end

    def should_show(scenario)
    OS.mac? && has_tag(scenario, '@show')
    end

    def has_tag(scenario, tag)
    (scenario.source_tags.map do |tag|
    tag.name
    end).include? tag
    end