testcentricity_web 4.1.7 → 4.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +5 -1
  3. data/CHANGELOG.md +12 -1
  4. data/Gemfile.lock +1 -1
  5. data/README.md +3 -1
  6. data/Rakefile +29 -3
  7. data/config/cucumber.yml +11 -4
  8. data/config/test_data/LOCAL_data.json +15 -0
  9. data/config/test_data/LOCAL_data.xls +0 -0
  10. data/config/test_data/LOCAL_data.yml +11 -0
  11. data/config/test_data/data.json +13 -0
  12. data/config/test_data/data.yml +12 -4
  13. data/features/basic_form_page_css.feature +39 -0
  14. data/features/basic_form_page_xpath.feature +26 -0
  15. data/features/media_players.feature +4 -7
  16. data/features/step_definitions/generic_steps.rb.rb +65 -0
  17. data/features/support/data/form_data.rb +43 -0
  18. data/features/support/env.rb +3 -3
  19. data/features/support/hooks.rb +21 -1
  20. data/features/support/pages/base_test_page.rb +11 -0
  21. data/features/support/pages/{basic_css_test_page.rb → basic_css_form_page.rb} +3 -3
  22. data/features/support/pages/{basic_test_page.rb → basic_form_page.rb} +120 -24
  23. data/features/support/pages/{basic_xpath_test_page.rb → basic_xpath_form_page.rb} +3 -3
  24. data/features/support/pages/custom_controls_page.rb +2 -5
  25. data/features/support/pages/indexed_sections_page.rb +2 -5
  26. data/features/support/pages/media_test_page.rb +27 -14
  27. data/features/support/sections/header_nav.rb +11 -0
  28. data/features/support/world_data.rb +1 -1
  29. data/features/support/world_pages.rb +2 -2
  30. data/lib/testcentricity_web/appium_server.rb +5 -0
  31. data/lib/testcentricity_web/data_objects/data_objects_helper.rb +7 -0
  32. data/lib/testcentricity_web/data_objects/environment.rb +2 -0
  33. data/lib/testcentricity_web/data_objects/excel_helper.rb +60 -59
  34. data/lib/testcentricity_web/version.rb +1 -1
  35. data/lib/testcentricity_web/web_core/drag_drop_helper.rb +4 -0
  36. data/lib/testcentricity_web/web_core/page_objects_helper.rb +3 -1
  37. data/lib/testcentricity_web/web_core/webdriver_helper.rb +16 -0
  38. data/lib/testcentricity_web/web_elements/file_field.rb +9 -5
  39. data/lib/testcentricity_web/web_elements/image.rb +2 -1
  40. data/lib/testcentricity_web/web_elements/media.rb +1 -13
  41. data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +20 -7
  42. data/lib/testcentricity_web/web_elements/video.rb +2 -2
  43. data/test_site/basic_test_page.html +1 -1
  44. data/test_site/media/count_and_bars.mp4 +0 -0
  45. data/test_site/media_page.html +2 -2
  46. metadata +18 -12
  47. data/features/basic_test_page_css.feature +0 -35
  48. data/features/basic_test_page_xpath.feature +0 -27
@@ -1,8 +1,9 @@
1
- # Page Object class definition for Basic HTML Test page
1
+ # Page Object class definition for Basic HTML Form page
2
2
 
3
- class BasicTestPage < BaseTestPage
3
+ class BasicFormPage < BaseTestPage
4
4
  trait(:page_url) { '/basic_test_page.html' }
5
5
  trait(:navigator) { header_nav.open_form_page }
6
+ trait(:page_title) { 'Basic HTML Form'}
6
7
  trait(:tab_order) {
7
8
  [
8
9
  header_nav.form_link,
@@ -73,17 +74,44 @@ class BasicTestPage < BaseTestPage
73
74
  }
74
75
 
75
76
  def verify_page_ui
77
+ super
78
+
79
+ verify_page_contains(page_title)
80
+ image_1.wait_until_loaded(5)
81
+ username_field.scroll_to(:center) if username_field.obscured?
76
82
  ui = {
77
- self => { exists: true, secure: false, title: 'Basic HTML Form' },
78
- header_label => { visible: true, caption: 'Basic HTML Form Example' },
79
83
  username_label => { visible: true, caption: 'Username:' },
80
- username_field => { visible: true, enabled: true, required: true, value: '', placeholder: 'User name' },
84
+ username_field => {
85
+ name: 'username',
86
+ exists: true,
87
+ displayed: true,
88
+ obscured: false,
89
+ visible: true,
90
+ hidden: false,
91
+ enabled: true,
92
+ disabled: false,
93
+ required: true,
94
+ value: '',
95
+ placeholder: 'User name'
96
+ },
81
97
  password_label => { visible: true, caption: 'Password:' },
82
- password_field => { visible: true, enabled: true, required: true, value: '', placeholder: 'Password' },
98
+ password_field => {
99
+ name: 'password',
100
+ visible: true,
101
+ displayed: true,
102
+ obscured: false,
103
+ focused: false,
104
+ enabled: true,
105
+ required: true,
106
+ value: '',
107
+ placeholder: 'Password'
108
+ },
83
109
  max_length_label => { visible: true, caption: 'Max Length:' },
84
110
  max_length_field => {
85
111
  visible: true,
112
+ obscured: false,
86
113
  enabled: true,
114
+ focused: false,
87
115
  placeholder: 'up to 64 characters',
88
116
  value: '',
89
117
  maxlength: 64
@@ -119,15 +147,75 @@ class BasicTestPage < BaseTestPage
119
147
  filename_label => { visible: true, caption: 'Filename:' },
120
148
  upload_file => { visible: true, enabled: true, value: '' },
121
149
  checkboxes_label => { visible: true, caption: 'Checkbox Items:' },
122
- check_1 => { visible: true, enabled: true, checked: false },
123
- check_2 => { visible: true, enabled: true, checked: false },
124
- check_3 => { visible: true, enabled: true, checked: false },
125
- check_4 => { visible: true, enabled: false, checked: false },
150
+ check_1 => {
151
+ exists: true,
152
+ visible: true,
153
+ hidden: false,
154
+ enabled: true,
155
+ disabled: false,
156
+ checked: false,
157
+ indeterminate: false
158
+ },
159
+ check_2 => {
160
+ exists: true,
161
+ visible: true,
162
+ hidden: false,
163
+ enabled: true,
164
+ disabled: false,
165
+ checked: false,
166
+ indeterminate: false
167
+ },
168
+ check_3 => {
169
+ exists: true,
170
+ visible: true,
171
+ hidden: false,
172
+ enabled: true,
173
+ disabled: false,
174
+ checked: false,
175
+ indeterminate: false
176
+ },
177
+ check_4 => {
178
+ exists: true,
179
+ visible: true,
180
+ hidden: false,
181
+ enabled: false,
182
+ disabled: true,
183
+ checked: false,
184
+ indeterminate: false
185
+ },
126
186
  radios_label => { visible: true, caption: 'Radio Items:' },
127
- radio_1 => { visible: true, enabled: true, selected: false },
128
- radio_2 => { visible: true, enabled: true, selected: false },
129
- radio_3 => { visible: true, enabled: true, selected: false },
130
- radio_4 => { visible: true, enabled: false, selected: false },
187
+ radio_1 => {
188
+ exists: true,
189
+ visible: true,
190
+ hidden: false,
191
+ enabled: true,
192
+ disabled: false,
193
+ selected: false
194
+ },
195
+ radio_2 => {
196
+ exists: true,
197
+ visible: true,
198
+ hidden: false,
199
+ enabled: true,
200
+ disabled: false,
201
+ selected: false
202
+ },
203
+ radio_3 => {
204
+ exists: true,
205
+ visible: true,
206
+ hidden: false,
207
+ enabled: true,
208
+ disabled: false,
209
+ selected: false
210
+ },
211
+ radio_4 => {
212
+ exists: true,
213
+ visible: true,
214
+ hidden: false,
215
+ enabled: false,
216
+ disabled: true,
217
+ selected: false
218
+ },
131
219
  multiselect_label => { visible: true, caption: 'Multiple Select Values:' },
132
220
  multi_select => {
133
221
  visible: true,
@@ -158,6 +246,7 @@ class BasicTestPage < BaseTestPage
158
246
  link_3 => {
159
247
  visible: true,
160
248
  aria_disabled: true,
249
+ role: 'link',
161
250
  caption: 'Disabled Link'
162
251
  },
163
252
  table_label => { visible: true, caption: 'Table:' },
@@ -169,17 +258,22 @@ class BasicTestPage < BaseTestPage
169
258
  { row: 1 } => [['Alfreds Futterkiste', 'Maria Anders', 'Germany']],
170
259
  { row: 2 } => [['Centro comercial Moctezuma', 'Francisco Chang', 'Mexico']],
171
260
  { row: 3 } => [['Ernst Handel', 'Roland Mendel', 'Austria']],
172
- { row: 4 } => [['Island Trading', 'Helen Bennett', 'UK']]
261
+ { row: 4 } => [['Island Trading', 'Helen Bennett', 'UK']],
262
+ { cell: [1, 3] } => ['Germany'],
263
+ { cell: [2, 3] } => ['Mexico'],
264
+ { column: 3 } => [['Germany', 'Mexico', 'Austria', 'UK']]
173
265
  },
174
266
  images_label => { visible: true, caption: 'Images:' },
175
267
  image_1 => {
176
268
  visible: true,
269
+ loaded: true,
177
270
  broken: false,
178
271
  src: { ends_with: 'images/Wilder.jpg' },
179
272
  alt: "It's alive"
180
273
  },
181
274
  image_2 => {
182
275
  visible: true,
276
+ loaded: true,
183
277
  broken: false,
184
278
  src: { ends_with: 'images/You_Betcha.jpg' },
185
279
  alt: 'You Betcha'
@@ -197,18 +291,20 @@ class BasicTestPage < BaseTestPage
197
291
  end
198
292
 
199
293
  def form_data
294
+ data = form_data_source.read_form_data
295
+
200
296
  if Environ.platform == :mobile
201
297
  file_path = nil
202
298
  file_name = ''
203
299
  color_value = '#000000'
204
300
  else
205
- file_path = "#{Dir.pwd}/test_site/images/Wilder.jpg"
206
- file_name = 'Wilder.jpg'
301
+ file_path = "#{Dir.pwd}/test_site/images/#{data.image_filename}"
302
+ file_name = data.image_filename
207
303
  color_value = Faker::Color.hex_color
208
304
  end
209
305
  {
210
- username: Faker::Name.name,
211
- password: 'T0p_Sekrit',
306
+ username: data.username,
307
+ password: data.password,
212
308
  maxlength: Faker::Marketing.buzzwords,
213
309
  number: Faker::Number.between(from: 10, to: 1024),
214
310
  color: color_value,
@@ -216,14 +312,14 @@ class BasicTestPage < BaseTestPage
216
312
  comments: Faker::Hipster.paragraph,
217
313
  filepath: file_path,
218
314
  filename: file_name,
219
- check1: true,
220
- check2: true,
221
- check3: false,
315
+ check1: data.check1,
316
+ check2: data.check2,
317
+ check3: data.check3,
222
318
  radio1: false,
223
319
  radio2: true,
224
320
  radio3: false,
225
- multi_select: 'Selection Item 2',
226
- drop_select: 'Drop Down Item 5'
321
+ multi_select: data.multi_select,
322
+ drop_select: data.drop_down_item
227
323
  }
228
324
  end
229
325
 
@@ -1,7 +1,7 @@
1
- # Page Object class definition for Basic HTML Test page with Xpath locators
1
+ # Page Object class definition for Basic HTML Form page with Xpath locators
2
2
 
3
- class BasicXpathTestPage < BasicTestPage
4
- trait(:page_name) { 'Basic Xpath Test' }
3
+ class BasicXpathFormPage < BasicFormPage
4
+ trait(:page_name) { 'Basic Xpath Form' }
5
5
  trait(:page_locator) { "//form[@id='HTMLFormElements']" }
6
6
 
7
7
  # Basic HTML Test page UI elements
@@ -5,12 +5,9 @@ class CustomControlsPage < BaseTestPage
5
5
  trait(:page_locator) { 'div.custom-controls-page-body' }
6
6
  trait(:page_url) { '/custom_controls_page.html' }
7
7
  trait(:navigator) { header_nav.open_custom_controls_page }
8
+ trait(:page_title) { 'Custom Controls Page'}
8
9
 
9
10
  def verify_page_ui
10
- ui = {
11
- self => { exists: true, secure: false, title: 'Custom Controls Page' },
12
- header_label => { visible: true, caption: 'Custom Controls Page' }
13
- }
14
- verify_ui_states(ui)
11
+ super
15
12
  end
16
13
  end
@@ -5,12 +5,9 @@ class IndexedSectionsPage < BaseTestPage
5
5
  trait(:page_locator) { 'div.indexed-sections-page-body' }
6
6
  trait(:page_url) { '/indexed_sections_page.html' }
7
7
  trait(:navigator) { header_nav.open_indexed_sections_page }
8
+ trait(:page_title) { 'Indexed Sections Page'}
8
9
 
9
10
  def verify_page_ui
10
- ui = {
11
- self => { exists: true, secure: false, title: 'Indexed Sections Page' },
12
- header_label => { visible: true, caption: 'Indexed Sections Page' }
13
- }
14
- verify_ui_states(ui)
11
+ super
15
12
  end
16
13
  end
@@ -5,25 +5,29 @@ class MediaTestPage < BaseTestPage
5
5
  trait(:page_locator) { 'div.media-page-body' }
6
6
  trait(:page_url) { '/media_page.html' }
7
7
  trait(:navigator) { header_nav.open_media_page }
8
+ trait(:page_title) { 'Media Page'}
8
9
 
9
10
  # Media Test page UI elements
10
- videos video_player: 'video#video_player'
11
+ videos video_player_1: 'video#video_player1'
11
12
  audios audio_player: 'audio#audio_player'
12
13
 
13
14
  def verify_page_ui
15
+ super
16
+
14
17
  preload = case
15
- when Environ.browser == :safari || Environ.device_os == :ios
16
- 'auto'
17
- when Environ.browser == :firefox
18
- ''
19
- else
20
- 'metadata'
21
- end
22
- video_player.wait_until_ready_state_is(4, 10)
18
+ when Environ.browser == :safari
19
+ 'auto'
20
+ when Environ.device_os == :ios && Environ.driver != :webdriver
21
+ 'auto'
22
+ when %i[firefox firefox_headless].include?(Environ.browser)
23
+ ''
24
+ else
25
+ 'metadata'
26
+ end
27
+ video_player_1.wait_until_ready_state_is(4, 10)
28
+ audio_player.wait_until_ready_state_is(4, 10)
23
29
  ui = {
24
- self => { exists: true, secure: false, title: 'Media Page' },
25
- header_label => { visible: true, caption: 'Media Page' },
26
- video_player => {
30
+ video_player_1 => {
27
31
  visible: true,
28
32
  paused: true,
29
33
  autoplay: false,
@@ -64,6 +68,14 @@ class MediaTestPage < BaseTestPage
64
68
  }
65
69
  }
66
70
  verify_ui_states(ui)
71
+ unless Environ.browser == :safari
72
+ ui = { video_player_1 => {
73
+ width: video_player_1.video_width,
74
+ height: video_player_1.video_height
75
+ }
76
+ }
77
+ verify_ui_states(ui)
78
+ end
67
79
  end
68
80
 
69
81
  def perform_action(media_type, action)
@@ -72,7 +84,7 @@ class MediaTestPage < BaseTestPage
72
84
  when :play
73
85
  player.play
74
86
  player.send_keys(:enter) if player.paused?
75
- player.click if player.paused?
87
+ player.click_at(25, 25) if player.paused?
76
88
  when :pause
77
89
  player.pause
78
90
  when :mute
@@ -175,7 +187,7 @@ class MediaTestPage < BaseTestPage
175
187
  def dispatch_player(media_type)
176
188
  player = case media_type.downcase.to_sym
177
189
  when :video
178
- video_player
190
+ video_player_1
179
191
  when :audio
180
192
  audio_player
181
193
  else
@@ -190,6 +202,7 @@ class MediaTestPage < BaseTestPage
190
202
  player.current_time = 0
191
203
  player.play
192
204
  player.send_keys(:enter) if player.paused?
205
+ player.click_at(25, 25) if player.paused?
193
206
  sleep(1)
194
207
  end
195
208
  end
@@ -25,4 +25,15 @@ class NavHeader < TestCentricity::PageSection
25
25
  def open_custom_controls_page
26
26
  custom_controls_link.click
27
27
  end
28
+
29
+ def verify_nav_bar
30
+ ui = {
31
+ self => { exists: true, visible: true, class: 'topnav' },
32
+ form_link => { visible: true, caption: 'Basic HTML Form' },
33
+ media_link => { visible: true, caption: 'Media' },
34
+ indexed_sections_link => { visible: true, caption: 'Indexed Sections' },
35
+ custom_controls_link => { visible: true, caption: 'Custom Controls' },
36
+ }
37
+ verify_ui_states(ui)
38
+ end
28
39
  end
@@ -4,7 +4,7 @@ module WorldData
4
4
  # by the TestCentricity™ DataManager. Data Object class definitions are contained in the features/support/data folder.
5
5
  #
6
6
  def data_objects
7
- {}
7
+ { form_data_source: FormDataSource }
8
8
  end
9
9
  end
10
10
 
@@ -5,8 +5,8 @@ module WorldPages
5
5
  #
6
6
  def page_objects
7
7
  {
8
- basic_css_test_page: BasicCSSTestPage,
9
- basic_xpath_test_page: BasicXpathTestPage,
8
+ basic_css_form_page: BasicCSSFormPage,
9
+ basic_xpath_form_page: BasicXpathFormPage,
10
10
  media_test_page: MediaTestPage,
11
11
  indexed_sections_page: IndexedSectionsPage,
12
12
  custom_controls_page: CustomControlsPage
@@ -18,10 +18,12 @@ module TestCentricity
18
18
  def start
19
19
  # terminate any currently running Appium Server
20
20
  if running?
21
+ # :nocov:
21
22
  system('killall -9 node')
22
23
  puts 'Terminating existing Appium Server'
23
24
  sleep(5)
24
25
  puts 'Appium Server is being restarted'
26
+ # :nocov:
25
27
  else
26
28
  puts 'Appium Server is starting'
27
29
  end
@@ -56,6 +58,7 @@ module TestCentricity
56
58
 
57
59
  private
58
60
 
61
+ # :nocov:
59
62
  def parameters
60
63
  cmd = ['appium']
61
64
  @params.each do |key, value|
@@ -64,5 +67,7 @@ module TestCentricity
64
67
  end
65
68
  cmd
66
69
  end
70
+ # :nocov:
67
71
  end
68
72
  end
73
+
@@ -52,6 +52,7 @@ module TestCentricity
52
52
  @current = current
53
53
  end
54
54
 
55
+ # :nocov:
55
56
  def to_hash(node_name = nil)
56
57
  data = {}
57
58
  if node_name.nil?
@@ -79,9 +80,12 @@ module TestCentricity
79
80
  def write_json_data(file_name, mode, node_name = nil)
80
81
  File.open(file_name, mode) { |file| file.write(to_json(node_name)) }
81
82
  end
83
+
84
+ # :nocov:
82
85
  end
83
86
 
84
87
 
88
+ # :nocov:
85
89
  class DataSource
86
90
  attr_accessor :file_path
87
91
  attr_accessor :node
@@ -135,6 +139,7 @@ module TestCentricity
135
139
  result.to_s
136
140
  end
137
141
  end
142
+ # :nocov:
138
143
 
139
144
 
140
145
  class ExcelDataSource < TestCentricity::DataSource
@@ -159,6 +164,7 @@ module TestCentricity
159
164
  ExcelData.read_row_data(pick_excel_data_source(sheet, @row_spec), sheet, @row_spec)
160
165
  end
161
166
 
167
+ # :nocov:
162
168
  def read_excel_pool_data(sheet, row_name, parallel = false)
163
169
  @row_spec = parallel == :parallel && ENV['PARALLEL'] ? "#{row_name}#{ENV['TEST_ENV_NUMBER']}" : row_name
164
170
  ExcelData.read_row_from_pool(pick_excel_data_source(sheet, row_name), sheet, @row_spec)
@@ -173,6 +179,7 @@ module TestCentricity
173
179
  @row_spec = parallel == :parallel && ENV['PARALLEL'] ? "#{row_name}#{ENV['TEST_ENV_NUMBER']}" : row_name
174
180
  ExcelData.write_row_data(pick_excel_data_source(sheet, @row_spec), sheet, @row_spec, row_data)
175
181
  end
182
+ # :nocov:
176
183
  end
177
184
  end
178
185
 
@@ -396,6 +396,7 @@ module TestCentricity
396
396
  @screen_shots = []
397
397
  end
398
398
 
399
+ # :nocov:
399
400
  def self.report_header
400
401
  report_header = "\n<b><u>TEST ENVIRONMENT</u>:</b> #{ENV['TEST_ENVIRONMENT']}\n"\
401
402
  " <b>Browser:</b>\t #{Environ.browser.capitalize}\n"
@@ -411,6 +412,7 @@ module TestCentricity
411
412
  report_header = "#{report_header} <b>WCAG Accessibility Standard:</b>\t #{ENV['ACCESSIBILITY_STANDARD']}\n" if ENV['ACCESSIBILITY_STANDARD']
412
413
  "#{report_header}\n\n"
413
414
  end
415
+ # :nocov:
414
416
  end
415
417
  end
416
418
 
@@ -52,6 +52,65 @@ module TestCentricity
52
52
  exists
53
53
  end
54
54
 
55
+ def self.read_row_data(file, sheet, row_spec, columns = nil)
56
+ raise "File #{file} does not exists" unless File.exist?(file)
57
+ work_book = Spreadsheet.open(file)
58
+ work_sheet = work_book.worksheet(sheet)
59
+ # get column headings from row 0 of worksheet
60
+ headings = work_sheet.row(0)
61
+ # if row_spec is a string then we have to find a matching row name
62
+ if row_spec.is_a? String
63
+ column_number = 0
64
+ found = false
65
+ headings.each do |heading|
66
+ if heading == 'ROW_NAME'
67
+ found = true
68
+ break
69
+ end
70
+ column_number += 1
71
+ end
72
+ raise "Could not find a column named ROW_NAME in worksheet #{sheet}" unless found
73
+ # find first cell in ROW_NAME column containing a string that matches the row_spec parameter
74
+ found = false
75
+ row_number = 0
76
+ work_sheet.each do |row|
77
+ if row[column_number] == row_spec
78
+ found = true
79
+ break
80
+ end
81
+ row_number += 1
82
+ end
83
+ raise "Could not find a row named '#{row_spec}' in worksheet #{sheet}" unless found
84
+ data = work_sheet.row(row_number)
85
+ # if row_spec is a number then ensure that it doesn't exceed the number of available rows
86
+ elsif row_spec.is_a? Numeric
87
+ raise "Row # #{row_spec} is greater than number of rows in worksheet #{sheet}" if row_spec > work_sheet.last_row_index
88
+ data = work_sheet.row(row_spec)
89
+ end
90
+
91
+ # if no columns have been specified, return all columns
92
+ columns = headings if columns.nil?
93
+ # create results hash table
94
+ result = Hash.new
95
+ columns.each do |column|
96
+ column_number = 0
97
+ found = false
98
+ headings.each do |heading|
99
+ if column == heading
100
+ value = data[column_number].to_s
101
+ value = calculate_dynamic_value(value) if value.start_with? 'eval!'
102
+ result[column] = value
103
+ found = true
104
+ break
105
+ end
106
+ column_number += 1
107
+ end
108
+ raise "Could not find a column named '#{column}' in worksheet #{sheet}" unless found
109
+ end
110
+ result
111
+ end
112
+
113
+ # :nocov:
55
114
  def self.read_row_from_pool(file, sheet, row_spec, columns = nil)
56
115
  raise "File #{file} does not exists" unless File.exist?(file)
57
116
  work_book = Spreadsheet.open(file)
@@ -118,64 +177,6 @@ module TestCentricity
118
177
  read_row_data(file, sheet, new_row, columns)
119
178
  end
120
179
 
121
- def self.read_row_data(file, sheet, row_spec, columns = nil)
122
- raise "File #{file} does not exists" unless File.exist?(file)
123
- work_book = Spreadsheet.open(file)
124
- work_sheet = work_book.worksheet(sheet)
125
- # get column headings from row 0 of worksheet
126
- headings = work_sheet.row(0)
127
- # if row_spec is a string then we have to find a matching row name
128
- if row_spec.is_a? String
129
- column_number = 0
130
- found = false
131
- headings.each do |heading|
132
- if heading == 'ROW_NAME'
133
- found = true
134
- break
135
- end
136
- column_number += 1
137
- end
138
- raise "Could not find a column named ROW_NAME in worksheet #{sheet}" unless found
139
- # find first cell in ROW_NAME column containing a string that matches the row_spec parameter
140
- found = false
141
- row_number = 0
142
- work_sheet.each do |row|
143
- if row[column_number] == row_spec
144
- found = true
145
- break
146
- end
147
- row_number += 1
148
- end
149
- raise "Could not find a row named '#{row_spec}' in worksheet #{sheet}" unless found
150
- data = work_sheet.row(row_number)
151
- # if row_spec is a number then ensure that it doesn't exceed the number of available rows
152
- elsif row_spec.is_a? Numeric
153
- raise "Row # #{row_spec} is greater than number of rows in worksheet #{sheet}" if row_spec > work_sheet.last_row_index
154
- data = work_sheet.row(row_spec)
155
- end
156
-
157
- # if no columns have been specified, return all columns
158
- columns = headings if columns.nil?
159
- # create results hash table
160
- result = Hash.new
161
- columns.each do |column|
162
- column_number = 0
163
- found = false
164
- headings.each do |heading|
165
- if column == heading
166
- value = data[column_number].to_s
167
- value = calculate_dynamic_value(value) if value.start_with? 'eval!'
168
- result[column] = value
169
- found = true
170
- break
171
- end
172
- column_number += 1
173
- end
174
- raise "Could not find a column named '#{column}' in worksheet #{sheet}" unless found
175
- end
176
- result
177
- end
178
-
179
180
  def self.read_range_data(file, sheet, range_spec)
180
181
  raise "File #{file} does not exists" unless File.exist?(file)
181
182
  work_book = Spreadsheet.open(file)
@@ -270,6 +271,6 @@ module TestCentricity
270
271
  # rename new Excel document, replacing the original
271
272
  File.rename(outfile, file)
272
273
  end
274
+ # :nocov:
273
275
  end
274
276
  end
275
-
@@ -1,3 +1,3 @@
1
1
  module TestCentricityWeb
2
- VERSION = '4.1.7'
2
+ VERSION = '4.1.8'
3
3
  end
@@ -1,3 +1,5 @@
1
+ # :nocov:
2
+
1
3
  module CapybaraExtension
2
4
  def drag_by(right_by, down_by)
3
5
  base.drag_by(right_by, down_by)
@@ -11,5 +13,7 @@ module CapybaraSeleniumExtension
11
13
  end
12
14
  end
13
15
 
16
+ # :nocov:
17
+
14
18
  ::Capybara::Selenium::Node.send :include, CapybaraSeleniumExtension
15
19
  ::Capybara::Node::Element.send :include, CapybaraExtension
@@ -65,6 +65,8 @@ module TestCentricity
65
65
  ui_object.hidden?
66
66
  when :displayed
67
67
  ui_object.displayed?
68
+ when :obscured
69
+ ui_object.obscured?
68
70
  when :focused
69
71
  ui_object.focused?
70
72
  when :width
@@ -312,7 +314,7 @@ module TestCentricity
312
314
  check_state = data_param.is_a?(String) ? data_param.to_bool : data_param
313
315
  data_field.set_selected_state(check_state)
314
316
  when :textfield
315
- if data_field.get_attribute(:type) == 'color'
317
+ if %w[color number].include?(data_field.get_attribute(:type))
316
318
  data_field.set(data_param)
317
319
  else
318
320
  data_field.set("#{data_param}\t")