module CapybaraClickAt

Constants

VERSION

Public Instance Methods

click_at(x, y, options = {}) click to toggle source
# File lib/capybara_click_at.rb, line 4
def click_at(x, y, options = {})
  capybara_version = Gem.loaded_specs["capybara"].version

  if capybara_version < Gem::Version.new("3.0.0")
    page.execute_script "
      (function click(x, y, options) {
        var findElement = (function() {
          if(options.css) {
            return document.querySelector(options.css);
          } else if(options.xPath) {
            return document.evaluate(
              options.xPath, document, null,
              XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
          } else {
            return document.querySelector('html');;
          }
        }),
        element = findElement(),
        rect = element.getBoundingClientRect(),
        event = document.createEvent('MouseEvent');

        event.initMouseEvent(
          'click',
          true /* bubble */, true /* cancelable */,
          window, element,
          0, 0, rect.left + x, rect.top + y, /* coordinates */
          false, false, false, false, /* modifier keys */
          0 /*left*/, null
        );

        element.dispatchEvent(event);
      })(#{ x }, #{ y }, { css: '#{options[:css]}', xPath: '#{options[:xpath]}' });"
  else
    container = if options[:css]
      find(:css, options[:css])
    elsif options[:xpath]
      find(:xpath, options[:xpath])
    else
      find('html')
    end

    container.click(:x => x, :y => y)
  end
end