testcentricity_web 4.1.8 → 4.1.9

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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -1
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +13 -0
  6. data/README.md +11 -12
  7. data/Rakefile +93 -64
  8. data/config/cucumber.yml +1 -0
  9. data/config/locales/en-US.yml +56 -0
  10. data/{docker-compose-v3.yml → docker-compose.yml} +2 -2
  11. data/features/basic_form_page_css.feature +16 -1
  12. data/features/custom_controls.feature +29 -0
  13. data/features/media_players.feature +3 -20
  14. data/features/step_definitions/generic_steps.rb.rb +15 -0
  15. data/features/support/env.rb +3 -2
  16. data/features/support/hooks.rb +8 -3
  17. data/features/support/pages/base_test_page.rb +1 -1
  18. data/features/support/pages/basic_css_form_page.rb +1 -0
  19. data/features/support/pages/basic_form_page.rb +45 -9
  20. data/features/support/pages/basic_xpath_form_page.rb +1 -0
  21. data/features/support/pages/custom_controls_page.rb +250 -0
  22. data/features/support/pages/indexed_sections_page.rb +44 -0
  23. data/features/support/pages/media_test_page.rb +10 -11
  24. data/features/support/sections/header_nav.rb +10 -1
  25. data/features/support/sections/product_card.rb +39 -0
  26. data/lib/testcentricity_web/browser_helper.rb +0 -6
  27. data/lib/testcentricity_web/version.rb +1 -1
  28. data/lib/testcentricity_web/web_core/page_objects_helper.rb +1 -1
  29. data/lib/testcentricity_web/web_core/page_section.rb +1 -1
  30. data/lib/testcentricity_web/web_core/webdriver_helper.rb +44 -44
  31. data/lib/testcentricity_web/web_elements/checkbox.rb +50 -19
  32. data/lib/testcentricity_web/web_elements/media.rb +1 -1
  33. data/lib/testcentricity_web/web_elements/radio.rb +50 -19
  34. data/lib/testcentricity_web/web_elements/select_list.rb +12 -12
  35. data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +3 -3
  36. data/spec/fixtures/page_object.rb +22 -0
  37. data/spec/fixtures/section_object.rb +21 -0
  38. data/spec/spec_helper.rb +31 -0
  39. data/spec/testcentricity_web/browser_spec.rb +41 -0
  40. data/spec/testcentricity_web/elements/audio_spec.rb +68 -0
  41. data/spec/testcentricity_web/elements/button_spec.rb +18 -0
  42. data/spec/testcentricity_web/elements/checkbox_spec.rb +33 -0
  43. data/spec/testcentricity_web/elements/file_field_spec.rb +13 -0
  44. data/spec/testcentricity_web/elements/image_spec.rb +33 -0
  45. data/spec/testcentricity_web/elements/label_spec.rb +18 -0
  46. data/spec/testcentricity_web/elements/link_spec.rb +23 -0
  47. data/spec/testcentricity_web/elements/list_spec.rb +13 -0
  48. data/spec/testcentricity_web/elements/radio_spec.rb +28 -0
  49. data/spec/testcentricity_web/elements/ui_element_spec.rb +125 -0
  50. data/spec/testcentricity_web/elements/video_spec.rb +68 -0
  51. data/spec/testcentricity_web/helper_specs/object_helpers_spec.rb +39 -0
  52. data/spec/testcentricity_web/helper_specs/string_helpers_spec.rb +49 -0
  53. data/spec/testcentricity_web/page_object_spec.rb +90 -0
  54. data/spec/testcentricity_web/section_object_spec.rb +72 -0
  55. data/spec/testcentricity_web/version_spec.rb +7 -0
  56. data/spec/testcentricity_web/webdriver_connect/grid_webdriver_spec.rb +72 -0
  57. data/spec/testcentricity_web/webdriver_connect/local_webdriver_spec.rb +86 -0
  58. data/spec/testcentricity_web/webdriver_connect/mobile_webdriver_spec.rb +65 -0
  59. data/test_site/basic_test_page.html +2 -2
  60. data/test_site/chosen-sprite.png +0 -0
  61. data/test_site/chosen-sprite@2x.png +0 -0
  62. data/test_site/chosen.css +496 -0
  63. data/test_site/chosen.jquery.js +1359 -0
  64. data/test_site/chosen.jquery.min.js +3 -0
  65. data/test_site/chosen.min.css +11 -0
  66. data/test_site/chosen.proto.js +1399 -0
  67. data/test_site/chosen.proto.min.js +3 -0
  68. data/test_site/composer.json +36 -0
  69. data/test_site/custom_controls_page.html +572 -1
  70. data/test_site/docsupport/chosen.png +0 -0
  71. data/test_site/docsupport/init.js +11 -0
  72. data/test_site/docsupport/init.proto.js +16 -0
  73. data/test_site/docsupport/jquery-1.12.4.min.js +5 -0
  74. data/test_site/docsupport/jquery-3.2.1.min.js +4 -0
  75. data/test_site/docsupport/oss-credit.png +0 -0
  76. data/test_site/docsupport/prism.css +108 -0
  77. data/test_site/docsupport/prism.js +9 -0
  78. data/test_site/docsupport/prototype-1.7.0.0.js +6082 -0
  79. data/test_site/docsupport/style.css +219 -0
  80. data/test_site/images/Blouse_Black.jpg +0 -0
  81. data/test_site/images/Printed_Dress.jpg +0 -0
  82. data/test_site/images/T-shirt.jpg +0 -0
  83. data/test_site/images/jeans3.jpg +0 -0
  84. data/test_site/indexed_sections_page.html +158 -1
  85. data/test_site/media/bbc_scotland_report.mp3 +0 -0
  86. data/test_site/media_page.html +2 -2
  87. data/testcentricity_web.gemspec +14 -8
  88. metadata +158 -13
  89. data/Gemfile.lock +0 -170
@@ -6,8 +6,258 @@ class CustomControlsPage < BaseTestPage
6
6
  trait(:page_url) { '/custom_controls_page.html' }
7
7
  trait(:navigator) { header_nav.open_custom_controls_page }
8
8
  trait(:page_title) { 'Custom Controls Page'}
9
+ trait(:divisions) {
10
+ ['NFC EAST',
11
+ 'NFC NORTH',
12
+ 'NFC SOUTH',
13
+ 'NFC WEST',
14
+ 'AFC EAST',
15
+ 'AFC NORTH',
16
+ 'AFC SOUTH',
17
+ 'AFC WEST']
18
+ }
19
+ trait(:teams) {
20
+ ['Dallas Cowboys',
21
+ 'New York Giants',
22
+ 'Philadelphia Eagles',
23
+ 'Washington Redskins',
24
+ 'Chicago Bears',
25
+ 'Detroit Lions',
26
+ 'Green Bay Packers',
27
+ 'Minnesota Vikings',
28
+ 'Atlanta Falcons',
29
+ 'Carolina Panthers',
30
+ 'New Orleans Saints',
31
+ 'Tampa Bay Buccaneers',
32
+ 'Arizona Cardinals',
33
+ 'St. Louis Rams',
34
+ 'San Francisco 49ers',
35
+ 'Seattle Seahawks',
36
+ 'Buffalo Bills',
37
+ 'Miami Dolphins',
38
+ 'New England Patriots',
39
+ 'New York Jets',
40
+ 'Baltimore Ravens',
41
+ 'Cincinnati Bengals',
42
+ 'Cleveland Browns',
43
+ 'Pittsburgh Steelers',
44
+ 'Houston Texans',
45
+ 'Indianapolis Colts',
46
+ 'Jacksonville Jaguars',
47
+ 'Tennessee Titans',
48
+ 'Denver Broncos',
49
+ 'Kansas City Chiefs',
50
+ 'Oakland Raiders',
51
+ 'San Diego Chargers']
52
+ }
53
+ trait(:countries) { ['United Kingdom', 'Tonga', 'Sweden', 'Peru', 'Belize', 'Mali', 'Ireland'] }
54
+
55
+ # Custom Controls page UI elements
56
+ selectlists country_select: 'div#country_chosen',
57
+ team_select: 'div#team_chosen'
58
+ checkboxes pork_check: "label[for='check1']",
59
+ beef_check: "label[for='check2']",
60
+ chicken_check: "label[for='check3']",
61
+ shrimp_check: "label[for='check4']"
62
+ radios mild_radio: "label[for='radio1']",
63
+ spicey_radio: "label[for='radio2']",
64
+ hot_radio: "label[for='radio3']",
65
+ flaming_radio: "label[for='radio4']"
66
+ tables custom_table: 'div#resp-table'
67
+
68
+ attr_accessor :selected_country
69
+ attr_accessor :selected_team
70
+ attr_accessor :selected_checks
71
+ attr_accessor :selected_radio
72
+
73
+ def initialize
74
+ super
75
+ # define the custom list element components for the Country and Team Chosen selectlists
76
+ list_spec = {
77
+ selected_item: "li[class*='result-selected']",
78
+ list_item: "li[class*='active-result']",
79
+ text_field: 'input.chosen-search-input',
80
+ options_list: 'ul.chosen-results',
81
+ group_item: 'li.group-result',
82
+ group_heading: 'li.group-result'
83
+ }
84
+ country_select.define_list_elements(list_spec)
85
+ team_select.define_list_elements(list_spec)
86
+ # define the custom element components for the checkboxes
87
+ check_spec = { input: "input[type='checkbox']" }
88
+ pork_check.define_custom_elements(check_spec)
89
+ beef_check.define_custom_elements(check_spec)
90
+ chicken_check.define_custom_elements(check_spec)
91
+ shrimp_check.define_custom_elements(check_spec)
92
+ # define the custom element components for the radios
93
+ radio_spec = { input: "input[type='radio']" }
94
+ mild_radio.define_custom_elements(radio_spec)
95
+ spicey_radio.define_custom_elements(radio_spec)
96
+ hot_radio.define_custom_elements(radio_spec)
97
+ flaming_radio.define_custom_elements(radio_spec)
98
+ # define the custom element components for the table
99
+ table_spec = {
100
+ table_body: 'div#resp-table-body',
101
+ table_row: 'div.resp-table-row',
102
+ table_column: 'div.table-body-cell',
103
+ table_header: 'div#resp-table-header',
104
+ header_column: 'div.table-header-cell'
105
+ }
106
+ custom_table.define_table_elements(table_spec)
107
+ end
9
108
 
10
109
  def verify_page_ui
11
110
  super
111
+
112
+ ui = {
113
+ country_select => {
114
+ exists: true,
115
+ visible: true,
116
+ enabled: true,
117
+ optioncount: 251
118
+ },
119
+ team_select => {
120
+ exists: true,
121
+ visible: true,
122
+ enabled: true,
123
+ optioncount: 32,
124
+ options: teams,
125
+ groupcount: 8,
126
+ group_headings: divisions
127
+ },
128
+ pork_check => {
129
+ exists: true,
130
+ visible: true,
131
+ enabled: true,
132
+ checked: true,
133
+ caption: 'Pork'
134
+ },
135
+ beef_check => {
136
+ exists: true,
137
+ visible: true,
138
+ enabled: true,
139
+ checked: false,
140
+ caption: 'Beef'
141
+ },
142
+ chicken_check => {
143
+ exists: true,
144
+ visible: true,
145
+ enabled: true,
146
+ checked: false,
147
+ caption: 'Chicken'
148
+ },
149
+ shrimp_check => {
150
+ exists: true,
151
+ visible: true,
152
+ enabled: true,
153
+ checked: false,
154
+ caption: 'Shrimp'
155
+ },
156
+ mild_radio => {
157
+ exists: true,
158
+ visible: true,
159
+ enabled: true,
160
+ selected: true,
161
+ caption: 'Mild'
162
+ },
163
+ spicey_radio => {
164
+ exists: true,
165
+ visible: true,
166
+ enabled: true,
167
+ selected: false,
168
+ caption: 'Spicey'
169
+ },
170
+ hot_radio => {
171
+ exists: true,
172
+ visible: true,
173
+ enabled: true,
174
+ selected: false,
175
+ caption: 'Hot'
176
+ },
177
+ flaming_radio => {
178
+ exists: true,
179
+ visible: true,
180
+ enabled: true,
181
+ selected: false,
182
+ caption: 'Flaming'
183
+ },
184
+ custom_table => {
185
+ visible: true,
186
+ columncount: 4,
187
+ rowcount: 3,
188
+ { row: 1 } => [['Cell 1–1', 'Cell 1–2', 'Cell 1–3', 'Cell 1–4']],
189
+ { row: 2 } => [['Cell 2–1', 'Cell 2–2', 'Cell 2–3', 'Cell 2–4']],
190
+ { row: 3 } => [['Cell 3–1', 'Cell 3–2', 'Cell 3–3', 'Cell 3–4']],
191
+ { cell: [1, 3] } => ['Cell 1–3'],
192
+ { cell: [2, 4] } => ['Cell 2–4'],
193
+ { column: 3 } => [['Cell 1–3', 'Cell 2–3', 'Cell 3–3']]
194
+ }
195
+ }
196
+ verify_ui_states(ui)
197
+ team_select.verify_options(teams)
198
+ end
199
+
200
+ def populate_form
201
+ @selected_country = countries.sample
202
+ @selected_team = teams.sample
203
+ @selected_checks = [:chicken, :shrimp]
204
+ @selected_radio = 3
205
+ fields = {
206
+ country_select => @selected_country,
207
+ team_select => @selected_team,
208
+ pork_check => @selected_checks.include?(:pork),
209
+ beef_check => @selected_checks.include?(:beef),
210
+ chicken_check => @selected_checks.include?(:chicken),
211
+ shrimp_check => @selected_checks.include?(:shrimp),
212
+ mild_radio => @selected_radio == 1,
213
+ spicey_radio => @selected_radio == 2,
214
+ hot_radio => @selected_radio == 3,
215
+ flaming_radio => @selected_radio == 4
216
+ }
217
+ populate_data_fields(fields)
218
+ end
219
+
220
+ def set_select_options
221
+ @selected_country = countries.sample
222
+ @selected_team = teams.sample
223
+ country_select.set(@selected_country)
224
+ team_select.set(@selected_team)
225
+ end
226
+
227
+ def verify_form_data
228
+ ui = {
229
+ country_select => { selected: @selected_country },
230
+ team_select => { selected: @selected_team },
231
+ pork_check => { checked: @selected_checks.include?(:pork) },
232
+ beef_check => { checked: @selected_checks.include?(:beef) },
233
+ chicken_check => { checked: @selected_checks.include?(:chicken) },
234
+ shrimp_check => { checked: @selected_checks.include?(:shrimp) },
235
+ mild_radio => { selected: @selected_radio == 1 },
236
+ spicey_radio => { selected: @selected_radio == 2 },
237
+ hot_radio => { selected: @selected_radio == 3 },
238
+ flaming_radio => { selected: @selected_radio == 4 }
239
+ }
240
+ verify_ui_states(ui)
241
+ end
242
+
243
+ def choose_options_by(method)
244
+ case method.downcase.to_sym
245
+ when :index
246
+ country_select.choose_option(index: 56)
247
+ team_select.choose_option(index: 20)
248
+ when :text
249
+ country_select.choose_option('Costa Rica')
250
+ team_select.choose_option('Seattle Seahawks')
251
+ else
252
+ raise "#{method} is not a valid selector"
253
+ end
254
+ end
255
+
256
+ def verify_chosen_options
257
+ ui = {
258
+ country_select => { selected: 'Costa Rica' },
259
+ team_select => { selected: 'Seattle Seahawks' }
260
+ }
261
+ verify_ui_states(ui)
12
262
  end
13
263
  end
@@ -7,7 +7,51 @@ class IndexedSectionsPage < BaseTestPage
7
7
  trait(:navigator) { header_nav.open_indexed_sections_page }
8
8
  trait(:page_title) { 'Indexed Sections Page'}
9
9
 
10
+ list :product_list, 'div#product_list'
11
+ section :product_card, ProductCard
12
+
13
+ def initialize
14
+ super
15
+ # define the list item element for the Product list object
16
+ list_elements = { list_item: 'div.column' }
17
+ product_list.define_list_elements(list_elements)
18
+ # associate the Product Card indexed section object with the Product list object
19
+ product_card.set_list_index(product_list)
20
+ end
21
+
10
22
  def verify_page_ui
11
23
  super
24
+
25
+ ui = {
26
+ product_list => {
27
+ exists: true,
28
+ visible: true,
29
+ itemcount: 4
30
+ },
31
+ product_card => { items: ['Tailored Jeans', 'Faded Short Sleeve T-shirts', 'Print Dress', 'Blouse'] }
32
+ }
33
+ verify_ui_states(ui)
34
+ # verify contents of first product card
35
+ product_card.set_list_index(product_list, 1)
36
+ card_data = {
37
+ product_name: 'Tailored Jeans',
38
+ price: '$59.99',
39
+ description: 'Some text about the jeans. Super slim and comfy lorem ipsum lorem jeansum. Lorem jeamsun denim lorem jeansum.',
40
+ rating: 3,
41
+ image_alt: 'Denim Jeans',
42
+ image_src: 'images/jeans3.jpg'
43
+ }
44
+ product_card.verify_card(card_data)
45
+ # verify contents of second product card
46
+ product_card.set_list_index(product_list, 2)
47
+ card_data = {
48
+ product_name: 'Faded Short Sleeve T-shirts',
49
+ price: '$19.99',
50
+ description: "Faded short sleeve t-shirt with high neckline. Soft and stretchy material for a comfortable fit. Accessorize with a straw hat and you're ready for summer!",
51
+ rating: 4,
52
+ image_alt: 'Faded Short Sleeve T-shirts',
53
+ image_src: 'images/T-shirt.jpg'
54
+ }
55
+ product_card.verify_card(card_data)
12
56
  end
13
57
  end
@@ -8,8 +8,8 @@ class MediaTestPage < BaseTestPage
8
8
  trait(:page_title) { 'Media Page'}
9
9
 
10
10
  # Media Test page UI elements
11
- videos video_player_1: 'video#video_player1'
12
- audios audio_player: 'audio#audio_player'
11
+ videos video_player_1: 'video#video_player1'
12
+ audios audio_player: 'audio#audio_player'
13
13
 
14
14
  def verify_page_ui
15
15
  super
@@ -24,7 +24,7 @@ class MediaTestPage < BaseTestPage
24
24
  else
25
25
  'metadata'
26
26
  end
27
- video_player_1.wait_until_ready_state_is(4, 10)
27
+ video_player_1.wait_until_ready_state_is(4, 20)
28
28
  audio_player.wait_until_ready_state_is(4, 10)
29
29
  ui = {
30
30
  video_player_1 => {
@@ -63,8 +63,7 @@ class MediaTestPage < BaseTestPage
63
63
  muted: false,
64
64
  volume: 1,
65
65
  preload: preload,
66
- src: '',
67
- duration: 3.45
66
+ src: ''
68
67
  }
69
68
  }
70
69
  verify_ui_states(ui)
@@ -154,8 +153,8 @@ class MediaTestPage < BaseTestPage
154
153
  playback_rate: rate.to_f,
155
154
  visible: true,
156
155
  paused: false,
157
- current_time: { greater_than: 0 },
158
- seeking: false
156
+ seeking: false,
157
+ current_time: { greater_than: 0 }
159
158
  }
160
159
  }
161
160
  verify_ui_states(ui)
@@ -175,8 +174,8 @@ class MediaTestPage < BaseTestPage
175
174
  visible: true,
176
175
  muted: false,
177
176
  paused: false,
178
- current_time: { greater_than: 0 },
179
- seeking: false
177
+ seeking: false,
178
+ current_time: { greater_than: 0 }
180
179
  }
181
180
  }
182
181
  verify_ui_states(ui)
@@ -193,7 +192,7 @@ class MediaTestPage < BaseTestPage
193
192
  else
194
193
  raise "#{media_type} is not a valid selector"
195
194
  end
196
- player.wait_until_ready_state_is(4, 10)
195
+ player.wait_until_ready_state_is(4, 20)
197
196
  player
198
197
  end
199
198
 
@@ -203,6 +202,6 @@ class MediaTestPage < BaseTestPage
203
202
  player.play
204
203
  player.send_keys(:enter) if player.paused?
205
204
  player.click_at(25, 25) if player.paused?
206
- sleep(1)
205
+ sleep(2)
207
206
  end
208
207
  end
@@ -27,8 +27,17 @@ class NavHeader < TestCentricity::PageSection
27
27
  end
28
28
 
29
29
  def verify_nav_bar
30
+ self.wait_until_visible(5)
30
31
  ui = {
31
- self => { exists: true, visible: true, class: 'topnav' },
32
+ self => {
33
+ exists: true,
34
+ visible: true,
35
+ hidden: false,
36
+ displayed: true,
37
+ enabled: true,
38
+ disabled: false,
39
+ class: 'topnav'
40
+ },
32
41
  form_link => { visible: true, caption: 'Basic HTML Form' },
33
42
  media_link => { visible: true, caption: 'Media' },
34
43
  indexed_sections_link => { visible: true, caption: 'Indexed Sections' },
@@ -0,0 +1,39 @@
1
+ # Section Object class definition for Product Card
2
+
3
+ class ProductCard < TestCentricity::PageSection
4
+ trait(:section_locator) { 'div.column' }
5
+ trait(:section_name) { 'Product Card' }
6
+
7
+ # Product Card UI elements
8
+ image :product_image, "img[data-test-id='product_image']"
9
+ labels name_label: "h1[data-test-id='product_name']",
10
+ price_label: "p[data-test-id='price']",
11
+ description_label: "p[data-test-id='description']"
12
+ elements ratings: "div[data-test-id='rating']",
13
+ checked_star: 'span.fa.fa-star.checked'
14
+ button :add_to_cart_button, "button[data-test-id='add_to_cart']"
15
+
16
+ def get_value
17
+ name_label.get_caption
18
+ end
19
+
20
+ def verify_card(card_data)
21
+ ui = {
22
+ product_image => {
23
+ visible: true,
24
+ loaded: true,
25
+ broken: false,
26
+ src: { ends_with: card_data[:image_src] },
27
+ alt: card_data[:image_alt]
28
+ },
29
+ name_label => { visible: true, caption: card_data[:product_name] },
30
+ price_label => { visible: true, caption: card_data[:price] },
31
+ description_label => { visible: true, caption: card_data[:description] },
32
+ checked_star => { count: card_data[:rating] },
33
+ add_to_cart_button => { visible: true, enabled: true, caption: 'Add to Cart' }
34
+ }
35
+ within(self.get_locator) do
36
+ verify_ui_states(ui)
37
+ end
38
+ end
39
+ end
@@ -95,12 +95,6 @@ module TestCentricity
95
95
  Capybara.page.driver.browser.switch_to.window(Capybara.page.driver.browser.window_handles.last)
96
96
  end
97
97
 
98
- def self.close_named_browser_instance(name)
99
- Capybara.page.driver.browser.switch_to.window(Capybara.page.driver.find_window(name))
100
- Capybara.page.driver.browser.close
101
- Capybara.page.driver.browser.switch_to.window(Capybara.page.driver.browser.window_handles.last)
102
- end
103
-
104
98
  def self.suppress_js_alerts
105
99
  Capybara.page.execute_script('window.alert = function() {}')
106
100
  end
@@ -1,3 +1,3 @@
1
1
  module TestCentricityWeb
2
- VERSION = '4.1.8'
2
+ VERSION = '4.1.9'
3
3
  end
@@ -298,7 +298,7 @@ module TestCentricity
298
298
  def populate_data_fields(data, wait_time = nil, integrity_check = false)
299
299
  timeout = wait_time.nil? ? 5 : wait_time
300
300
  data.each do |data_field, data_param|
301
- unless data_param.blank?
301
+ unless data_param != false && data_param.blank?
302
302
  # make sure the intended UI target element is visible before trying to set its value
303
303
  data_field.wait_until_visible(timeout)
304
304
  if data_param == '!DELETE'
@@ -234,7 +234,7 @@ module TestCentricity
234
234
  # radio :accept_terms_radio, "//input[@id='Accept_Terms']"
235
235
  # radio :decline_terms_radio, 'input#decline_terms_conditions'
236
236
  #
237
- def self.radio(element_name, locator, proxy = nil)
237
+ def self.radio(element_name, locator)
238
238
  define_element(element_name, TestCentricity::Radio, locator)
239
239
  end
240
240
 
@@ -267,6 +267,50 @@ module TestCentricity
267
267
  Capybara.default_driver = :selenium
268
268
  end
269
269
 
270
+ def self.initialize_remote
271
+ Environ.grid = :selenium_grid
272
+ browser = ENV['WEB_BROWSER'].downcase.to_sym
273
+ @endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub' if @endpoint.nil?
274
+
275
+ case browser
276
+ when :safari
277
+ options = Selenium::WebDriver::Safari::Options.new
278
+ when :ie
279
+ options = Selenium::WebDriver::IE::Options.new
280
+ when :firefox, :firefox_headless
281
+ options = firefox_options(browser)
282
+ when :chrome, :chrome_headless, :edge, :edge_headless
283
+ options = chrome_edge_options(browser)
284
+ else
285
+ if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
286
+ Environ.platform = :mobile
287
+ Environ.device_name = Browsers.mobile_device_name(ENV['WEB_BROWSER'])
288
+ user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
289
+ options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
290
+ options.add_argument('--disable-dev-shm-usage')
291
+ options.add_argument("--user-agent='#{user_agent}'")
292
+ options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
293
+ else
294
+ raise "Requested browser '#{browser}' is not supported on Selenium Grid"
295
+ end
296
+ end
297
+
298
+ Capybara.register_driver :remote_browser do |app|
299
+ Capybara::Selenium::Driver.new(app,
300
+ browser: :remote,
301
+ url: @endpoint,
302
+ capabilities: [options]).tap do |driver|
303
+ # configure file_detector for remote uploads
304
+ driver.browser.file_detector = lambda do |args|
305
+ str = args.first.to_s
306
+ str if File.exist?(str)
307
+ end
308
+ end
309
+ end
310
+ Capybara.current_driver = :remote_browser
311
+ Capybara.default_driver = :remote_browser
312
+ end
313
+
270
314
  # :nocov:
271
315
  def self.initialize_browserstack
272
316
  browser = ENV['BS_BROWSER']
@@ -414,50 +458,6 @@ module TestCentricity
414
458
  config_file_uploads
415
459
  end
416
460
 
417
- def self.initialize_remote
418
- Environ.grid = :selenium_grid
419
- browser = ENV['WEB_BROWSER'].downcase.to_sym
420
- @endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub' if @endpoint.nil?
421
-
422
- case browser
423
- when :safari
424
- options = Selenium::WebDriver::Safari::Options.new
425
- when :ie
426
- options = Selenium::WebDriver::IE::Options.new
427
- when :firefox, :firefox_headless
428
- options = firefox_options(browser)
429
- when :chrome, :chrome_headless, :edge, :edge_headless
430
- options = chrome_edge_options(browser)
431
- else
432
- if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
433
- Environ.platform = :mobile
434
- Environ.device_name = Browsers.mobile_device_name(ENV['WEB_BROWSER'])
435
- user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
436
- options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
437
- options.add_argument('--disable-dev-shm-usage')
438
- options.add_argument("--user-agent='#{user_agent}'")
439
- options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
440
- else
441
- raise "Requested browser '#{browser}' is not supported on Selenium Grid"
442
- end
443
- end
444
-
445
- Capybara.register_driver :remote_browser do |app|
446
- Capybara::Selenium::Driver.new(app,
447
- browser: :remote,
448
- url: @endpoint,
449
- capabilities: [options]).tap do |driver|
450
- # configure file_detector for remote uploads
451
- driver.browser.file_detector = lambda do |args|
452
- str = args.first.to_s
453
- str if File.exist?(str)
454
- end
455
- end
456
- end
457
- Capybara.current_driver = :remote_browser
458
- Capybara.default_driver = :remote_browser
459
- end
460
-
461
461
  def self.initialize_saucelabs
462
462
  browser = ENV['SL_BROWSER']
463
463
  Environ.grid = :saucelabs