Class: HeadlessBrowserTool::Browser

Inherits:
Object
  • Object
show all
Includes:
Capybara::DSL
Defined in:
lib/headless_browser_tool/browser.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(headless: true) ⇒ Browser

Returns a new instance of Browser.



14
15
16
17
18
# File 'lib/headless_browser_tool/browser.rb', line 14

def initialize(headless: true)
  configure_capybara(headless)
  @session = Capybara.current_session
  @previous_state = {}
end

Instance Attribute Details

#previous_stateObject

Returns the value of attribute previous_state.



12
13
14
# File 'lib/headless_browser_tool/browser.rb', line 12

def previous_state
  @previous_state
end

#sessionObject (readonly)

Returns the value of attribute session.



11
12
13
# File 'lib/headless_browser_tool/browser.rb', line 11

def session
  @session
end

Instance Method Details

#active?Boolean

Returns:

  • (Boolean)


20
21
22
23
24
# File 'lib/headless_browser_tool/browser.rb', line 20

def active?
  !@session.driver.browser.nil?
rescue StandardError
  false
end

#attach_file(file_field_selector, file_path) ⇒ Object



167
168
169
170
# File 'lib/headless_browser_tool/browser.rb', line 167

def attach_file(file_field_selector, file_path)
  @session.attach_file(file_field_selector, file_path)
  { message: "Attached '#{file_path}' to '#{file_field_selector}'" }
end

#check(checkbox_selector) ⇒ Object



152
153
154
155
# File 'lib/headless_browser_tool/browser.rb', line 152

def check(checkbox_selector)
  @session.check(checkbox_selector)
  { message: "Checked '#{checkbox_selector}'" }
end

#choose(radio_button_selector) ⇒ Object



162
163
164
165
# File 'lib/headless_browser_tool/browser.rb', line 162

def choose(radio_button_selector)
  @session.choose(radio_button_selector)
  { message: "Chose '#{radio_button_selector}'" }
end

#click(selector) ⇒ Object

Interaction tools



48
49
50
51
52
# File 'lib/headless_browser_tool/browser.rb', line 48

def click(selector)
  element = @session.find(selector)
  element.click
  { message: "Clicked element: #{selector}" }
end

#click_button(button_text_or_selector) ⇒ Object



172
173
174
175
# File 'lib/headless_browser_tool/browser.rb', line 172

def click_button(button_text_or_selector)
  @session.click_button(button_text_or_selector)
  { message: "Clicked button: #{button_text_or_selector}" }
end


177
178
179
180
# File 'lib/headless_browser_tool/browser.rb', line 177

def click_link(link_text_or_selector)
  @session.click_link(link_text_or_selector)
  { message: "Clicked link: #{link_text_or_selector}" }
end

#close_window(window_handle) ⇒ Object



257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'lib/headless_browser_tool/browser.rb', line 257

def close_window(window_handle)
  initial_windows_count = @session.windows.length
  current_handle = @session.current_window.handle
  window = @session.windows.find { |w| w.handle == window_handle }

  if window.nil?
    return {
      status: "error",
      error: "Window not found",
      window_handle: window_handle
    }
  end

  # If closing the current window, switch to another first
  if window_handle == current_handle && @session.windows.length > 1
    other_window = @session.windows.find { |w| w.handle != window_handle }
    @session.switch_to_window(other_window) if other_window
  end

  window.close

  {
    status: "success",
    closed_window_handle: window_handle,
    remaining_windows: @session.windows.length,
    initial_windows_count: initial_windows_count,
    current_window_handle: @session.windows.any? ? @session.current_window.handle : nil
  }
end

#double_click(selector) ⇒ Object



60
61
62
63
64
# File 'lib/headless_browser_tool/browser.rb', line 60

def double_click(selector)
  element = @session.find(selector)
  element.double_click
  { message: "Double-clicked element: #{selector}" }
end

#drag(source_selector, target_selector) ⇒ Object



72
73
74
75
76
77
# File 'lib/headless_browser_tool/browser.rb', line 72

def drag(source_selector, target_selector)
  source = @session.find(source_selector)
  target = @session.find(target_selector)
  source.drag_to(target)
  { message: "Dragged from #{source_selector} to #{target_selector}" }
end

#evaluate_script(javascript_code) ⇒ Object



205
206
207
# File 'lib/headless_browser_tool/browser.rb', line 205

def evaluate_script(javascript_code)
  @session.evaluate_script(javascript_code)
end

#execute_script(javascript_code) ⇒ Object

JavaScript tools



200
201
202
203
# File 'lib/headless_browser_tool/browser.rb', line 200

def execute_script(javascript_code)
  @session.execute_script(javascript_code)
  { message: "Executed JavaScript" }
end

#fill_in(field, value) ⇒ Object

Form tools



142
143
144
145
# File 'lib/headless_browser_tool/browser.rb', line 142

def fill_in(field, value)
  @session.fill_in(field, with: value)
  { message: "Filled '#{field}' with '#{value}'" }
end

#find_all(selector) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/headless_browser_tool/browser.rb', line 90

def find_all(selector)
  elements = @session.all(selector)
  elements.map do |element|
    {
      tag_name: element.tag_name,
      text: element.text,
      visible: element.visible?,
      attributes: extract_attributes(element),
      value: element.value
    }
  end
end

#find_element(selector) ⇒ Object

Element tools



80
81
82
83
84
85
86
87
88
# File 'lib/headless_browser_tool/browser.rb', line 80

def find_element(selector)
  element = @session.find(selector)
  {
    tag_name: element.tag_name,
    text: element.text,
    visible: element.visible?,
    location: { x: element.native.location.x, y: element.native.location.y }
  }
end

#get_attribute(selector, attribute_name) ⇒ Object



108
109
110
111
# File 'lib/headless_browser_tool/browser.rb', line 108

def get_attribute(selector, attribute_name)
  element = @session.find(selector)
  element[attribute_name]
end

#get_current_pathObject



187
188
189
# File 'lib/headless_browser_tool/browser.rb', line 187

def get_current_path
  @session.current_path
end

#get_current_urlObject

Info tools



183
184
185
# File 'lib/headless_browser_tool/browser.rb', line 183

def get_current_url
  @session.current_url
end

#get_page_sourceObject



195
196
197
# File 'lib/headless_browser_tool/browser.rb', line 195

def get_page_source
  @session.html
end

#get_page_titleObject



191
192
193
# File 'lib/headless_browser_tool/browser.rb', line 191

def get_page_title
  @session.title
end

#get_text(selector) ⇒ Object



103
104
105
106
# File 'lib/headless_browser_tool/browser.rb', line 103

def get_text(selector)
  element = @session.find(selector)
  element.text
end

#get_value(selector) ⇒ Object



113
114
115
116
# File 'lib/headless_browser_tool/browser.rb', line 113

def get_value(selector)
  element = @session.find(selector)
  element.value
end

#get_window_handlesObject



287
288
289
# File 'lib/headless_browser_tool/browser.rb', line 287

def get_window_handles
  @session.windows.map(&:handle)
end

#get_window_sizeObject



329
330
331
332
333
334
# File 'lib/headless_browser_tool/browser.rb', line 329

def get_window_size
  size = @session.current_window.size
  { width: size[0], height: size[1] }
rescue StandardError
  { width: nil, height: nil }
end

#go_backObject



37
38
39
40
# File 'lib/headless_browser_tool/browser.rb', line 37

def go_back
  @session.go_back
  { message: "Navigated back" }
end

#go_forwardObject



42
43
44
45
# File 'lib/headless_browser_tool/browser.rb', line 42

def go_forward
  @session.go_forward
  { message: "Navigated forward" }
end

#has_element?(selector, wait_seconds = nil) ⇒ Boolean

Returns:

  • (Boolean)


125
126
127
128
129
130
131
# File 'lib/headless_browser_tool/browser.rb', line 125

def has_element?(selector, wait_seconds = nil)
  if wait_seconds
    @session.has_selector?(selector, wait: wait_seconds)
  else
    @session.has_selector?(selector)
  end
end

#has_text?(text, wait_seconds = nil) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
136
137
138
139
# File 'lib/headless_browser_tool/browser.rb', line 133

def has_text?(text, wait_seconds = nil)
  if wait_seconds
    @session.has_text?(text, wait: wait_seconds)
  else
    @session.has_text?(text)
  end
end

#hover(selector) ⇒ Object



66
67
68
69
70
# File 'lib/headless_browser_tool/browser.rb', line 66

def hover(selector)
  element = @session.find(selector)
  element.hover
  { message: "Hovered over element: #{selector}" }
end

#is_visible?(selector) ⇒ Boolean

Returns:

  • (Boolean)


118
119
120
121
122
123
# File 'lib/headless_browser_tool/browser.rb', line 118

def is_visible?(selector)
  element = @session.find(selector)
  element.visible?
rescue Capybara::ElementNotFound
  false
end

#maximize_windowObject



291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# File 'lib/headless_browser_tool/browser.rb', line 291

def maximize_window
  current_window = @session.current_window
  size_before = get_window_size

  current_window.maximize

  size_after = get_window_size

  {
    status: "success",
    window_handle: current_window.handle,
    size_before: size_before,
    size_after: size_after,
    current_url: @session.current_url,
    title: @session.title
  }
end

#open_new_windowObject



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/headless_browser_tool/browser.rb', line 237

def open_new_window
  initial_windows_count = @session.windows.length
  window = @session.open_new_window

  # Switch to the new window to get its info
  @session.switch_to_window(window)

  {
    status: "success",
    window_handle: window.handle,
    current_url: @session.current_url,
    title: @session.title,
    position: get_window_position,
    size: get_window_size,
    is_current: true,
    total_windows: @session.windows.length,
    previous_windows_count: initial_windows_count
  }
end

#refreshObject



32
33
34
35
# File 'lib/headless_browser_tool/browser.rb', line 32

def refresh
  @session.refresh
  { message: "Page refreshed" }
end

#resize_window(width, height) ⇒ Object



309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/headless_browser_tool/browser.rb', line 309

def resize_window(width, height)
  current_window = @session.current_window
  size_before = get_window_size

  current_window.resize_to(width, height)

  size_after = get_window_size

  {
    status: "success",
    window_handle: current_window.handle,
    size_before: size_before,
    size_after: size_after,
    requested_size: { width: width, height: height },
    actual_size: size_after,
    current_url: @session.current_url,
    title: @session.title
  }
end

#right_click(selector) ⇒ Object



54
55
56
57
58
# File 'lib/headless_browser_tool/browser.rb', line 54

def right_click(selector)
  element = @session.find(selector)
  element.right_click
  { message: "Right-clicked element: #{selector}" }
end

#save_page(file_path) ⇒ Object



215
216
217
218
# File 'lib/headless_browser_tool/browser.rb', line 215

def save_page(file_path)
  @session.save_page(file_path)
  { message: "Page saved to #{file_path}" }
end

#save_screenshot(file_path) ⇒ Object

Utility tools



210
211
212
213
# File 'lib/headless_browser_tool/browser.rb', line 210

def save_screenshot(file_path)
  @session.save_screenshot(file_path)
  { message: "Screenshot saved to #{file_path}" }
end

#select(value, dropdown_selector) ⇒ Object



147
148
149
150
# File 'lib/headless_browser_tool/browser.rb', line 147

def select(value, dropdown_selector)
  @session.select(value, from: dropdown_selector)
  { message: "Selected '#{value}' from '#{dropdown_selector}'" }
end

#switch_to_window(window_handle) ⇒ Object

Window tools



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/headless_browser_tool/browser.rb', line 221

def switch_to_window(window_handle)
  @session.switch_to_window(window_handle)
  current_window = @session.current_window

  {
    status: "success",
    window_handle: current_window.handle,
    current_url: @session.current_url,
    title: @session.title,
    position: get_window_position,
    size: get_window_size,
    is_current: true,
    total_windows: @session.windows.length
  }
end

#uncheck(checkbox_selector) ⇒ Object



157
158
159
160
# File 'lib/headless_browser_tool/browser.rb', line 157

def uncheck(checkbox_selector)
  @session.uncheck(checkbox_selector)
  { message: "Unchecked '#{checkbox_selector}'" }
end

#visit(url) ⇒ Object

Navigation tools



27
28
29
30
# File 'lib/headless_browser_tool/browser.rb', line 27

def visit(url)
  @session.visit(url)
  { message: "Navigated to #{url}" }
end