Class: Selenium::WebDriver::Remote::Bridge Private

Inherits:
Object
  • Object
show all
Includes:
Atoms
Defined in:
lib/selenium/webdriver/remote/bridge/commands.rb,
lib/selenium/webdriver/remote/bridge.rb,
lib/selenium/webdriver/remote/bridge/locator_converter.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

https://w3c.github.io/webdriver/#endpoints

Direct Known Subclasses

BiDiBridge

Defined Under Namespace

Classes: LocatorConverter

Constant Summary collapse

PORT =
4444
QUIT_ERRORS =
[IOError, EOFError, WebSocket::Error].freeze
COMMANDS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

{
  status: [:get, 'status'],

  #
  # session handling
  #

  new_session: [:post, 'session'],
  delete_session: [:delete, 'session/:session_id'],

  #
  # basic driver
  #

  get: [:post, 'session/:session_id/url'],
  get_current_url: [:get, 'session/:session_id/url'],
  back: [:post, 'session/:session_id/back'],
  forward: [:post, 'session/:session_id/forward'],
  refresh: [:post, 'session/:session_id/refresh'],
  get_title: [:get, 'session/:session_id/title'],

  #
  # window and Frame handling
  #

  get_window_handle: [:get, 'session/:session_id/window'],
  new_window: [:post, 'session/:session_id/window/new'],
  close_window: [:delete, 'session/:session_id/window'],
  switch_to_window: [:post, 'session/:session_id/window'],
  get_window_handles: [:get, 'session/:session_id/window/handles'],
  fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
  minimize_window: [:post, 'session/:session_id/window/minimize'],
  maximize_window: [:post, 'session/:session_id/window/maximize'],
  set_window_rect: [:post, 'session/:session_id/window/rect'],
  get_window_rect: [:get, 'session/:session_id/window/rect'],
  switch_to_frame: [:post, 'session/:session_id/frame'],
  switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],

  #
  # element
  #

  find_element: [:post, 'session/:session_id/element'],
  find_elements: [:post, 'session/:session_id/elements'],
  find_child_element: [:post, 'session/:session_id/element/:id/element'],
  find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
  find_shadow_child_element: [:post, 'session/:session_id/shadow/:id/element'],
  find_shadow_child_elements: [:post, 'session/:session_id/shadow/:id/elements'],
  get_active_element: [:get, 'session/:session_id/element/active'],
  get_element_shadow_root: [:get, 'session/:session_id/element/:id/shadow'],
  is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
  get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
  get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
  get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
  get_element_aria_role: [:get, 'session/:session_id/element/:id/computedrole'],
  get_element_aria_label: [:get, 'session/:session_id/element/:id/computedlabel'],
  get_element_text: [:get, 'session/:session_id/element/:id/text'],
  get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
  get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
  is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],

  #
  # document handling
  #

  get_page_source: [:get, 'session/:session_id/source'],
  execute_script: [:post, 'session/:session_id/execute/sync'],
  execute_async_script: [:post, 'session/:session_id/execute/async'],

  #
  # cookies
  #

  get_all_cookies: [:get, 'session/:session_id/cookie'],
  get_cookie: [:get, 'session/:session_id/cookie/:name'],
  add_cookie: [:post, 'session/:session_id/cookie'],
  delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
  delete_all_cookies: [:delete, 'session/:session_id/cookie'],

  #
  # timeouts
  #

  get_timeouts: [:get, 'session/:session_id/timeouts'],
  set_timeout: [:post, 'session/:session_id/timeouts'],

  #
  # actions
  #

  actions: [:post, 'session/:session_id/actions'],
  release_actions: [:delete, 'session/:session_id/actions'],
  print_page: [:post, 'session/:session_id/print'],

  #
  # Element Operations
  #

  element_click: [:post, 'session/:session_id/element/:id/click'],
  element_clear: [:post, 'session/:session_id/element/:id/clear'],
  element_send_keys: [:post, 'session/:session_id/element/:id/value'],

  #
  # alerts
  #

  dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
  accept_alert: [:post, 'session/:session_id/alert/accept'],
  get_alert_text: [:get, 'session/:session_id/alert/text'],
  send_alert_text: [:post, 'session/:session_id/alert/text'],

  #
  # screenshot
  #

  take_screenshot: [:get, 'session/:session_id/screenshot'],
  take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],

  #
  # virtual-authenticator
  #

  add_virtual_authenticator: [:post, 'session/:session_id/webauthn/authenticator'],
  remove_virtual_authenticator: [:delete, 'session/:session_id/webauthn/authenticator/:authenticatorId'],
  add_credential: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/credential'],
  get_credentials: [:get, 'session/:session_id/webauthn/authenticator/:authenticatorId/credentials'],
  remove_credential: [:delete,
                      'session/:session_id/webauthn/authenticator/:authenticatorId/credentials/:credentialId'],
  remove_all_credentials: [:delete, 'session/:session_id/webauthn/authenticator/:authenticatorId/credentials'],
  set_user_verified: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/uv'],

  #
  # federated-credential management
  #

  get_fedcm_title: [:get, 'session/:session_id/fedcm/gettitle'],
  get_fedcm_dialog_type: [:get, 'session/:session_id/fedcm/getdialogtype'],
  get_fedcm_account_list: [:get, 'session/:session_id/fedcm/accountlist'],
  click_fedcm_dialog_button: [:post, 'session/:session_id/fedcm/clickdialogbutton'],
  cancel_fedcm_dialog: [:post, 'session/:session_id/fedcm/canceldialog'],
  select_fedcm_account: [:post, 'session/:session_id/fedcm/selectaccount'],
  set_fedcm_delay: [:post, 'session/:session_id/fedcm/setdelayenabled'],
  reset_fedcm_cooldown: [:post, 'session/:session_id/fedcm/resetcooldown']
}.freeze

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Atoms

#atom_script

Constructor Details

#initialize(http_client:) ⇒ Bridge

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Bridge.

Parameters:

  • http_client (Object)

    a configured HTTP client implementing the same protocol as Http::Default



58
59
60
61
62
# File 'lib/selenium/webdriver/remote/bridge.rb', line 58

def initialize(http_client:)
  @http = http_client
  @file_detector = nil
  @locator_converter = self.class.locator_converter
end

Class Attribute Details

.element_classObject



48
49
50
# File 'lib/selenium/webdriver/remote/bridge.rb', line 48

def element_class
  @element_class ||= Element
end

.extra_commandsObject (readonly)

Returns the value of attribute extra_commands.



35
36
37
# File 'lib/selenium/webdriver/remote/bridge.rb', line 35

def extra_commands
  @extra_commands
end

.locator_converterObject



44
45
46
# File 'lib/selenium/webdriver/remote/bridge.rb', line 44

def locator_converter
  @locator_converter ||= LocatorConverter.new
end

Instance Attribute Details

#capabilitiesObject (readonly)

Returns the value of attribute capabilities.



32
33
34
# File 'lib/selenium/webdriver/remote/bridge.rb', line 32

def capabilities
  @capabilities
end

#file_detectorObject

Returns the value of attribute file_detector.



31
32
33
# File 'lib/selenium/webdriver/remote/bridge.rb', line 31

def file_detector
  @file_detector
end

#httpObject

Returns the value of attribute http.



31
32
33
# File 'lib/selenium/webdriver/remote/bridge.rb', line 31

def http
  @http
end

Class Method Details

.add_command(name, verb, url, &block) ⇒ Object



38
39
40
41
42
# File 'lib/selenium/webdriver/remote/bridge.rb', line 38

def add_command(name, verb, url, &block)
  @extra_commands ||= {}
  @extra_commands[name] = [verb, url]
  define_method(name, &block)
end

Instance Method Details

#accept_alertObject

alerts



131
132
133
# File 'lib/selenium/webdriver/remote/bridge.rb', line 131

def accept_alert
  execute :accept_alert
end

#action(async: false, devices: [], duration: 250) ⇒ Object Also known as: actions

actions



348
349
350
# File 'lib/selenium/webdriver/remote/bridge.rb', line 348

def action(async: false, devices: [], duration: 250)
  ActionBuilder.new self, async: async, devices: devices, duration: duration
end

#active_elementObject Also known as: switch_to_active_element

finding elements



476
477
478
# File 'lib/selenium/webdriver/remote/bridge.rb', line 476

def active_element
  Bridge.element_class.new self, element_id_from(execute(:get_active_element))
end


322
323
324
# File 'lib/selenium/webdriver/remote/bridge.rb', line 322

def add_cookie(cookie)
  execute :add_cookie, {}, {cookie: cookie}
end

#add_credential(credential, id) ⇒ Object



536
537
538
# File 'lib/selenium/webdriver/remote/bridge.rb', line 536

def add_credential(credential, id)
  execute :add_credential, {authenticatorId: id}, credential
end

#add_virtual_authenticator(options) ⇒ Object

virtual-authenticator



527
528
529
530
# File 'lib/selenium/webdriver/remote/bridge.rb', line 527

def add_virtual_authenticator(options)
  authenticator_id = execute :add_virtual_authenticator, {}, options.as_json
  VirtualAuthenticator.new(self, authenticator_id, options)
end

#alert=(keys) ⇒ Object



139
140
141
# File 'lib/selenium/webdriver/remote/bridge.rb', line 139

def alert=(keys)
  execute :send_alert_text, {}, {value: keys.chars, text: keys}
end

#alert_textObject



143
144
145
# File 'lib/selenium/webdriver/remote/bridge.rb', line 143

def alert_text
  execute :get_alert_text
end

#bidiObject



596
597
598
599
# File 'lib/selenium/webdriver/remote/bridge.rb', line 596

def bidi
  msg = 'BiDi must be enabled by setting #web_socket_url to true in options class'
  raise(WebDriver::Error::WebDriverError, msg)
end

#browserObject



100
101
102
103
104
105
# File 'lib/selenium/webdriver/remote/bridge.rb', line 100

def browser
  @browser ||= begin
    name = @capabilities.browser_name
    name ? name.tr(' -', '_').downcase.to_sym : 'unknown'
  end
end

#cancel_fedcm_dialogObject

federated-credential management



560
561
562
# File 'lib/selenium/webdriver/remote/bridge.rb', line 560

def cancel_fedcm_dialog
  execute :cancel_fedcm_dialog
end

#clear_element(element) ⇒ Object



375
376
377
# File 'lib/selenium/webdriver/remote/bridge.rb', line 375

def clear_element(element)
  execute :element_clear, id: element
end

#click_element(element) ⇒ Object



365
366
367
# File 'lib/selenium/webdriver/remote/bridge.rb', line 365

def click_element(element)
  execute :element_click, id: element
end

#click_fedcm_dialog_buttonObject



592
593
594
# File 'lib/selenium/webdriver/remote/bridge.rb', line 592

def click_fedcm_dialog_button
  execute :click_fedcm_dialog_button, {}, {dialogButton: 'ConfirmIdpLoginContinue'}
end

#closeObject



219
220
221
# File 'lib/selenium/webdriver/remote/bridge.rb', line 219

def close
  execute :close_window
end

#command_listObject



606
607
608
# File 'lib/selenium/webdriver/remote/bridge.rb', line 606

def command_list
  COMMANDS
end


332
333
334
# File 'lib/selenium/webdriver/remote/bridge.rb', line 332

def cookie(name)
  execute :get_cookie, name: name
end

#cookiesObject



336
337
338
# File 'lib/selenium/webdriver/remote/bridge.rb', line 336

def cookies
  execute :get_all_cookies
end

#create_session(capabilities) ⇒ Object

Creates session.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/selenium/webdriver/remote/bridge.rb', line 68

def create_session(capabilities)
  response = execute(:new_session, {}, prepare_capabilities_payload(capabilities))

  @session_id = response['sessionId']
  capabilities = response['capabilities']

  raise Error::WebDriverError, 'no sessionId in returned payload' unless @session_id

  @capabilities = Capabilities.json_create(capabilities)

  case @capabilities[:browser_name]
  when 'chrome', 'chrome-headless-shell'
    extend(WebDriver::Chrome::Features)
  when 'firefox'
    extend(WebDriver::Firefox::Features)
  when 'msedge', 'MicrosoftEdge'
    extend(WebDriver::Edge::Features)
  when 'Safari', 'Safari Technology Preview'
    extend(WebDriver::Safari::Features)
  when 'internet explorer'
    extend(WebDriver::IE::Features)
  end
end

#credentials(authenticator_id) ⇒ Object



540
541
542
# File 'lib/selenium/webdriver/remote/bridge.rb', line 540

def credentials(authenticator_id)
  execute :get_credentials, {authenticatorId: authenticator_id}
end

#delete_all_cookiesObject



340
341
342
# File 'lib/selenium/webdriver/remote/bridge.rb', line 340

def delete_all_cookies
  execute :delete_all_cookies
end

Raises:

  • (ArgumentError)


326
327
328
329
330
# File 'lib/selenium/webdriver/remote/bridge.rb', line 326

def delete_cookie(name)
  raise ArgumentError, 'Cookie name cannot be null or empty' if name.nil? || name.to_s.strip.empty?

  execute :delete_cookie, name: name
end

#dismiss_alertObject



135
136
137
# File 'lib/selenium/webdriver/remote/bridge.rb', line 135

def dismiss_alert
  execute :dismiss_alert
end

#element_aria_label(element) ⇒ Object



420
421
422
# File 'lib/selenium/webdriver/remote/bridge.rb', line 420

def element_aria_label(element)
  execute :get_element_aria_label, id: element
end

#element_aria_role(element) ⇒ Object



416
417
418
# File 'lib/selenium/webdriver/remote/bridge.rb', line 416

def element_aria_role(element)
  execute :get_element_aria_role, id: element
end

#element_attribute(element, name) ⇒ Object



403
404
405
406
# File 'lib/selenium/webdriver/remote/bridge.rb', line 403

def element_attribute(element, name)
  WebDriver.logger.debug "Using script for :getAttribute of #{name}", id: :script
  execute_atom :getAttribute, element, name
end

#element_displayed?(element) ⇒ Boolean

Returns:

  • (Boolean)


463
464
465
466
# File 'lib/selenium/webdriver/remote/bridge.rb', line 463

def element_displayed?(element)
  WebDriver.logger.debug 'Using script for :isDisplayed', id: :script
  execute_atom :isDisplayed, element
end

#element_dom_attribute(element, name) ⇒ Object



408
409
410
# File 'lib/selenium/webdriver/remote/bridge.rb', line 408

def element_dom_attribute(element, name)
  execute :get_element_attribute, id: element, name: name
end

#element_enabled?(element) ⇒ Boolean

Returns:

  • (Boolean)


455
456
457
# File 'lib/selenium/webdriver/remote/bridge.rb', line 455

def element_enabled?(element)
  execute :is_element_enabled, id: element
end

#element_location(element) ⇒ Object



432
433
434
435
436
# File 'lib/selenium/webdriver/remote/bridge.rb', line 432

def element_location(element)
  data = execute :get_element_rect, id: element

  Point.new data['x'], data['y']
end

#element_location_once_scrolled_into_view(element) ⇒ Object



444
445
446
447
# File 'lib/selenium/webdriver/remote/bridge.rb', line 444

def element_location_once_scrolled_into_view(element)
  send_keys_to_element(element, [''])
  element_location(element)
end

#element_property(element, name) ⇒ Object



412
413
414
# File 'lib/selenium/webdriver/remote/bridge.rb', line 412

def element_property(element, name)
  execute :get_element_property, id: element, name: name
end

#element_rect(element) ⇒ Object



438
439
440
441
442
# File 'lib/selenium/webdriver/remote/bridge.rb', line 438

def element_rect(element)
  data = execute :get_element_rect, id: element

  Rectangle.new data['x'], data['y'], data['width'], data['height']
end

#element_screenshot(element) ⇒ Object



296
297
298
# File 'lib/selenium/webdriver/remote/bridge.rb', line 296

def element_screenshot(element)
  execute :take_element_screenshot, id: element
end

#element_selected?(element) ⇒ Boolean

Returns:

  • (Boolean)


459
460
461
# File 'lib/selenium/webdriver/remote/bridge.rb', line 459

def element_selected?(element)
  execute :is_element_selected, id: element
end

#element_size(element) ⇒ Object



449
450
451
452
453
# File 'lib/selenium/webdriver/remote/bridge.rb', line 449

def element_size(element)
  data = execute :get_element_rect, id: element

  Dimension.new data['width'], data['height']
end

#element_tag_name(element) ⇒ Object

element properties



399
400
401
# File 'lib/selenium/webdriver/remote/bridge.rb', line 399

def element_tag_name(element)
  execute :get_element_tag_name, id: element
end

#element_text(element) ⇒ Object



428
429
430
# File 'lib/selenium/webdriver/remote/bridge.rb', line 428

def element_text(element)
  execute :get_element_text, id: element
end

#element_value(element) ⇒ Object



424
425
426
# File 'lib/selenium/webdriver/remote/bridge.rb', line 424

def element_value(element)
  element_property element, 'value'
end

#element_value_of_css_property(element, prop) ⇒ Object



468
469
470
# File 'lib/selenium/webdriver/remote/bridge.rb', line 468

def element_value_of_css_property(element, prop)
  execute :get_element_css_value, id: element, property_name: prop
end

#execute_async_script(script, *args) ⇒ Object



309
310
311
312
# File 'lib/selenium/webdriver/remote/bridge.rb', line 309

def execute_async_script(script, *args)
  result = execute :execute_async_script, {}, {script: script, args: args}
  unwrap_script_result result
end

#execute_script(script, *args) ⇒ Object

javascript execution



304
305
306
307
# File 'lib/selenium/webdriver/remote/bridge.rb', line 304

def execute_script(script, *args)
  result = execute :execute_script, {}, {script: script, args: args}
  unwrap_script_result result
end

#fedcm_account_listObject



580
581
582
# File 'lib/selenium/webdriver/remote/bridge.rb', line 580

def 
  execute :get_fedcm_account_list
end

#fedcm_delay(enabled) ⇒ Object



584
585
586
# File 'lib/selenium/webdriver/remote/bridge.rb', line 584

def fedcm_delay(enabled)
  execute :set_fedcm_delay, {}, {enabled: enabled}
end

#fedcm_dialog_typeObject



568
569
570
# File 'lib/selenium/webdriver/remote/bridge.rb', line 568

def fedcm_dialog_type
  execute :get_fedcm_dialog_type
end

#fedcm_subtitleObject



576
577
578
# File 'lib/selenium/webdriver/remote/bridge.rb', line 576

def fedcm_subtitle
  execute(:get_fedcm_title).fetch('subtitle', nil)
end

#fedcm_titleObject



572
573
574
# File 'lib/selenium/webdriver/remote/bridge.rb', line 572

def fedcm_title
  execute(:get_fedcm_title).fetch('title')
end

#find_element_by(how, what, parent_ref = []) ⇒ Object



482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
# File 'lib/selenium/webdriver/remote/bridge.rb', line 482

def find_element_by(how, what, parent_ref = [])
  how, what = @locator_converter.convert(how, what)

  return execute_atom(:findElements, Support::RelativeLocator.new(what).as_json).first if how == 'relative'

  parent_type, parent_id = parent_ref
  id = case parent_type
       when :element
         execute :find_child_element, {id: parent_id}, {using: how, value: what.to_s}
       when :shadow_root
         execute :find_shadow_child_element, {id: parent_id}, {using: how, value: what.to_s}
       else
         execute :find_element, {}, {using: how, value: what.to_s}
       end

  Bridge.element_class.new self, element_id_from(id)
end

#find_elements_by(how, what, parent_ref = []) ⇒ Object



500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
# File 'lib/selenium/webdriver/remote/bridge.rb', line 500

def find_elements_by(how, what, parent_ref = [])
  how, what = @locator_converter.convert(how, what)

  return execute_atom :findElements, Support::RelativeLocator.new(what).as_json if how == 'relative'

  parent_type, parent_id = parent_ref
  ids = case parent_type
        when :element
          execute :find_child_elements, {id: parent_id}, {using: how, value: what.to_s}
        when :shadow_root
          execute :find_shadow_child_elements, {id: parent_id}, {using: how, value: what.to_s}
        else
          execute :find_elements, {}, {using: how, value: what.to_s}
        end

  ids.map { |id| Bridge.element_class.new self, element_id_from(id) }
end

#full_screen_windowObject



268
269
270
# File 'lib/selenium/webdriver/remote/bridge.rb', line 268

def full_screen_window
  execute :fullscreen_window
end

#get(url) ⇒ Object



111
112
113
# File 'lib/selenium/webdriver/remote/bridge.rb', line 111

def get(url)
  execute :get, {}, {url: url}
end

#go_backObject

navigation



151
152
153
# File 'lib/selenium/webdriver/remote/bridge.rb', line 151

def go_back
  execute :back
end

#go_forwardObject



155
156
157
# File 'lib/selenium/webdriver/remote/bridge.rb', line 155

def go_forward
  execute :forward
end

#manageObject

cookies



318
319
320
# File 'lib/selenium/webdriver/remote/bridge.rb', line 318

def manage
  @manage ||= WebDriver::Manager.new(self)
end

#maximize_window(handle = :current) ⇒ Object



259
260
261
262
263
264
265
266
# File 'lib/selenium/webdriver/remote/bridge.rb', line 259

def maximize_window(handle = :current)
  unless handle == :current
    raise Error::UnsupportedOperationError,
          'Switch to desired window before changing its size'
  end

  execute :maximize_window
end

#minimize_windowObject



255
256
257
# File 'lib/selenium/webdriver/remote/bridge.rb', line 255

def minimize_window
  execute :minimize_window
end

#new_window(type) ⇒ Hash

Create a new top-level browsing context https://w3c.github.io/webdriver/#new-window

Parameters:

  • type (String)

    Supports two values: 'tab' and 'window'. Use 'tab' if you'd like the new window to share an OS-level window with the current browsing context. Use 'window' otherwise

Returns:

  • (Hash)

    Containing 'handle' with the value of the window handle and 'type' with the value of the created window type



181
182
183
# File 'lib/selenium/webdriver/remote/bridge.rb', line 181

def new_window(type)
  execute :new_window, {}, {type: type}
end

#page_sourceObject



167
168
169
# File 'lib/selenium/webdriver/remote/bridge.rb', line 167

def page_source
  execute :get_page_source
end


361
362
363
# File 'lib/selenium/webdriver/remote/bridge.rb', line 361

def print_page(options = {})
  execute :print_page, {}, {options: options}
end

#quitObject



204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/selenium/webdriver/remote/bridge.rb', line 204

def quit
  begin
    execute :delete_session
  rescue *QUIT_ERRORS => e
    WebDriver.logger.debug "delete_session failed during quit: #{e.class}: #{e.message}", id: :quit
  ensure
    begin
      http.close
    rescue *QUIT_ERRORS => e
      WebDriver.logger.debug "http.close failed during quit: #{e.class}: #{e.message}", id: :quit
    end
  end
  nil
end

#refreshObject



223
224
225
# File 'lib/selenium/webdriver/remote/bridge.rb', line 223

def refresh
  execute :refresh
end

#release_actionsObject



357
358
359
# File 'lib/selenium/webdriver/remote/bridge.rb', line 357

def release_actions
  execute :release_actions
end

#remove_all_credentials(authenticator_id) ⇒ Object



548
549
550
# File 'lib/selenium/webdriver/remote/bridge.rb', line 548

def remove_all_credentials(authenticator_id)
  execute :remove_all_credentials, {authenticatorId: authenticator_id}
end

#remove_credential(credential_id, authenticator_id) ⇒ Object



544
545
546
# File 'lib/selenium/webdriver/remote/bridge.rb', line 544

def remove_credential(credential_id, authenticator_id)
  execute :remove_credential, {credentialId: credential_id, authenticatorId: authenticator_id}
end

#remove_virtual_authenticator(id) ⇒ Object



532
533
534
# File 'lib/selenium/webdriver/remote/bridge.rb', line 532

def remove_virtual_authenticator(id)
  execute :remove_virtual_authenticator, {authenticatorId: id}
end

#reposition_window(x, y) ⇒ Object



272
273
274
# File 'lib/selenium/webdriver/remote/bridge.rb', line 272

def reposition_window(x, y)
  set_window_rect(x: x, y: y)
end

#reset_fedcm_cooldownObject



588
589
590
# File 'lib/selenium/webdriver/remote/bridge.rb', line 588

def reset_fedcm_cooldown
  execute :reset_fedcm_cooldown
end

#resize_window(width, height, handle = :current) ⇒ Object



239
240
241
242
243
# File 'lib/selenium/webdriver/remote/bridge.rb', line 239

def resize_window(width, height, handle = :current)
  raise Error::WebDriverError, 'Switch to desired window before changing its size' unless handle == :current

  set_window_rect(width: width, height: height)
end

#screenshotObject



292
293
294
# File 'lib/selenium/webdriver/remote/bridge.rb', line 292

def screenshot
  execute :take_screenshot
end

#select_fedcm_account(index) ⇒ Object



564
565
566
# File 'lib/selenium/webdriver/remote/bridge.rb', line 564

def (index)
  execute :select_fedcm_account, {}, {accountIndex: index}
end

#send_actions(data) ⇒ Object



353
354
355
# File 'lib/selenium/webdriver/remote/bridge.rb', line 353

def send_actions(data)
  execute :actions, {}, {actions: data}
end

#send_keys_to_element(element, keys) ⇒ Object



369
370
371
372
373
# File 'lib/selenium/webdriver/remote/bridge.rb', line 369

def send_keys_to_element(element, keys)
  keys = upload_if_necessary(keys) if @file_detector
  text = keys.join
  execute :element_send_keys, {id: element}, {value: text.chars, text: text}
end

#session_idObject

Returns the current session ID.



96
97
98
# File 'lib/selenium/webdriver/remote/bridge.rb', line 96

def session_id
  @session_id || raise(Error::WebDriverError, 'no current session exists')
end

#set_window_rect(x: nil, y: nil, width: nil, height: nil) ⇒ Object



281
282
283
284
285
# File 'lib/selenium/webdriver/remote/bridge.rb', line 281

def set_window_rect(x: nil, y: nil, width: nil, height: nil)
  params = {x: x, y: y, width: width, height: height}
  params.update(params) { |_k, v| Integer(v) unless v.nil? }
  execute :set_window_rect, {}, params
end

#shadow_root(element) ⇒ Object



518
519
520
521
# File 'lib/selenium/webdriver/remote/bridge.rb', line 518

def shadow_root(element)
  id = execute :get_element_shadow_root, id: element
  ShadowRoot.new self, shadow_root_id_from(id)
end

#statusObject



107
108
109
# File 'lib/selenium/webdriver/remote/bridge.rb', line 107

def status
  execute :status
end

#submit_element(element) ⇒ Object



379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'lib/selenium/webdriver/remote/bridge.rb', line 379

def submit_element(element)
  script = "/* submitForm */ var form = arguments[0];\n" \
           "while (form.nodeName != \"FORM\" && form.parentNode) {\n  " \
           "form = form.parentNode;\n" \
           "}\n" \
           "if (!form) { throw Error('Unable to find containing form element'); }\n" \
           "if (!form.ownerDocument) { throw Error('Unable to find owning document'); }\n" \
           "var e = form.ownerDocument.createEvent('Event');\n" \
           "e.initEvent('submit', true, true);\n" \
           "if (form.dispatchEvent(e)) { HTMLFormElement.prototype.submit.call(form) }\n"

  execute_script(script, Bridge.element_class::ELEMENT_KEY => element)
rescue Error::JavascriptError
  raise Error::UnsupportedOperationError, 'To submit an element, it must be nested inside a form element'
end

#switch_to_default_contentObject



198
199
200
# File 'lib/selenium/webdriver/remote/bridge.rb', line 198

def switch_to_default_content
  switch_to_frame nil
end

#switch_to_frame(id) ⇒ Object



189
190
191
192
# File 'lib/selenium/webdriver/remote/bridge.rb', line 189

def switch_to_frame(id)
  id = find_element_by('id', id) if id.is_a? String
  execute :switch_to_frame, {}, {id: id}
end

#switch_to_parent_frameObject



194
195
196
# File 'lib/selenium/webdriver/remote/bridge.rb', line 194

def switch_to_parent_frame
  execute :switch_to_parent_frame
end

#switch_to_window(name) ⇒ Object



185
186
187
# File 'lib/selenium/webdriver/remote/bridge.rb', line 185

def switch_to_window(name)
  execute :switch_to_window, {}, {handle: name}
end

#timeoutsObject

timeouts



119
120
121
# File 'lib/selenium/webdriver/remote/bridge.rb', line 119

def timeouts
  execute :get_timeouts, {}
end

#timeouts=(timeouts) ⇒ Object



123
124
125
# File 'lib/selenium/webdriver/remote/bridge.rb', line 123

def timeouts=(timeouts)
  execute :set_timeout, {}, timeouts
end

#titleObject



163
164
165
# File 'lib/selenium/webdriver/remote/bridge.rb', line 163

def title
  execute :get_title
end

#transportObject



601
602
603
604
# File 'lib/selenium/webdriver/remote/bridge.rb', line 601

def transport
  msg = 'BiDi must be enabled by setting #web_socket_url to true in options class'
  raise(WebDriver::Error::WebDriverError, msg)
end

#urlObject



159
160
161
# File 'lib/selenium/webdriver/remote/bridge.rb', line 159

def url
  execute :get_current_url
end

#user_verified(verified, authenticator_id) ⇒ Object



552
553
554
# File 'lib/selenium/webdriver/remote/bridge.rb', line 552

def user_verified(verified, authenticator_id)
  execute :set_user_verified, {authenticatorId: authenticator_id}, {isUserVerified: verified}
end

#window_handleObject



235
236
237
# File 'lib/selenium/webdriver/remote/bridge.rb', line 235

def window_handle
  execute :get_window_handle
end

#window_handlesObject

window handling



231
232
233
# File 'lib/selenium/webdriver/remote/bridge.rb', line 231

def window_handles
  execute :get_window_handles
end

#window_positionObject



276
277
278
279
# File 'lib/selenium/webdriver/remote/bridge.rb', line 276

def window_position
  data = execute :get_window_rect
  Point.new data['x'], data['y']
end

#window_rectObject



287
288
289
290
# File 'lib/selenium/webdriver/remote/bridge.rb', line 287

def window_rect
  data = execute :get_window_rect
  Rectangle.new data['x'], data['y'], data['width'], data['height']
end

#window_size(handle = :current) ⇒ Object



245
246
247
248
249
250
251
252
253
# File 'lib/selenium/webdriver/remote/bridge.rb', line 245

def window_size(handle = :current)
  unless handle == :current
    raise Error::UnsupportedOperationError,
          'Switch to desired window before getting its size'
  end

  data = execute :get_window_rect
  Dimension.new data['width'], data['height']
end