Class: Ferrum::Mouse

Inherits:
Object
  • Object
show all
Defined in:
lib/ferrum/mouse.rb

Constant Summary collapse

CLICK_WAIT =
ENV.fetch("FERRUM_CLICK_WAIT", 0.1).to_f
VALID_BUTTONS =
%w[none left middle right back forward].freeze

Instance Method Summary collapse

Constructor Details

#initialize(page) ⇒ Mouse

Returns a new instance of Mouse.



8
9
10
11
# File 'lib/ferrum/mouse.rb', line 8

def initialize(page)
  @page = page
  @x = @y = 0
end

Instance Method Details

#click(x:, y:, delay: 0, wait: CLICK_WAIT, **options) ⇒ self

Click given coordinates, fires mouse move, down and up events.

Parameters:

  • x (Integer)
  • y (Integer)
  • delay (Float) (defaults to: 0)

    Delay between mouse down and mouse up events.

  • wait (Float) (defaults to: CLICK_WAIT)
  • options (Hash{Symbol => Object})

    Additional keyword arguments.

Options Hash (**options):

  • :button (:left, :right) — default: :left

    The mouse button to click.

  • :count (Integer) — default: 1
  • :modifiers (Integer)

    Bitfield for key modifiers. See`keyboard.modifiers`.

Returns:

  • (self)


57
58
59
60
61
62
63
64
65
# File 'lib/ferrum/mouse.rb', line 57

def click(x:, y:, delay: 0, wait: CLICK_WAIT, **options)
  move(x: x, y: y)
  down(**options)
  sleep(delay)
  # Potential wait because if some network event is triggered then we have
  # to wait until it's over and frame is loaded or failed to load.
  up(wait: wait, **options)
  self
end

#down(**options) ⇒ self

Mouse down for given coordinates.

Parameters:

  • options (Hash{Symbol => Object})

    Additional keyword arguments.

Options Hash (**options):

  • :button (:left, :right) — default: :left

    The mouse button to click.

  • :count (Integer) — default: 1
  • :modifiers (Integer)

    Bitfield for key modifiers. See`keyboard.modifiers`.

Returns:

  • (self)


83
84
85
# File 'lib/ferrum/mouse.rb', line 83

def down(**options)
  tap { mouse_event(type: "mousePressed", **options) }
end

#move(x:, y:, steps: 1) ⇒ self

Mouse move to given x and y.

Parameters:

  • x (Integer)
  • y (Integer)
  • steps (Integer) (defaults to: 1)

    Sends intermediate mousemove events.

Returns:

  • (self)


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/ferrum/mouse.rb', line 119

def move(x:, y:, steps: 1)
  from_x = @x
  from_y = @y
  @x = x
  @y = y

  steps.times do |i|
    new_x = from_x + ((@x - from_x) * ((i + 1) / steps.to_f))
    new_y = from_y + ((@y - from_y) * ((i + 1) / steps.to_f))

    @page.command("Input.dispatchMouseEvent",
                  slowmoable: true,
                  type: "mouseMoved",
                  x: new_x.to_i,
                  y: new_y.to_i)
  end

  self
end

#scroll_to(top, left) ⇒ Object

Scroll page to a given x, y coordinates.

Examples:

browser.go_to("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
browser.mouse.scroll_to(0, 400)

Parameters:

  • top (Integer)

    The pixel along the horizontal axis of the document that you want displayed in the upper left.

  • left (Integer)

    The pixel along the vertical axis of the document that you want displayed in the upper left.



28
29
30
# File 'lib/ferrum/mouse.rb', line 28

def scroll_to(top, left)
  tap { @page.execute("window.scrollTo(#{top}, #{left})") }
end

#up(**options) ⇒ self

Mouse up for given coordinates.

Parameters:

  • options (Hash{Symbol => Object})

    Additional keyword arguments.

Options Hash (**options):

  • :button (:left, :right) — default: :left

    The mouse button to click.

  • :count (Integer) — default: 1
  • :modifiers (Integer)

    Bitfield for key modifiers. See`keyboard.modifiers`.

Returns:

  • (self)


103
104
105
# File 'lib/ferrum/mouse.rb', line 103

def up(**options)
  tap { mouse_event(type: "mouseReleased", **options) }
end