Class: Maze::Driver::Browser

Inherits:
Object
  • Object
show all
Defined in:
lib/maze/driver/browser.rb

Overview

Handles browser automation fundamentals

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(driver_for, selenium_url = nil, capabilities = nil) ⇒ Browser

Returns a new instance of Browser.



14
15
16
17
18
19
# File 'lib/maze/driver/browser.rb', line 14

def initialize(driver_for, selenium_url=nil, capabilities=nil)
  capabilities ||= {}
  @capabilities = capabilities
  @driver_for = driver_for
  @selenium_url = selenium_url
end

Instance Attribute Details

#capabilitiesObject (readonly)

Returns the value of attribute capabilities.



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

def capabilities
  @capabilities
end

Instance Method Details

#driver_quitObject

Quits the driver



35
36
37
# File 'lib/maze/driver/browser.rb', line 35

def driver_quit
  @driver.quit
end

#find_element(*args) ⇒ Object



21
22
23
# File 'lib/maze/driver/browser.rb', line 21

def find_element(*args)
  @driver.find_element(*args)
end

#javascript?Boolean

check if Selenium supports running javascript in the current browser

Returns:

  • (Boolean)


40
41
42
43
44
# File 'lib/maze/driver/browser.rb', line 40

def javascript?
  @driver.execute_script('return true')
rescue Selenium::WebDriver::Error::UnsupportedOperationError
  false
end

#local_storage?Boolean

check if the browser supports local storage, e.g. safari 10 on browserstack does not have working local storage

Returns:

  • (Boolean)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/maze/driver/browser.rb', line 48

def local_storage?
  # Assume we can use local storage if we aren't able to verify by running JavaScript
  return true unless javascript?

  @driver.execute_script <<-JAVASCRIPT
try {
  window.localStorage.setItem('__localstorage_test__', 1234)
  window.localStorage.removeItem('__localstorage_test__')

  return true
} catch (err) {
  return false
}
  JAVASCRIPT
end


25
26
27
# File 'lib/maze/driver/browser.rb', line 25

def navigate
  @driver.navigate
end

#refreshObject

Refreshes the page



30
31
32
# File 'lib/maze/driver/browser.rb', line 30

def refresh
  @driver.navigate.refresh
end

#restart_driver(attempts = 6) ⇒ Object

Restarts the underlying-driver in the case an unrecoverable error occurs

Parameters:

  • attempts (Integer) (defaults to: 6)

    The number of times we should retry a failed attempt (defaults to 6)



67
68
69
70
71
72
73
# File 'lib/maze/driver/browser.rb', line 67

def restart_driver(attempts=6)
  # Remove the old driver
  @driver.quit
  @driver = nil

  start_driver(attempts)
end

#session_idObject

Returns the driver session ID



99
100
101
# File 'lib/maze/driver/browser.rb', line 99

def session_id
  @driver.session_id
end

#start_driver(attempts = 6) ⇒ Object

Attempts to create a new selenium driver a given number of times

Parameters:

  • attempts (Integer) (defaults to: 6)

    The number of times we should retry a failed attempt (defaults to 6)



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/maze/driver/browser.rb', line 78

def start_driver(attempts=6)
  timeout = attempts * 10
  wait = Maze::Wait.new(interval: 10, timeout: timeout)
  success = wait.until do
    begin
      create_driver(@driver_for, @selenium_url)
    rescue => error
      $logger.warn "#{error.class} occurred with message: #{error.message}"
    end
    @driver
  end

  unless success
    $logger.error "Selenium driver failed to start after #{attempts} attempts in #{timeout} seconds"
    raise RuntimeError.new("Selenium driver failed to start in #{timeout} seconds")
  end
end