lapis_lazuli 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3f6f0c091156719d54f992f82af15fecd3a51977
4
- data.tar.gz: 7f5fb5a95f8d09a0d97b3bdddf679ab885a6e0fa
3
+ metadata.gz: a15abf383ad8fc113b64f6ec8ead73fb7e59f37e
4
+ data.tar.gz: aba6ba53323e5930a3d8bc34797fd033ce0f56f6
5
5
  SHA512:
6
- metadata.gz: e2b52796ae5d9822b48622d31f65e083c44044578c776afbc1c77731acdcf5589e65a9ad35915816fd4af389e92957b74871400ed82b242f3a73bf171c154fce
7
- data.tar.gz: c6d0cd5590d38a6e5f344867d0a9d87a32b3e38dff55e10e0150cc6b78eb9483381662d973a32f1ef179d4735f61b7ce8a0e03e44396c1faf68a1b35f3192930
6
+ metadata.gz: 5e64992dbcfa112b9e4deaa1f320e033ae16523e96ecd57ea2975f4646ffa663c2ba2614b3e60e41e6fbe2adc6f386a918e749ee135b4396123cb1f48a59afe1
7
+ data.tar.gz: 07f565653d8fefc1a0801216bc60afdddde03d3387724a3e8a9e9472a4e95bd0b25f8e2695d8f7e88e5e387c7a0ec69ee8b6ecbd3d162b55c0902ee8641ffefd
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ test/storage
19
19
  .idea
20
20
  Gemfile.lock
21
21
  test/Gemfile
22
+ test/debug.log
data/lapis_lazuli.gemspec CHANGED
@@ -40,6 +40,8 @@ Gem::Specification.new do |spec|
40
40
  spec.add_dependency "multi_xml", "~> 0.6"
41
41
  spec.add_dependency "teelogger", "~> 0.5"
42
42
  spec.add_dependency "minitest", "~> 5.10"
43
+ spec.add_dependency "thor", "~> 0.19" # Used in the cucumber project generator
44
+ spec.add_dependency "facets", "~> 3.1" # Used in the cucumber project generator
43
45
 
44
46
  # webdriver specifics
45
47
  spec.add_dependency "selenium-webdriver", "~> 3"
@@ -130,10 +130,10 @@ module LapisLazuli
130
130
 
131
131
  ##
132
132
  # Close and create a new browser
133
- def restart
133
+ def restart(*args)
134
134
  world.log.debug "Restarting browser"
135
- @browser.close
136
- self.start
135
+ self.close
136
+ self.start(*args)
137
137
  end
138
138
 
139
139
  ##
@@ -214,15 +214,9 @@ module LapisLazuli
214
214
  if @@browsers.length != 0 and @@world.env_or_config("close_browser_after") != "never"
215
215
  # Notify user
216
216
  @@world.log.debug("Closing all browsers")
217
-
218
217
  # Close each browser
219
218
  @@browsers.each do |b|
220
- begin
221
- b.close reason, false
222
- rescue Exception => err
223
- # Provide some details
224
- @@world.log.debug("Failed to close the browser, probably chrome: #{err.to_s}")
225
- end
219
+ b.close reason, true
226
220
  end
227
221
 
228
222
  # Make sure the array is cleared
@@ -233,25 +227,48 @@ module LapisLazuli
233
227
  private
234
228
  ##
235
229
  # The main browser window for testing
236
- def init(browser_wanted=(no_browser_wanted=true; nil), optional_data=(no_optional_data=true; nil))
237
- # Store the optional data so on restart of the browser it still has the
238
- # correct configuration
239
- if no_optional_data and optional_data.nil? and @@cached_browser_options.has_key?(:optional_data) and (browser_wanted.nil? or browser_wanted == @@cached_browser_options[:browser])
240
- optional_data = @@cached_browser_options[:optional_data]
230
+ def init(browser_wanted=nil, optional_data=nil)
231
+ # Store the optional data so on restart of the browser it still has the correct configuration
232
+ if optional_data.nil? and @@cached_browser_options.has_key?(:optional_data) and (browser_wanted.nil? or browser_wanted == @@cached_browser_options[:browser])
233
+ optional_data = @@cached_browser_options[:optional_data].dup
234
+ if !@@cached_browser_options[:optional_data][:profile].nil?
235
+ # A selenium profile needs to be duplicated separately, else it doesn't get a new ID.
236
+ optional_data[:profile] = @@cached_browser_options[:optional_data][:profile].dup
237
+ end
241
238
  elsif optional_data.nil?
242
239
  optional_data = {}
243
240
  end
244
241
 
245
242
  # Do the same caching stuff for the browser
246
- if no_browser_wanted and browser_wanted.nil? and @@cached_browser_options.has_key?(:browser)
243
+ if browser_wanted.nil? and @@cached_browser_options.has_key?(:browser)
247
244
  browser_wanted = @@cached_browser_options[:browser]
248
245
  end
249
246
 
247
+ # Set the default device if the optional data does not contain a specific device
248
+ if optional_data[:device].nil?
249
+ # Check if there is a cached value of a previously used
250
+ if @@cached_browser_options.has_key?(:device)
251
+ optional_data[:device] = @@cached_browser_options[:device]
252
+ # Check if the ENV['DEVICE'] variable is set
253
+ elsif !world.env_or_config('DEVICE').nil?
254
+ optional_data[:device] = world.env_or_config('DEVICE')
255
+ # Else grab the default set device
256
+ elsif !world.env_or_config('default_device').nil?
257
+ optional_data[:device] = world.env_or_config('default_device')
258
+ else
259
+ warn 'No default device, nor a selected device was set. Browser default settings will be loaded. More info: http://testautomation.info/Lapis_Lazuli:Device_Simulation'
260
+ end
261
+ end
250
262
 
251
- if !@@cached_browser_options.has_key? :browser
263
+ # cache all the settings if this is the first time opening the browser.
264
+ if !@@cached_browser_options.has_key? :browser and !@@cached_browser_options.has_key? :optional_data
252
265
  @@cached_browser_options[:browser] = browser_wanted
253
266
  # Duplicate the data as Webdriver modifies it
254
267
  @@cached_browser_options[:optional_data] = optional_data.dup
268
+ if !@@cached_browser_options[:optional_data][:profile].nil?
269
+ # A selenium profile needs to be duplicated separately, else it doesn't get a new ID.
270
+ @@cached_browser_options[:optional_data][:profile] = optional_data[:profile].dup
271
+ end
255
272
  end
256
273
 
257
274
  @browser_wanted = browser_wanted
@@ -264,6 +281,24 @@ module LapisLazuli
264
281
  # Create a new browser depending on settings
265
282
  # Always cached the supplied arguments
266
283
  def create_driver(browser_wanted=nil, optional_data=nil)
284
+ # Remove device information from optional_data and create a separate variable for it
285
+ device = optional_data[:device]
286
+ optional_data.delete :device
287
+
288
+ # If device is set, load it from the devices.yml config
289
+ if !device.nil?
290
+ begin
291
+ world.add_config_from_file('./config/devices.yml')
292
+ rescue
293
+ raise '`./config/devices.yml` was not found. See http://testautomation.info/Lapis_Lazuli:Device_Simulation for more information'
294
+ end
295
+ if world.has_config? "devices.#{device}"
296
+ device_configuration = world.config "devices.#{device}"
297
+ else
298
+ raise "Requested device `#{device}` was not found in the configuration. See http://testautomation.info/Lapis_Lazuli:Device_Simulation for more information"
299
+ end
300
+ end
301
+
267
302
  # Run-time dependency.
268
303
  begin
269
304
  require 'selenium-webdriver'
@@ -280,7 +315,6 @@ module LapisLazuli
280
315
  # Select the correct browser
281
316
  case browser_wanted.to_s.downcase
282
317
  when 'chrome'
283
- # Check Platform running script
284
318
  b = :chrome
285
319
  when 'safari'
286
320
  b = :safari
@@ -303,6 +337,37 @@ module LapisLazuli
303
337
  b = :firefox
304
338
  end
305
339
 
340
+ # Overwrite user-agent if a device simulation is set and it contains a user-agent
341
+ if !device_configuration.nil? and !device_configuration['user-agent'].nil?
342
+ case b
343
+ when :firefox
344
+ # Create a firefox profile if it does not exist yet
345
+ if optional_data[:profile].nil?
346
+ optional_data[:profile] = Selenium::WebDriver::Firefox::Profile.new
347
+ else
348
+ # If the profile already exists, we need to create a duplicate, so we don't overwrite any settings.
349
+ optional_data[:profile] = optional_data[:profile].dup
350
+ end
351
+ # Add the user agent to it if it has not been set yet
352
+ if optional_data[:profile].instance_variable_get(:@additional_prefs)['general.useragent.override'].nil?
353
+ optional_data[:profile]['general.useragent.override'] = device_configuration['user-agent']
354
+ else
355
+ world.log.debug "User-agent was already set in the :profile."
356
+ end
357
+ when :chrome
358
+ ua_string = "--user-agent=#{device_configuration['user-agent']}"
359
+ if optional_data[:switches].nil?
360
+ optional_data[:switches] = [ua_string]
361
+ elsif !optional_data[:switches].join(',').include? '--user-agent='
362
+ optional_data[:switches].push ua_string
363
+ else
364
+ world.log.debug "User-agent was already set in the :switches."
365
+ end
366
+ else
367
+ warn "#{device} user agent cannot be set for #{b.to_s}. Only Chrome & Firefox are supported."
368
+ end
369
+ end
370
+
306
371
  args = [b]
307
372
  @browser_name = b.to_s
308
373
  if b == :remote
@@ -342,9 +407,12 @@ module LapisLazuli
342
407
  args.push({:profile => profile})
343
408
  end
344
409
  end
345
-
346
410
  begin
347
411
  browser_instance = Watir::Browser.new(*args)
412
+ # Resize the browser if the device simulation requires it
413
+ if !device_configuration.nil? and !device_configuration['width'].nil? and !device_configuration['height'].nil?
414
+ browser_instance.window.resize_to(device_configuration['width'], device_configuration['height'])
415
+ end
348
416
  rescue Selenium::WebDriver::Error::UnknownError => err
349
417
  raise err
350
418
  end
@@ -74,6 +74,7 @@ module BrowserModule
74
74
  find_proc = lambda { |dummy|
75
75
  res = false
76
76
  err = nil
77
+ err_msg = []
77
78
  retries.times do
78
79
  begin
79
80
  opts = Marshal.load(Marshal.dump(options))
@@ -90,14 +91,20 @@ module BrowserModule
90
91
  end
91
92
  break # don't need to retry
92
93
  rescue Selenium::WebDriver::Error::StaleElementReferenceError => e
94
+ # Sometimes the element becomes stale right when we're trying to check its presence.
93
95
  err = e
96
+ err_msg << e.message
97
+ rescue Watir::Exception::UnknownObjectException => e
98
+ # Sometimes watir returns an unknown object exception, this should be caught when it's a wait until loop.
99
+ err = e
100
+ err_msg << e.message
94
101
  end
95
102
  # Retry
96
103
  end
97
104
 
98
105
  # Raise the error if the retries didn't suffice
99
- if not err.nil? and not res
100
- raise err, "Tried #{retries} times, but got: #{err.message}", err.backtrace
106
+ if not err.nil? and not res === false
107
+ raise err, "Tried #{retries} times, but got: \n#{err_msg.join("\n")}\n", err.backtrace
101
108
  end
102
109
 
103
110
  # Return the results!
@@ -9,9 +9,11 @@
9
9
  ################################################################################
10
10
  # Set the global variables
11
11
  default_env: production # defines the environment
12
+ default_device: desktop720 # See devices.yml for your options
13
+ close_browser_after: end # Can be `scenario`, `feature` or `end`
12
14
 
13
15
  ################################################################################
14
- # List of error strings. Step will fail if one of these strings is detected.
16
+ # List of error strings. `browser.html_error` will return an array of detected strings.
15
17
  error_strings:
16
18
  [
17
19
  "Server Error",
@@ -0,0 +1,43 @@
1
+ ################################################################################
2
+ # Copyright <%= config[:year] %> spriteCloud B.V. All rights reserved.
3
+ # Generated by LapisLazuli, version <%= config[:lapis_lazuli][:version] %>
4
+ # Author: "<%= config[:user] %>" <<%= config[:email] %>>
5
+ #
6
+ # Device file to add extra device simulation.
7
+
8
+ ### USAGE ###
9
+ # Add new devices by adding a device name to simulation-devices
10
+ # Then add a width, height & user-agent field
11
+ # The used browser will start the simulation in that browser.
12
+
13
+ devices:
14
+ # Desktop dimensions
15
+ desktop1080:
16
+ width: 1920
17
+ height: 1080
18
+ desktop720:
19
+ width: 1280
20
+ height: 720
21
+ desktop:
22
+ width: 1360
23
+ height: 768
24
+ iphone5:
25
+ width: 640
26
+ height: 1136
27
+ user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
28
+ iphone3:
29
+ width: 320
30
+ height: 480
31
+ user-agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
32
+ ipad:
33
+ width: 768
34
+ height: 1024
35
+ user-agent: Mozilla/5.0 (iPad; CPU OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1
36
+ galaxys2:
37
+ width: 480
38
+ height: 800
39
+ user-agent: Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36
40
+ galaxys2landscape:
41
+ width: 800
42
+ height: 480
43
+ user-agent: Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36
@@ -10,28 +10,20 @@ World(LapisLazuli)
10
10
 
11
11
  # Do something when LapisLazuli is started (This is before the browser is opened)
12
12
  LapisLazuli.Start do
13
-
14
- # This code snippet prevents the security popup to appear in FF v>47.
15
- # If BROWSER is NIL, Lapis Lazuli will default to Firefox
13
+ #If BROWSER is NIL, Lapis Lazuli will default to Firefox
16
14
  if !ENV['BROWSER'] || ENV['BROWSER'] == 'firefox'
15
+
17
16
  # Get Selenium to create a profile object
18
17
  require 'selenium-webdriver'
19
18
  profile = Selenium::WebDriver::Firefox::Profile.new
19
+
20
+ # These settings prevent a warning after authenticating via URL
21
+ # For example user:pass@https://website.com/
20
22
  profile['network.http.phishy-userpass-length'] = 255
23
+ profile['network.http.use-cache'] = false
24
+
25
+ # Start the browser with these settings
21
26
  browser :firefox, :profile => profile
22
- end
23
- end
24
27
 
25
- # This function is called before every scenario.
26
- Before do
27
- # This can be very handy to make sure a browser has the same settings before a new scenario starts.
28
- # For example, to enforce a certain browser window size
29
- new_width = 1024
30
- new_height = 768
31
- current_size = browser.window.size
32
- # Only change the browser size, if it is not already the correct size
33
- unless current_size.width == new_width && current_size.height == new_height
34
- log.info "Resizing browser to #{new_width}x#{new_height} (Was #{current_size.width}x#{current_size.height}"
35
- browser.window.resize_to(new_width, new_height)
36
28
  end
37
29
  end
@@ -6,5 +6,5 @@
6
6
  # All rights reserved.
7
7
  #
8
8
  module LapisLazuli
9
- VERSION = "1.0.3"
9
+ VERSION = "1.1.0"
10
10
  end
@@ -136,16 +136,44 @@ module WorldModule
136
136
  # - Environment doesn't exist in config
137
137
  # - Default environment not set in config if no environment is set
138
138
  def load_config_from_file(filename)
139
+ # Set the global @config variable
140
+ @config = get_config_from_file(filename)
141
+
142
+ # If we have an environment this config should have it
143
+ if not @env.nil? and not self.has_config?(@env)
144
+ raise "Environment `#{@env}` doesn't exist in config file"
145
+ end
146
+
147
+ # If we don't have one then load the default
148
+ if @env.nil? and self.has_config?("default_env")
149
+ tmp = self.config("default_env")
150
+ if self.has_config?(tmp)
151
+ @env = tmp
152
+ else
153
+ raise "Default environment not present in config file"
154
+ end
155
+ end
156
+ end
157
+
158
+ # Adds the possibility to merge multiple config files.
159
+ def add_config_from_file(filename)
160
+ # Add the data to the global config
161
+ @config.merge! get_config_from_file(filename)
162
+ end
163
+
164
+ # returns the data that's loaded from a config file.
165
+ # Supports YAML and JSON
166
+ def get_config_from_file(filename)
139
167
  # Try to load the file from disk
140
168
  begin
141
169
  # Determine the extension
142
170
  ext = File.extname(filename)
143
171
  # Use the correct loader
144
172
  if ext == ".yml"
145
- @config = YAML.load_file(filename)
173
+ data = YAML.load_file(filename)
146
174
  elsif ext == ".json"
147
175
  json = File.read(filename)
148
- @config = JSON.parse(json)
176
+ data = JSON.parse(json)
149
177
  end
150
178
  rescue RuntimeError => err
151
179
  # Can't help you
@@ -153,29 +181,13 @@ module WorldModule
153
181
  end
154
182
 
155
183
  # Fix up empty files
156
- if @config.nil? or @config == false
184
+ if data.nil? or data == false
157
185
  warn "Could not load configuration from '#{Config.config_file}'; it might be empty or malformed."
158
- @config = {}
159
- end
160
-
161
- # If we have an environment this config should have it
162
- if not @env.nil? and not self.has_config?(@env)
163
- raise "Environment doesn't exist in config file"
164
- end
165
-
166
- # If we don't have one then load the default
167
- if @env.nil? and self.has_config?("default_env")
168
- tmp = self.config("default_env")
169
- if self.has_config?(tmp)
170
- @env = tmp
171
- else
172
- raise "Default environment not present in config file"
173
- end
186
+ data = {}
174
187
  end
188
+ return data
175
189
  end
176
190
 
177
-
178
-
179
191
  ##
180
192
  # Does the config have a variable?
181
193
  # Uses config and catches any errors it raises
@@ -9,6 +9,7 @@
9
9
  ################################################################################
10
10
  # Set the global variables
11
11
  default_env: production # defines the environment
12
+ default_device: desktop720 # set the default browser dimensions and/or user agent (See devices.yml)
12
13
  screenshots_dir: screenshots # where to save the screenshots
13
14
  step_pause_time: 1 # Waiting time in seconds defined after a step completes
14
15
  make_screenshot_on_failed_scenario: true # make a screenshot after a scenario fails
@@ -24,7 +24,6 @@ chrome: BROWSER=chrome
24
24
  ie: BROWSER=ie
25
25
  safari: BROWSER=safari
26
26
 
27
-
28
27
  ################################################################################
29
28
  # Listed environments (default is set in config.yml)
30
29
  t: TEST_ENV=test -t @t,@test
@@ -0,0 +1,43 @@
1
+ ################################################################################
2
+ # Copyright 2014 spriteCloud B.V. All rights reserved.
3
+ # Generated by LapisLazuli, version 0.0.1
4
+ # Author: "spriteCloud" <info@spritecloud.com>
5
+ #
6
+ # Device file to add extra device simulation.
7
+
8
+ ### USAGE ###
9
+ # Add new devices by adding a device name to simulation-devices
10
+ # Then add a width, height & user-agent field
11
+ # The used browser will start the simulation in that browser.
12
+
13
+ devices:
14
+ # Desktop dimensions
15
+ desktop1080:
16
+ width: 1920
17
+ height: 1080
18
+ desktop720:
19
+ width: 1280
20
+ height: 720
21
+ desktop:
22
+ width: 1360
23
+ height: 768
24
+ iphone5:
25
+ width: 640
26
+ height: 1136
27
+ user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
28
+ iphone3:
29
+ width: 320
30
+ height: 480
31
+ user-agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
32
+ ipad:
33
+ width: 768
34
+ height: 1024
35
+ user-agent: Mozilla/5.0 (iPad; CPU OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1
36
+ galaxys2:
37
+ width: 480
38
+ height: 800
39
+ user-agent: Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36
40
+ galaxys2landscape:
41
+ width: 800
42
+ height: 480
43
+ user-agent: Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36
@@ -0,0 +1,43 @@
1
+ @bindings @p
2
+ Feature: binding
3
+ When I want to test the Lapis Lazuli library
4
+ I want to run a webserver with some test files
5
+ And test if I can parse bindings when starting the browsers
6
+
7
+ @bindings_01
8
+ Scenario: Custom user-agent firefox
9
+ Given I use browser bindings "1"
10
+ And I navigate to URL "http://whatsmyua.com/"
11
+ Then within 2 seconds I should see "CUSTOM-USER-AGENT"
12
+ And I close the browser
13
+
14
+ @bindings_02
15
+ Scenario: Custom user-agent chrome
16
+ Given I use browser bindings "2"
17
+ And I navigate to URL "http://whatsmyua.com/"
18
+ Then within 2 seconds I should see "CUSTOM-CHROME-USER-AGENT"
19
+ And I close the browser
20
+
21
+ # Known issue with maximizing the window using the chrome option --start-maximized
22
+ @bindings_03 @maximize_issue
23
+ Scenario: Custom user-agent chrome
24
+ Given I use browser bindings "3"
25
+ And I navigate to URL "http://whatsmyua.com/"
26
+ Then the browser window size should be "full screen"
27
+ And I close the browser
28
+
29
+ @bindings_04
30
+ Scenario: Using a pre-defined device (iphone5)
31
+ Given I restart the browser to device setting "iphone5"
32
+ When I navigate to URL "http://whatsmyua.com"
33
+ Then within 2 seconds I should see "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"
34
+ And the browser window size should be "640x1136"
35
+ And I close the browser
36
+
37
+ @bindings_05
38
+ Scenario: Using a pre-defined device (desktop1080)
39
+ Given I restart the browser to device setting "desktop1080"
40
+ When I navigate to URL "http://whatsmyua.com"
41
+ Then within 2 seconds I should see "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3" disappear
42
+ And the browser window size should be "1920x1080"
43
+ And I close the browser
@@ -17,6 +17,10 @@ Given(/^I navigate to the (.*) test page$/) do |page|
17
17
  end
18
18
  end
19
19
 
20
+ Given(/^I navigate to URL "(.*)"$/) do |url|
21
+ browser.goto url
22
+ end
23
+
20
24
  Given(/I click (the|a) (first|last|random|[0-9]+[a-z]+) (.*)$/) do |arg1, index, type|
21
25
  # Convert the type text to a symbol
22
26
  type = type.downcase.gsub(" ", "_")
@@ -62,6 +66,10 @@ Given(/^I close the browser named "(.*?)"$/) do |name|
62
66
  end
63
67
  end
64
68
 
69
+ Given(/^I close the browser$/) do
70
+ browser.close
71
+ end
72
+
65
73
  When(/^I find "(.*?)" and name it "(.*?)"$/) do |id, name|
66
74
  element = browser.find(id)
67
75
  scenario.storage.set(name, element)
@@ -178,3 +186,32 @@ Then(/^the report should include (.*?) and (.*?) in the correct place$/) do |dat
178
186
  assert ([[data1], [data2]] == values), "Stored values: #{values}, expected [[#{data1}], [#{data2}]]"
179
187
  end
180
188
  end
189
+
190
+ Given(/^I use browser bindings "(.*?)"$/) do |bindings|
191
+ require 'selenium-webdriver'
192
+ case bindings
193
+ when '1'
194
+ profile = Selenium::WebDriver::Firefox::Profile.new
195
+ profile['general.useragent.override'] = "CUSTOM-USER-AGENT"
196
+ browser.restart :firefox, profile: profile
197
+ when '2'
198
+ switches = %w[--user-agent=CUSTOM-CHROME-USER-AGENT]
199
+ browser.restart :chrome, :switches => switches
200
+ when '3'
201
+ caps = Selenium::WebDriver::Remote::Capabilities.chrome(
202
+ "chromeOptions" => {
203
+ "args" => [
204
+ '--start-maximized'
205
+ ]
206
+ }
207
+ )
208
+ browser.restart :chrome, desired_capabilities: caps
209
+ browser.window.maximize
210
+ else
211
+ error "Requested binding setup does not exist. Requested #{bindings}"
212
+ end
213
+ end
214
+
215
+ Given(/^I restart the browser to device setting "(.*?)"$/) do |device|
216
+ browser.restart :chrome, device: device
217
+ end
@@ -99,7 +99,7 @@ Then(/^within (\d+) seconds I should see "([^"]+?)"( disappear)?$/) do |timeout,
99
99
  :timeout => timeout,
100
100
  :text => text,
101
101
  :condition => condition,
102
- :groups => ["wait"]
102
+ :groups => ["wait #{condition.to_s}"]
103
103
  )
104
104
  end
105
105
 
@@ -399,4 +399,24 @@ Then(/^that element should not container text "(.*?)"$/) do |text|
399
399
  if element.text.include? text
400
400
  raise 'Element did contain the text it should not contain.'
401
401
  end
402
+ end
403
+
404
+ Then(/^the browser window size should be "([^"]*)"$/) do |expected_size|
405
+ case expected_size
406
+ when 'full screen'
407
+ current_size = browser.window.size
408
+ browser.window.maximize
409
+ when /^(\d+)x(\d+)$/
410
+ width = $1
411
+ height = $2
412
+ current_size = browser.window.size
413
+ browser.window.resize_to(width, height)
414
+ else
415
+ error "Unkown variable #{expected_size} in 'the browser window size should be ...'"
416
+ end
417
+ difference_width = browser.window.size.width - current_size.width
418
+ difference_height = browser.window.size.height - current_size.height
419
+ unless difference_width > -30 and difference_width < 30 and difference_height > -30 and difference_height < 30
420
+ error "Window size changed after resizing it to `#{expected_size}`. before: #{current_size.width}x#{current_size.height}. After: #{browser.window.size.width}x#{browser.window.size.height}"
421
+ end
402
422
  end
@@ -16,6 +16,14 @@ World(LapisLazuli, TestModule)
16
16
 
17
17
  LapisLazuli::WorldModule::Browser.browser_module(TestModule)
18
18
 
19
+ LapisLazuli.Start do
20
+ # Print gem information
21
+ print "---- VERSION INFO ----\n"
22
+ print "Lapis Lazuli: #{Gem.loaded_specs['lapis_lazuli'].version}\n"
23
+ print "Selenium webdriver: #{Gem.loaded_specs['selenium-webdriver'].version}\n"
24
+ print "Watir: #{Gem.loaded_specs['watir'].version}\n"
25
+ print "---- VERSION INFO ----\n\n"
26
+ end
19
27
 
20
28
  # Transition function from old codebase to new
21
29
  load 'server/start.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lapis_lazuli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Onno Steenbergen
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-03-16 00:00:00.000000000 Z
14
+ date: 2017-04-06 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -125,6 +125,34 @@ dependencies:
125
125
  - - "~>"
126
126
  - !ruby/object:Gem::Version
127
127
  version: '5.10'
128
+ - !ruby/object:Gem::Dependency
129
+ name: thor
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '0.19'
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '0.19'
142
+ - !ruby/object:Gem::Dependency
143
+ name: facets
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '3.1'
149
+ type: :runtime
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '3.1'
128
156
  - !ruby/object:Gem::Dependency
129
157
  name: selenium-webdriver
130
158
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +234,7 @@ files:
206
234
  - lib/lapis_lazuli/generators/cucumber/template/README.md
207
235
  - lib/lapis_lazuli/generators/cucumber/template/config/config.yml
208
236
  - lib/lapis_lazuli/generators/cucumber/template/config/cucumber.yml
237
+ - lib/lapis_lazuli/generators/cucumber/template/config/devices.yml
209
238
  - lib/lapis_lazuli/generators/cucumber/template/features/account.feature
210
239
  - lib/lapis_lazuli/generators/cucumber/template/features/example.feature
211
240
  - lib/lapis_lazuli/generators/cucumber/template/features/step_definitions/interaction_steps.rb
@@ -237,7 +266,9 @@ files:
237
266
  - test/README.md
238
267
  - test/config/config.yml
239
268
  - test/config/cucumber.yml
269
+ - test/config/devices.yml
240
270
  - test/features/annotation.feature
271
+ - test/features/bindings.feature
241
272
  - test/features/browser.feature
242
273
  - test/features/button.feature
243
274
  - test/features/click.feature
@@ -292,7 +323,9 @@ test_files:
292
323
  - test/README.md
293
324
  - test/config/config.yml
294
325
  - test/config/cucumber.yml
326
+ - test/config/devices.yml
295
327
  - test/features/annotation.feature
328
+ - test/features/bindings.feature
296
329
  - test/features/browser.feature
297
330
  - test/features/button.feature
298
331
  - test/features/click.feature