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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +2 -1
- data/.ruby-version +1 -0
- data/CHANGELOG.md +13 -0
- data/README.md +11 -12
- data/Rakefile +93 -64
- data/config/cucumber.yml +1 -0
- data/config/locales/en-US.yml +56 -0
- data/{docker-compose-v3.yml → docker-compose.yml} +2 -2
- data/features/basic_form_page_css.feature +16 -1
- data/features/custom_controls.feature +29 -0
- data/features/media_players.feature +3 -20
- data/features/step_definitions/generic_steps.rb.rb +15 -0
- data/features/support/env.rb +3 -2
- data/features/support/hooks.rb +8 -3
- data/features/support/pages/base_test_page.rb +1 -1
- data/features/support/pages/basic_css_form_page.rb +1 -0
- data/features/support/pages/basic_form_page.rb +45 -9
- data/features/support/pages/basic_xpath_form_page.rb +1 -0
- data/features/support/pages/custom_controls_page.rb +250 -0
- data/features/support/pages/indexed_sections_page.rb +44 -0
- data/features/support/pages/media_test_page.rb +10 -11
- data/features/support/sections/header_nav.rb +10 -1
- data/features/support/sections/product_card.rb +39 -0
- data/lib/testcentricity_web/browser_helper.rb +0 -6
- data/lib/testcentricity_web/version.rb +1 -1
- data/lib/testcentricity_web/web_core/page_objects_helper.rb +1 -1
- data/lib/testcentricity_web/web_core/page_section.rb +1 -1
- data/lib/testcentricity_web/web_core/webdriver_helper.rb +44 -44
- data/lib/testcentricity_web/web_elements/checkbox.rb +50 -19
- data/lib/testcentricity_web/web_elements/media.rb +1 -1
- data/lib/testcentricity_web/web_elements/radio.rb +50 -19
- data/lib/testcentricity_web/web_elements/select_list.rb +12 -12
- data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +3 -3
- data/spec/fixtures/page_object.rb +22 -0
- data/spec/fixtures/section_object.rb +21 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/testcentricity_web/browser_spec.rb +41 -0
- data/spec/testcentricity_web/elements/audio_spec.rb +68 -0
- data/spec/testcentricity_web/elements/button_spec.rb +18 -0
- data/spec/testcentricity_web/elements/checkbox_spec.rb +33 -0
- data/spec/testcentricity_web/elements/file_field_spec.rb +13 -0
- data/spec/testcentricity_web/elements/image_spec.rb +33 -0
- data/spec/testcentricity_web/elements/label_spec.rb +18 -0
- data/spec/testcentricity_web/elements/link_spec.rb +23 -0
- data/spec/testcentricity_web/elements/list_spec.rb +13 -0
- data/spec/testcentricity_web/elements/radio_spec.rb +28 -0
- data/spec/testcentricity_web/elements/ui_element_spec.rb +125 -0
- data/spec/testcentricity_web/elements/video_spec.rb +68 -0
- data/spec/testcentricity_web/helper_specs/object_helpers_spec.rb +39 -0
- data/spec/testcentricity_web/helper_specs/string_helpers_spec.rb +49 -0
- data/spec/testcentricity_web/page_object_spec.rb +90 -0
- data/spec/testcentricity_web/section_object_spec.rb +72 -0
- data/spec/testcentricity_web/version_spec.rb +7 -0
- data/spec/testcentricity_web/webdriver_connect/grid_webdriver_spec.rb +72 -0
- data/spec/testcentricity_web/webdriver_connect/local_webdriver_spec.rb +86 -0
- data/spec/testcentricity_web/webdriver_connect/mobile_webdriver_spec.rb +65 -0
- data/test_site/basic_test_page.html +2 -2
- data/test_site/chosen-sprite.png +0 -0
- data/test_site/chosen-sprite@2x.png +0 -0
- data/test_site/chosen.css +496 -0
- data/test_site/chosen.jquery.js +1359 -0
- data/test_site/chosen.jquery.min.js +3 -0
- data/test_site/chosen.min.css +11 -0
- data/test_site/chosen.proto.js +1399 -0
- data/test_site/chosen.proto.min.js +3 -0
- data/test_site/composer.json +36 -0
- data/test_site/custom_controls_page.html +572 -1
- data/test_site/docsupport/chosen.png +0 -0
- data/test_site/docsupport/init.js +11 -0
- data/test_site/docsupport/init.proto.js +16 -0
- data/test_site/docsupport/jquery-1.12.4.min.js +5 -0
- data/test_site/docsupport/jquery-3.2.1.min.js +4 -0
- data/test_site/docsupport/oss-credit.png +0 -0
- data/test_site/docsupport/prism.css +108 -0
- data/test_site/docsupport/prism.js +9 -0
- data/test_site/docsupport/prototype-1.7.0.0.js +6082 -0
- data/test_site/docsupport/style.css +219 -0
- data/test_site/images/Blouse_Black.jpg +0 -0
- data/test_site/images/Printed_Dress.jpg +0 -0
- data/test_site/images/T-shirt.jpg +0 -0
- data/test_site/images/jeans3.jpg +0 -0
- data/test_site/indexed_sections_page.html +158 -1
- data/test_site/media/bbc_scotland_report.mp3 +0 -0
- data/test_site/media_page.html +2 -2
- data/testcentricity_web.gemspec +14 -8
- metadata +158 -13
- 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
|
|
12
|
-
audios
|
|
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,
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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,
|
|
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(
|
|
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 => {
|
|
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
|
|
@@ -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
|
|
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
|