Class: HeadlessBrowserTool::Browser
- Inherits:
-
Object
- Object
- HeadlessBrowserTool::Browser
- Includes:
- Capybara::DSL
- Defined in:
- lib/headless_browser_tool/browser.rb
Instance Attribute Summary collapse
-
#previous_state ⇒ Object
Returns the value of attribute previous_state.
-
#session ⇒ Object
readonly
Returns the value of attribute session.
Instance Method Summary collapse
- #active? ⇒ Boolean
- #attach_file(file_field_selector, file_path) ⇒ Object
- #check(checkbox_selector) ⇒ Object
- #choose(radio_button_selector) ⇒ Object
-
#click(selector) ⇒ Object
Interaction tools.
- #click_button(button_text_or_selector) ⇒ Object
- #click_link(link_text_or_selector) ⇒ Object
- #close_window(window_handle) ⇒ Object
- #double_click(selector) ⇒ Object
- #drag(source_selector, target_selector) ⇒ Object
- #evaluate_script(javascript_code) ⇒ Object
-
#execute_script(javascript_code) ⇒ Object
JavaScript tools.
-
#fill_in(field, value) ⇒ Object
Form tools.
- #find_all(selector) ⇒ Object
-
#find_element(selector) ⇒ Object
Element tools.
- #get_attribute(selector, attribute_name) ⇒ Object
- #get_current_path ⇒ Object
-
#get_current_url ⇒ Object
Info tools.
- #get_page_source ⇒ Object
- #get_page_title ⇒ Object
- #get_text(selector) ⇒ Object
- #get_value(selector) ⇒ Object
- #get_window_handles ⇒ Object
- #get_window_size ⇒ Object
- #go_back ⇒ Object
- #go_forward ⇒ Object
- #has_element?(selector, wait_seconds = nil) ⇒ Boolean
- #has_text?(text, wait_seconds = nil) ⇒ Boolean
- #hover(selector) ⇒ Object
-
#initialize(headless: true) ⇒ Browser
constructor
A new instance of Browser.
- #is_visible?(selector) ⇒ Boolean
- #maximize_window ⇒ Object
- #open_new_window ⇒ Object
- #refresh ⇒ Object
- #resize_window(width, height) ⇒ Object
- #right_click(selector) ⇒ Object
- #save_page(file_path) ⇒ Object
-
#save_screenshot(file_path) ⇒ Object
Utility tools.
- #select(value, dropdown_selector) ⇒ Object
-
#switch_to_window(window_handle) ⇒ Object
Window tools.
- #uncheck(checkbox_selector) ⇒ Object
-
#visit(url) ⇒ Object
Navigation tools.
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) (headless) @session = .current_session @previous_state = {} end |
Instance Attribute Details
#previous_state ⇒ Object
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 |
#session ⇒ Object (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
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() @session.choose() { 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 () @session.() { message: "Clicked button: #{button_text_or_selector}" } end |
#click_link(link_text_or_selector) ⇒ Object
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_path ⇒ Object
187 188 189 |
# File 'lib/headless_browser_tool/browser.rb', line 187 def get_current_path @session.current_path end |
#get_current_url ⇒ Object
Info tools
183 184 185 |
# File 'lib/headless_browser_tool/browser.rb', line 183 def get_current_url @session.current_url end |
#get_page_source ⇒ Object
195 196 197 |
# File 'lib/headless_browser_tool/browser.rb', line 195 def get_page_source @session.html end |
#get_page_title ⇒ Object
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_handles ⇒ Object
287 288 289 |
# File 'lib/headless_browser_tool/browser.rb', line 287 def get_window_handles @session.windows.map(&:handle) end |
#get_window_size ⇒ Object
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_back ⇒ Object
37 38 39 40 |
# File 'lib/headless_browser_tool/browser.rb', line 37 def go_back @session.go_back { message: "Navigated back" } end |
#go_forward ⇒ Object
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
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
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
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 ::ElementNotFound false end |
#maximize_window ⇒ Object
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_window ⇒ Object
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 |
#refresh ⇒ Object
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 |