testcentricity_web 4.1.3 → 4.1.6

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -0
  3. data/.simplecov +5 -0
  4. data/CHANGELOG.md +30 -1
  5. data/Gemfile.lock +170 -0
  6. data/README.md +287 -102
  7. data/Rakefile +37 -1
  8. data/config/cucumber.yml +150 -0
  9. data/docker-compose-v3.yml +48 -0
  10. data/features/basic_test_page_css.feature +24 -0
  11. data/features/basic_test_page_xpath.feature +24 -0
  12. data/features/step_definitions/generic_steps.rb.rb +37 -0
  13. data/features/support/env.rb +43 -0
  14. data/features/support/hooks.rb +245 -0
  15. data/features/support/pages/basic_css_test_page.rb +49 -0
  16. data/features/support/pages/basic_test_page.rb +238 -0
  17. data/features/support/pages/basic_xpath_test_page.rb +49 -0
  18. data/features/support/pages/media_page.rb +11 -0
  19. data/features/support/world_pages.rb +15 -0
  20. data/lib/testcentricity_web/data_objects/environment.rb +4 -0
  21. data/lib/testcentricity_web/version.rb +1 -1
  22. data/lib/testcentricity_web/web_core/page_object.rb +13 -6
  23. data/lib/testcentricity_web/web_core/page_objects_helper.rb +41 -8
  24. data/lib/testcentricity_web/web_core/page_section.rb +1 -16
  25. data/lib/testcentricity_web/web_core/webdriver_helper.rb +78 -120
  26. data/lib/testcentricity_web/web_elements/select_list.rb +18 -7
  27. data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +13 -0
  28. data/reports/.keep +1 -0
  29. data/test_site/basic_test_page.html +240 -0
  30. data/test_site/images/Granny.jpg +0 -0
  31. data/test_site/images/Wilder.jpg +0 -0
  32. data/test_site/images/You_Betcha.jpg +0 -0
  33. data/test_site/media/MP4_small.mp4 +0 -0
  34. data/test_site/media/MPS_sample.mp3 +0 -0
  35. data/test_site/media_page.html +33 -0
  36. data/testcentricity_web.gemspec +5 -0
  37. metadata +105 -4
  38. data/test_site/test_page.html +0 -11
@@ -49,7 +49,7 @@ module TestCentricity
49
49
  context = case browser.downcase.to_sym
50
50
  when :appium
51
51
  initialize_appium
52
- 'mobile device emulator'
52
+ 'Appium'
53
53
  when :browserstack
54
54
  initialize_browserstack
55
55
  'Browserstack cloud service'
@@ -137,7 +137,7 @@ module TestCentricity
137
137
  Environ.device_os_version = ENV['APP_VERSION']
138
138
  Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
139
139
  Capybara.default_driver = :appium
140
- @endpoint = 'http://localhost:4723/wd/hub' if @endpoint.nil?
140
+ Environ.driver = :appium
141
141
  desired_capabilities = {
142
142
  platformName: Environ.device_os,
143
143
  platformVersion: Environ.device_os_version,
@@ -189,14 +189,13 @@ module TestCentricity
189
189
  desired_capabilities[:systemPort] = ENV['SYSTEM_PORT'] if ENV['SYSTEM_PORT']
190
190
  end
191
191
 
192
- unless @capabilities.nil?
193
- desired_capabilities = @capabilities
194
- end
192
+ desired_capabilities = @capabilities unless @capabilities.nil?
193
+ # specify endpoint url
194
+ @endpoint = 'http://localhost:4723/wd/hub' if @endpoint.nil?
195
195
 
196
- Capybara.register_driver :appium do |app|
197
- appium_lib_options = { server_url: @endpoint }
196
+ Capybara.register_driver(:appium) do |app|
198
197
  all_options = {
199
- appium_lib: appium_lib_options,
198
+ appium_lib: { server_url: @endpoint },
200
199
  caps: desired_capabilities
201
200
  }
202
201
  Appium::Capybara::Driver.new(app, all_options)
@@ -232,63 +231,18 @@ module TestCentricity
232
231
  when :safari, :ie
233
232
  Capybara::Selenium::Driver.new(app, browser: browser)
234
233
  when :firefox, :firefox_headless
235
- profile = Selenium::WebDriver::Firefox::Profile.new
236
- profile['browser.download.dir'] = @downloads_path
237
- profile['browser.download.folderList'] = 2
238
- profile['browser.download.manager.showWhenStarting'] = false
239
- profile['browser.download.manager.closeWhenDone'] = true
240
- profile['browser.download.manager.showAlertOnComplete'] = false
241
- profile['browser.download.manager.alertOnEXEOpen'] = false
242
- profile['browser.download.manager.useWindow'] = false
243
- profile['browser.helperApps.alwaysAsk.force'] = false
244
- profile['pdfjs.disabled'] = true
245
-
246
- mime_types = ENV['MIME_TYPES'] || 'images/jpeg, application/pdf, application/octet-stream'
247
- profile['browser.helperApps.neverAsk.saveToDisk'] = mime_types
248
-
249
- profile['intl.accept_languages'] = ENV['LOCALE'] if ENV['LOCALE']
250
- options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
251
- options.args << '--headless' if browser == :firefox_headless
234
+ options = firefox_options(browser)
252
235
  Capybara::Selenium::Driver.new(app, browser: :firefox, capabilities: [options])
253
236
  when :chrome, :chrome_headless
254
- options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
255
- prefs = {
256
- prompt_for_download: false,
257
- directory_upgrade: true,
258
- default_directory: @downloads_path
259
- }
260
- options.add_preference(:download, prefs)
261
- options.add_argument('--disable-dev-shm-usage')
262
- options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
263
- if browser == :chrome_headless
264
- options.add_argument('--headless')
265
- options.add_argument('--disable-gpu')
266
- options.add_argument('--no-sandbox')
267
- end
268
-
237
+ options = chrome_edge_options(browser)
269
238
  Capybara::Selenium::Driver.new(app, browser: :chrome, capabilities: [options])
270
239
  when :edge, :edge_headless
271
- options = Selenium::WebDriver::Edge::Options.new(options: {'excludeSwitches' => ['enable-automation']})
272
- prefs = {
273
- prompt_for_download: false,
274
- directory_upgrade: true,
275
- default_directory: @downloads_path
276
- }
277
- options.add_preference(:download, prefs)
278
- options.add_argument('--disable-dev-shm-usage')
279
- options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
280
- if browser == :edge_headless
281
- options.add_argument('--headless')
282
- options.add_argument('--disable-gpu')
283
- options.add_argument('--no-sandbox')
284
- end
285
-
240
+ options = chrome_edge_options(browser)
286
241
  Capybara::Selenium::Driver.new(app, browser: :edge, capabilities: [options])
287
242
  else
288
243
  if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
289
244
  user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
290
245
  options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
291
- options.add_argument('--disable-infobars')
292
246
  options.add_argument('--disable-dev-shm-usage')
293
247
  options.add_argument("--user-agent='#{user_agent}'")
294
248
  options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
@@ -451,74 +405,31 @@ module TestCentricity
451
405
  Environ.grid = :selenium_grid
452
406
  browser = ENV['WEB_BROWSER'].downcase.to_sym
453
407
  @endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub' if @endpoint.nil?
454
- Capybara.register_driver :remote_browser do |app|
455
- case browser
456
- when :safari
457
- options = Selenium::WebDriver::Safari::Options.new
458
- when :ie
459
- options = Selenium::WebDriver::IE::Options.new
460
- when :firefox, :firefox_headless
461
- profile = Selenium::WebDriver::Firefox::Profile.new
462
- profile['browser.download.dir'] = @downloads_path
463
- profile['browser.download.folderList'] = 2
464
- profile['browser.download.manager.showWhenStarting'] = false
465
- profile['browser.download.manager.closeWhenDone'] = true
466
- profile['browser.download.manager.showAlertOnComplete'] = false
467
- profile['browser.download.manager.alertOnEXEOpen'] = false
468
- profile['browser.download.manager.useWindow'] = false
469
- profile['browser.helperApps.alwaysAsk.force'] = false
470
- profile['pdfjs.disabled'] = true
471
-
472
- mime_types = ENV['MIME_TYPES'] || 'images/jpeg, application/pdf, application/octet-stream'
473
- profile['browser.helperApps.neverAsk.saveToDisk'] = mime_types
474
-
475
- profile['intl.accept_languages'] = ENV['LOCALE'] if ENV['LOCALE']
476
- options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
477
- options.args << '--headless' if browser == :firefox_headless
478
- when :chrome, :chrome_headless
408
+
409
+ case browser
410
+ when :safari
411
+ options = Selenium::WebDriver::Safari::Options.new
412
+ when :ie
413
+ options = Selenium::WebDriver::IE::Options.new
414
+ when :firefox, :firefox_headless
415
+ options = firefox_options(browser)
416
+ when :chrome, :chrome_headless, :edge, :edge_headless
417
+ options = chrome_edge_options(browser)
418
+ else
419
+ if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
420
+ Environ.platform = :mobile
421
+ Environ.device_name = Browsers.mobile_device_name(ENV['WEB_BROWSER'])
422
+ user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
479
423
  options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
480
- prefs = {
481
- prompt_for_download: false,
482
- directory_upgrade: true,
483
- default_directory: @downloads_path
484
- }
485
- options.add_preference(:download, prefs)
486
- options.add_argument('--disable-dev-shm-usage')
487
- options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
488
- if browser == :chrome_headless
489
- options.add_argument('--headless')
490
- options.add_argument('--disable-gpu')
491
- options.add_argument('--no-sandbox')
492
- end
493
- when :edge, :edge_headless
494
- options = Selenium::WebDriver::Edge::Options.new(options: {'excludeSwitches' => ['enable-automation']})
495
- prefs = {
496
- prompt_for_download: false,
497
- directory_upgrade: true,
498
- default_directory: @downloads_path
499
- }
500
- options.add_preference(:download, prefs)
501
424
  options.add_argument('--disable-dev-shm-usage')
425
+ options.add_argument("--user-agent='#{user_agent}'")
502
426
  options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
503
- if browser == :edge_headless
504
- options.add_argument('--headless')
505
- options.add_argument('--disable-gpu')
506
- options.add_argument('--no-sandbox')
507
- end
508
427
  else
509
- if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
510
- Environ.platform = :mobile
511
- Environ.device_name = Browsers.mobile_device_name(ENV['WEB_BROWSER'])
512
- user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
513
- options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
514
- options.add_argument('--disable-infobars')
515
- options.add_argument('--disable-dev-shm-usage')
516
- options.add_argument("--user-agent='#{user_agent}'")
517
- options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
518
- else
519
- raise "Requested browser '#{browser}' is not supported on Selenium Grid"
520
- end
428
+ raise "Requested browser '#{browser}' is not supported on Selenium Grid"
521
429
  end
430
+ end
431
+
432
+ Capybara.register_driver :remote_browser do |app|
522
433
  Capybara::Selenium::Driver.new(app,
523
434
  browser: :remote,
524
435
  url: @endpoint,
@@ -644,6 +555,50 @@ module TestCentricity
644
555
  config_file_uploads unless ENV['TB_PLATFORM']
645
556
  end
646
557
 
558
+ def self.chrome_edge_options(browser)
559
+ options = case browser
560
+ when :chrome, :chrome_headless
561
+ Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
562
+ when :edge, :edge_headless
563
+ Selenium::WebDriver::Edge::Options.new(options: {'excludeSwitches' => ['enable-automation']})
564
+ end
565
+ prefs = {
566
+ prompt_for_download: false,
567
+ directory_upgrade: true,
568
+ default_directory: @downloads_path
569
+ }
570
+ options.add_preference(:download, prefs)
571
+ options.add_argument('--disable-dev-shm-usage')
572
+ options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
573
+ if browser == :chrome_headless || browser == :edge_headless
574
+ options.add_argument('--headless')
575
+ options.add_argument('--disable-gpu')
576
+ options.add_argument('--no-sandbox')
577
+ end
578
+ options
579
+ end
580
+
581
+ def self.firefox_options(browser)
582
+ profile = Selenium::WebDriver::Firefox::Profile.new
583
+ profile['browser.download.dir'] = @downloads_path
584
+ profile['browser.download.folderList'] = 2
585
+ profile['browser.download.manager.showWhenStarting'] = false
586
+ profile['browser.download.manager.closeWhenDone'] = true
587
+ profile['browser.download.manager.showAlertOnComplete'] = false
588
+ profile['browser.download.manager.alertOnEXEOpen'] = false
589
+ profile['browser.download.manager.useWindow'] = false
590
+ profile['browser.helperApps.alwaysAsk.force'] = false
591
+ profile['pdfjs.disabled'] = true
592
+
593
+ mime_types = ENV['MIME_TYPES'] || 'images/jpeg, application/pdf, application/octet-stream'
594
+ profile['browser.helperApps.neverAsk.saveToDisk'] = mime_types
595
+
596
+ profile['intl.accept_languages'] = ENV['LOCALE'] if ENV['LOCALE']
597
+ options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
598
+ options.args << '--headless' if browser == :firefox_headless
599
+ options
600
+ end
601
+
647
602
  def self.test_context_message
648
603
  context_message = if ENV['TEST_CONTEXT']
649
604
  "#{Environ.test_environment.to_s.upcase} - #{ENV['TEST_CONTEXT']}"
@@ -661,7 +616,10 @@ module TestCentricity
661
616
  def self.register_remote_driver(driver, browser, options)
662
617
  Capybara.register_driver driver do |app|
663
618
  capabilities = Selenium::WebDriver::Remote::Capabilities.send(browser.gsub(/\s+/, '_').downcase.to_sym, options)
664
- Capybara::Selenium::Driver.new(app, browser: :remote, url: @endpoint, capabilities: capabilities)
619
+ Capybara::Selenium::Driver.new(app,
620
+ browser: :remote,
621
+ url: @endpoint,
622
+ capabilities: capabilities)
665
623
  end
666
624
 
667
625
  Environ.browser = browser
@@ -246,13 +246,24 @@ module TestCentricity
246
246
  def get_selected_option
247
247
  @base_object, = find_element
248
248
  object_not_found_exception(@base_object, nil)
249
- if @base_object.first(:css, @list_item, minimum: 0)
250
- @base_object.first(:css, @selected_item).text
251
- elsif @base_object.first(:css, @selected_item, minimum: 0)
252
- @base_object.first(:css, @selected_item).text
253
- else
254
- @base_object.first('option[selected]', visible: :all).text
255
- end
249
+ trigger_list unless @options_list.nil?
250
+ selection = if @base_object.first(:css, @list_item, minimum: 0, wait: 1, visible: :all)
251
+ @base_object.first(:css, @selected_item, wait: 1, visible: :all).text
252
+ elsif @base_object.first(:css, @selected_item, minimum: 0, wait: 1, visible: :all)
253
+ @base_object.first(:css, @selected_item, visible: :all).text
254
+ elsif @base_object.first('option[selected]', minimum: 0, wait: 1, visible: :all)
255
+ @base_object.first('option[selected]', wait: 1, visible: :all).text
256
+ else
257
+ index = get_attribute(:selectedIndex).to_i
258
+ if index >= 0
259
+ options = get_options
260
+ options[index]
261
+ else
262
+ ''
263
+ end
264
+ end
265
+ trigger_list unless @options_list.nil?
266
+ selection
256
267
  end
257
268
 
258
269
  alias selected? get_selected_option
@@ -264,6 +264,19 @@ module TestCentricity
264
264
  obj.disabled?
265
265
  end
266
266
 
267
+ # Is UI object's required attribute set?
268
+ #
269
+ # @return [Boolean]
270
+ # @example
271
+ # first_name_field.required?
272
+ #
273
+ def required?
274
+ obj, type = find_element
275
+ object_not_found_exception(obj, type)
276
+ state = get_attribute(:required)
277
+ state.boolean? ? state : state == 'true'
278
+ end
279
+
267
280
  # Is UI object obscured (not currently in viewport and not clickable)?
268
281
  #
269
282
  # @return [Boolean]
data/reports/.keep ADDED
@@ -0,0 +1 @@
1
+ Placeholder file to allow the reports folder to be saved to repository. This folder is required for Jenkins test jobs using the Cucumber Reporting plug-in.
@@ -0,0 +1,240 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Basic HTML Form</title>
6
+ <style>
7
+ table {
8
+ font-family: arial, sans-serif;
9
+ font-size: 15px;
10
+ border-collapse: collapse;
11
+ width: 85%;
12
+ }
13
+ td, th {
14
+ border: 1px solid #dddddd;
15
+ text-align: left;
16
+ padding: 8px;
17
+ }
18
+ </style>
19
+ </head>
20
+ <body>
21
+ <div class="page-body">
22
+ <h1>Basic HTML Form Example</h1>
23
+ <div class="centered">
24
+ <form name="HTMLFormElements" id="HTMLFormElements">
25
+ <table border="1" cellpadding="5">
26
+ <tr>
27
+ <td>
28
+ <table>
29
+ <label id="inputs">Inputs:</label>
30
+ <tbody>
31
+ <tr>
32
+ <td>
33
+ <label for="username">Username:</label>
34
+ <input type="text" id="username" name="username" placeholder="User name" required>
35
+ </td>
36
+ <td>
37
+ <label for="password">Password:</label>
38
+ <input type="password" id="password" name="password" placeholder="Password" required>
39
+ </td>
40
+ <td>
41
+ <label for="maxlength">Max Length:</label>
42
+ <input type="text" id="maxlength" name="maxlength" placeholder="up to 64 characters" maxlength="64">
43
+ </td>
44
+ </tr>
45
+ <tr>
46
+ <td>
47
+ <label for="readonly">Read Only:</label>
48
+ <input type="text" id="readonly" name="readonly" value="I am a read only text field" readonly>
49
+ </td>
50
+ <td>
51
+ <label for="number-field">Number:</label>
52
+ <input id="number-field" type="number" name="number" min="10" max="1024" step="1" value="41">
53
+ </td>
54
+ <td>
55
+ <label for="color-picker">Color: </label>
56
+ <input id="color-picker" type="color" name="color">
57
+ </td>
58
+ </tr>
59
+ <tr>
60
+ <td>
61
+ <label for="slider">Range: </label>
62
+ <input id="slider" type="range" name="slider" min="0" max="50">
63
+ </td>
64
+ <td>
65
+ </td>
66
+ <td>
67
+ </td>
68
+ </tr>
69
+ </tbody>
70
+ </table>
71
+ </td>
72
+ </tr>
73
+
74
+
75
+ <tr>
76
+ <td>
77
+ <label for="comments">TextArea:</label>
78
+ <textarea id="comments" name="comments" cols="80" rows="3"></textarea>
79
+ </td>
80
+ </tr>
81
+
82
+ <tr>
83
+ <td>
84
+ <label for="filename">Filename:</label>
85
+ <input type="file" id="filename" name="filename" size="35">
86
+ </td>
87
+ </tr>
88
+
89
+ <tr>
90
+ <td>
91
+ <label id="checkboxes">Checkbox Items:</label>
92
+ <input type="checkbox" id="check1" name="checkboxes[]" value="cb1" />Checkbox 1
93
+ <input type="checkbox" id="check2" name="checkboxes[]" value="cb2" />Checkbox 2
94
+ <input type="checkbox" id="check3" name="checkboxes[]" value="cb3" />Checkbox 3
95
+ <input type="checkbox" id="check4" name="checkboxes[]" value="cb4" disabled/>Checkbox 4
96
+ </td>
97
+ </tr>
98
+
99
+ <tr>
100
+ <td>
101
+ <label id="radios">Radio Items:</label>
102
+ <input type="radio" id="radio1" name="radioval" value="rd1" />radio 1
103
+ <input type="radio" id="radio2" name="radioval" value="rd2" />radio 2
104
+ <input type="radio" id="radio3" name="radioval" value="rd3" />radio 3
105
+ <input type="radio" id="radio4" name="radioval" value="rd4" disabled/>radio 4
106
+ </td>
107
+ </tr>
108
+
109
+ <tr>
110
+ <td>
111
+ <label for="multipleselect">Multiple Select Values:</label>
112
+ <select multiple="multiple" id="multipleselect" name="multipleselect" size="4">
113
+ <option value="ms1">Selection Item 1</option>
114
+ <option value="ms2">Selection Item 2</option>
115
+ <option value="ms3">Selection Item 3</option>
116
+ <option value="ms4">Selection Item 4</option>
117
+ </select>
118
+ </td>
119
+ </tr>
120
+
121
+ <tr>
122
+ <td>
123
+ <label for="dropdown">Dropdown:</label>
124
+ <select id="dropdown" name="dropdown">
125
+ <option value="dd1">Drop Down Item 1</option>
126
+ <option value="dd2">Drop Down Item 2</option>
127
+ <option value="dd3">Drop Down Item 3</option>
128
+ <option value="dd4">Drop Down Item 4</option>
129
+ <option value="dd5">Drop Down Item 5</option>
130
+ <option value="dd6">Drop Down Item 6</option>
131
+ </select>
132
+ </td>
133
+ </tr>
134
+
135
+ <tr>
136
+ <td>
137
+ <label for="table">Table:</label>
138
+ <table id="table">
139
+ <thead>
140
+ <tr>
141
+ <th>Company</th>
142
+ <th>Contact</th>
143
+ <th>Country</th>
144
+ </tr>
145
+ </thead>
146
+ <tbody>
147
+ <tr>
148
+ <td>Alfreds Futterkiste</td>
149
+ <td>Maria Anders</td>
150
+ <td>Germany</td>
151
+ </tr>
152
+ <tr>
153
+ <td>Centro comercial Moctezuma</td>
154
+ <td>Francisco Chang</td>
155
+ <td>Mexico</td>
156
+ </tr>
157
+ <tr>
158
+ <td>Ernst Handel</td>
159
+ <td>Roland Mendel</td>
160
+ <td>Austria</td>
161
+ </tr>
162
+ <tr>
163
+ <td>Island Trading</td>
164
+ <td>Helen Bennett</td>
165
+ <td>UK</td>
166
+ </tr>
167
+ </tbody>
168
+ </table>
169
+ </td>
170
+ </tr>
171
+
172
+ <tr>
173
+ <td>
174
+ <table>
175
+ <label id="images">Images:</label>
176
+ <tbody>
177
+ <tr>
178
+ <td>
179
+ <img id="image1" src="images/Wilder.jpg" alt="It's alive" style="width:225px;height:225px;">
180
+ </td>
181
+ <td>
182
+ <img id="image2" src="images/You_Betcha.jpg" alt="You Betcha" style="width:225px;height:225px;">
183
+ </td>
184
+ <td>
185
+ <img id="image3" src="wrongname.gif" alt="A broken image" style="width:225px;height:225px;">
186
+ </td>
187
+ </tr>
188
+ </tbody>
189
+ </table>
190
+ </td>
191
+ </tr>
192
+
193
+
194
+
195
+ <!-- <tr>-->
196
+ <!-- <td>-->
197
+ <!-- <div class="form-label">-->
198
+ <!-- <label for="date-picker">Date: </label>-->
199
+ <!-- <input id="date-picker" type="date" name="date">-->
200
+ <!-- </div>-->
201
+ <!-- </td>-->
202
+ <!-- </tr>-->
203
+ <!-- <tr>-->
204
+ <!-- <td>-->
205
+ <!-- <div class="form-label">-->
206
+ <!-- <label for="date-time-picker">Local date time:</label>-->
207
+ <!-- <input id="date-time-picker" type="datetime-local" name="datetime" value="2018-01-01T01:01">-->
208
+ <!-- </div>-->
209
+ <!-- </td>-->
210
+ <!-- </tr>-->
211
+ <!-- <tr>-->
212
+ <!-- <td>-->
213
+ <!-- <div class="form-label">-->
214
+ <!-- <label for="email-field">Email: </label>-->
215
+ <!-- <input id="email-field" type="email" name="email" value="bob@mailinator.com">-->
216
+ <!-- </div>-->
217
+ <!-- </td>-->
218
+ <!-- </tr>-->
219
+ <!-- <tr>-->
220
+ <!-- <td>-->
221
+ <!-- <div class="form-label">-->
222
+ <!-- <label for="month-field">Month: </label>-->
223
+ <!-- <input id="month-field" type="month" name="month">-->
224
+ <!-- </div>-->
225
+ <!-- </td>-->
226
+ <!-- </tr>-->
227
+
228
+
229
+ <tr>
230
+ <td>
231
+ <input type="reset" id="cancel" name="cancel" value="Cancel" class="styled-click-button">
232
+ <input type="submit" id="submit" name="submit" value="Submit" class="styled-click-button">
233
+ </td>
234
+ </tr>
235
+ </table>
236
+ </form>
237
+ </div>
238
+ </div>
239
+ </body>
240
+ </html>
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Media Page</title>
6
+ <style>
7
+ table {
8
+ font-family: arial, sans-serif;
9
+ font-size: 15px;
10
+ border-collapse: collapse;
11
+ width: 85%;
12
+ }
13
+ td, th {
14
+ border: 1px solid #dddddd;
15
+ text-align: left;
16
+ padding: 8px;
17
+ }
18
+ </style>
19
+ </head>
20
+ <body>
21
+ <div class="media-page-body">
22
+ <h1>Media Page</h1>
23
+ <video id="video_player" width="400" controls>
24
+ <source src="media/MP4_small.mp4" type="video/mp4">
25
+ </video>
26
+
27
+ <audio id="audio_player" controls>
28
+ <source src="media/MPS_sample.mp3" type="audio/mp3">
29
+ </audio>
30
+
31
+ </div>
32
+ </body>
33
+ </html>
@@ -29,6 +29,11 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_development_dependency 'bundler'
31
31
  spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'cucumber'
33
+ spec.add_development_dependency 'appium_capybara'
34
+ spec.add_development_dependency 'parallel_tests'
35
+ spec.add_development_dependency 'require_all'
36
+ spec.add_development_dependency 'simplecov', ['~> 0.18']
32
37
 
33
38
  spec.add_runtime_dependency 'appium_lib'
34
39
  spec.add_runtime_dependency 'browserstack-local'