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
20
# File 'lib/maze/driver/browser.rb', line 14

def initialize(driver_for, selenium_url=nil, capabilities=nil)
  capabilities ||= {}
  @failed = false
  @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

#click_element(id) ⇒ Object



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

def click_element(id)
  @driver.find_element(id: id).click
end

#driver_quitObject

Quits the driver



55
56
57
# File 'lib/maze/driver/browser.rb', line 55

def driver_quit
  @driver.quit
end

#fail_driverObject

Marks the driver as failed



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

def fail_driver
  $logger.error 'Selenium driver failed, remaining scenarios will be skipped'
  @failed = true
end

#failed?Boolean

Whether the driver has known to have failed (it may still have failed and us not know yet)

Returns:

  • (Boolean)


23
24
25
# File 'lib/maze/driver/browser.rb', line 23

def failed?
  @failed
end

#find_element(*args) ⇒ Object



33
34
35
# File 'lib/maze/driver/browser.rb', line 33

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

#javascript?Boolean

check if Selenium supports running javascript in the current browser

Returns:

  • (Boolean)


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

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)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/maze/driver/browser.rb', line 68

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


45
46
47
# File 'lib/maze/driver/browser.rb', line 45

def navigate
  @driver.navigate
end

#refreshObject

Refreshes the page



50
51
52
# File 'lib/maze/driver/browser.rb', line 50

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)



87
88
89
90
91
92
93
# File 'lib/maze/driver/browser.rb', line 87

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

  start_driver(attempts)
end

#session_idObject

Returns the driver session ID



119
120
121
# File 'lib/maze/driver/browser.rb', line 119

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)



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/maze/driver/browser.rb', line 98

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

#wait_for_element(id) ⇒ Object



37
38
39
# File 'lib/maze/driver/browser.rb', line 37

def wait_for_element(id)
  @driver.find_element(id: id)
end