testcentricity_web 4.1.3 → 4.1.6

Sign up to get free protection for your applications and to get access to all the features.
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'