File: file_input_click_emulation.rb

package info (click to toggle)
ruby-capybara 3.40.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,368 kB
  • sloc: ruby: 23,988; javascript: 752; makefile: 11
file content (34 lines) | stat: -rw-r--r-- 791 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# frozen_string_literal: true

class Capybara::Selenium::Node
  module FileInputClickEmulation
    def click(keys = [], **options)
      super
    rescue Selenium::WebDriver::Error::InvalidArgumentError
      return emulate_click if attaching_file? && visible_file_field?

      raise
    end

  private

    def visible_file_field?
      (attrs(:tagName, :type).map { |val| val&.downcase } == %w[input file]) && visible?
    end

    def attaching_file?
      caller_locations.any? { |cl| cl.base_label == 'attach_file' }
    end

    def emulate_click
      driver.execute_script(<<~JS, self)
        arguments[0].dispatchEvent(
          new MouseEvent('click', {
            view: window,
            bubbles: true,
            cancelable: true
          }));
      JS
    end
  end
end