Module: Spree::Admin::TestingSupport::CapybaraUtils

Defined in:
lib/spree/admin/testing_support/capybara_utils.rb

Instance Method Summary collapse

Instance Method Details

#accept_turbo_confirm(timeout: 5) { ... } ⇒ Object

Handles the custom turbo confirm dialog Replaces accept_confirm for elements using data-turbo-confirm

Examples:

accept_turbo_confirm { click_on 'Delete' }

Parameters:

  • timeout (Integer) (defaults to: 5)

    seconds to wait for the dialog

Yields:

  • the block containing the action that triggers the confirm dialog



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 66

def accept_turbo_confirm(timeout: 5, &block)
  yield

  # Wait for the confirm dialog to open
  dialog_selector = '#turbo-confirm-dialog'
  has_css?("#{dialog_selector}[open]", visible: :all, wait: timeout)

  # Click the confirm button
  within(dialog_selector) do
    click_button 'turbo-confirm-button'
  end
end

#click_icon(type) ⇒ Object



5
6
7
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 5

def click_icon(type)
  first(".ti-#{type}").click
end

#dismiss_turbo_confirm(timeout: 5) { ... } ⇒ Object

Dismisses the custom turbo confirm dialog by clicking cancel

Examples:

dismiss_turbo_confirm { click_on 'Delete' }

Parameters:

  • timeout (Integer) (defaults to: 5)

    seconds to wait for the dialog

Yields:

  • the block containing the action that triggers the confirm dialog



86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 86

def dismiss_turbo_confirm(timeout: 5, &block)
  yield

  # Wait for the confirm dialog to open
  dialog_selector = '#turbo-confirm-dialog'
  has_css?("#{dialog_selector}[open]", visible: :all, wait: timeout)

  # Click the cancel button
  within(dialog_selector) do
    click_button class: 'btn-light'
  end
end

#wait_for(options = {}, &block) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 31

def wait_for(options = {}, &block)
  default_options = { error: nil, seconds: 5 }.merge(options)

  Selenium::WebDriver::Wait.new(timeout: default_options[:seconds]).until(&block)
rescue Selenium::WebDriver::Error::TimeoutError
  default_options[:error].nil? ? false : raise(default_options[:error])
end

#wait_for_ajax(delay = Capybara.default_max_wait_time) ⇒ Object

delay in seconds



18
19
20
21
22
23
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 18

def wait_for_ajax(delay = Capybara.default_max_wait_time)
  Timeout.timeout(delay) do
    active = page.evaluate_script('typeof jQuery !== "undefined" && jQuery.active')
    active = page.evaluate_script('typeof jQuery !== "undefined" && jQuery.active') until active.nil? || active.zero?
  end
end

#wait_for_dialog(selector = '#main-dialog', timeout: 5) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 39

def wait_for_dialog(selector = '#main-dialog', timeout: 5)
  # Wait for turbo to finish loading the dialog content
  wait_for_turbo(timeout)

  # Wait for the dialog element to be present and open
  # Note: Using visible: :all because headless Chrome may not consider dialogs "visible"
  # even when properly opened via showModal()
  has_css?("#{selector}[open]", visible: :all, wait: timeout)

  # Verify the dialog is actually open and rendered
  unless page.evaluate_script("document.querySelector('#{selector}')?.open")
    raise "Dialog #{selector} is not open"
  end

  # Give Chrome time to fully render the dialog and make elements interactable
  # The old headless mode is better but still needs a brief render pause
  sleep 0.3
end

#wait_for_turbo(timeout = nil) ⇒ Object



25
26
27
28
29
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 25

def wait_for_turbo(timeout = nil)
  if has_css?('.turbo-progress-bar', visible: true, wait: 1.seconds)
    has_no_css?('.turbo-progress-bar', wait: timeout.presence || 5.seconds)
  end
end

#within_row(num, &block) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/spree/admin/testing_support/capybara_utils.rb', line 9

def within_row(num, &block)
  if RSpec.current_example.[:js]
    within("table.table tbody tr:nth-child(#{num})", match: :first, &block)
  else
    within(all('table.table tbody tr')[num - 1], &block)
  end
end