testcentricity_web 4.1.6 → 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 (116) 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/.simplecov +5 -1
  6. data/CHANGELOG.md +43 -0
  7. data/README.md +14 -13
  8. data/Rakefile +99 -21
  9. data/config/cucumber.yml +32 -11
  10. data/config/locales/en-US.yml +56 -0
  11. data/config/test_data/LOCAL_data.json +15 -0
  12. data/config/test_data/LOCAL_data.xls +0 -0
  13. data/config/test_data/LOCAL_data.yml +11 -0
  14. data/config/test_data/data.json +25 -0
  15. data/config/test_data/data.xls +0 -0
  16. data/config/test_data/data.yml +20 -0
  17. data/{docker-compose-v3.yml → docker-compose.yml} +2 -2
  18. data/features/basic_form_page_css.feature +54 -0
  19. data/features/basic_form_page_xpath.feature +26 -0
  20. data/features/custom_controls.feature +29 -0
  21. data/features/media_players.feature +67 -0
  22. data/features/step_definitions/generic_steps.rb.rb +87 -0
  23. data/features/step_definitions/media_steps.rb +30 -0
  24. data/features/support/data/form_data.rb +43 -0
  25. data/features/support/env.rb +18 -10
  26. data/features/support/hooks.rb +26 -1
  27. data/features/support/pages/base_test_page.rb +22 -0
  28. data/features/support/pages/{basic_css_test_page.rb → basic_css_form_page.rb} +12 -8
  29. data/features/support/pages/{basic_test_page.rb → basic_form_page.rb} +227 -36
  30. data/features/support/pages/{basic_xpath_test_page.rb → basic_xpath_form_page.rb} +12 -7
  31. data/features/support/pages/custom_controls_page.rb +263 -0
  32. data/features/support/pages/indexed_sections_page.rb +57 -0
  33. data/features/support/pages/media_test_page.rb +207 -0
  34. data/features/support/sections/header_nav.rb +48 -0
  35. data/features/support/sections/product_card.rb +39 -0
  36. data/features/support/world_data.rb +12 -0
  37. data/features/support/world_pages.rb +5 -2
  38. data/lib/testcentricity_web/appium_server.rb +5 -0
  39. data/lib/testcentricity_web/browser_helper.rb +0 -6
  40. data/lib/testcentricity_web/data_objects/data_objects_helper.rb +7 -0
  41. data/lib/testcentricity_web/data_objects/environment.rb +14 -0
  42. data/lib/testcentricity_web/data_objects/excel_helper.rb +60 -59
  43. data/lib/testcentricity_web/version.rb +1 -1
  44. data/lib/testcentricity_web/web_core/drag_drop_helper.rb +4 -0
  45. data/lib/testcentricity_web/web_core/page_object.rb +1 -8
  46. data/lib/testcentricity_web/web_core/page_objects_helper.rb +4 -2
  47. data/lib/testcentricity_web/web_core/page_section.rb +1 -1
  48. data/lib/testcentricity_web/web_core/webdriver_helper.rb +60 -44
  49. data/lib/testcentricity_web/web_elements/checkbox.rb +49 -19
  50. data/lib/testcentricity_web/web_elements/file_field.rb +9 -5
  51. data/lib/testcentricity_web/web_elements/image.rb +2 -1
  52. data/lib/testcentricity_web/web_elements/media.rb +46 -12
  53. data/lib/testcentricity_web/web_elements/radio.rb +51 -16
  54. data/lib/testcentricity_web/web_elements/select_list.rb +12 -12
  55. data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +22 -9
  56. data/lib/testcentricity_web/web_elements/video.rb +2 -2
  57. data/spec/fixtures/page_object.rb +22 -0
  58. data/spec/fixtures/section_object.rb +21 -0
  59. data/spec/spec_helper.rb +31 -0
  60. data/spec/testcentricity_web/browser_spec.rb +41 -0
  61. data/spec/testcentricity_web/elements/audio_spec.rb +68 -0
  62. data/spec/testcentricity_web/elements/button_spec.rb +18 -0
  63. data/spec/testcentricity_web/elements/checkbox_spec.rb +33 -0
  64. data/spec/testcentricity_web/elements/file_field_spec.rb +13 -0
  65. data/spec/testcentricity_web/elements/image_spec.rb +33 -0
  66. data/spec/testcentricity_web/elements/label_spec.rb +18 -0
  67. data/spec/testcentricity_web/elements/link_spec.rb +23 -0
  68. data/spec/testcentricity_web/elements/list_spec.rb +13 -0
  69. data/spec/testcentricity_web/elements/radio_spec.rb +28 -0
  70. data/spec/testcentricity_web/elements/ui_element_spec.rb +125 -0
  71. data/spec/testcentricity_web/elements/video_spec.rb +68 -0
  72. data/spec/testcentricity_web/helper_specs/object_helpers_spec.rb +39 -0
  73. data/spec/testcentricity_web/helper_specs/string_helpers_spec.rb +49 -0
  74. data/spec/testcentricity_web/page_object_spec.rb +90 -0
  75. data/spec/testcentricity_web/section_object_spec.rb +72 -0
  76. data/spec/testcentricity_web/version_spec.rb +7 -0
  77. data/spec/testcentricity_web/webdriver_connect/grid_webdriver_spec.rb +72 -0
  78. data/spec/testcentricity_web/webdriver_connect/local_webdriver_spec.rb +86 -0
  79. data/spec/testcentricity_web/webdriver_connect/mobile_webdriver_spec.rb +65 -0
  80. data/test_site/basic_test_page.html +51 -1
  81. data/test_site/chosen-sprite.png +0 -0
  82. data/test_site/chosen-sprite@2x.png +0 -0
  83. data/test_site/chosen.css +496 -0
  84. data/test_site/chosen.jquery.js +1359 -0
  85. data/test_site/chosen.jquery.min.js +3 -0
  86. data/test_site/chosen.min.css +11 -0
  87. data/test_site/chosen.proto.js +1399 -0
  88. data/test_site/chosen.proto.min.js +3 -0
  89. data/test_site/composer.json +36 -0
  90. data/test_site/custom_controls_page.html +629 -0
  91. data/test_site/docsupport/chosen.png +0 -0
  92. data/test_site/docsupport/init.js +11 -0
  93. data/test_site/docsupport/init.proto.js +16 -0
  94. data/test_site/docsupport/jquery-1.12.4.min.js +5 -0
  95. data/test_site/docsupport/jquery-3.2.1.min.js +4 -0
  96. data/test_site/docsupport/oss-credit.png +0 -0
  97. data/test_site/docsupport/prism.css +108 -0
  98. data/test_site/docsupport/prism.js +9 -0
  99. data/test_site/docsupport/prototype-1.7.0.0.js +6082 -0
  100. data/test_site/docsupport/style.css +219 -0
  101. data/test_site/images/Blouse_Black.jpg +0 -0
  102. data/test_site/images/Printed_Dress.jpg +0 -0
  103. data/test_site/images/T-shirt.jpg +0 -0
  104. data/test_site/images/jeans3.jpg +0 -0
  105. data/test_site/indexed_sections_page.html +215 -0
  106. data/test_site/media/MIB2-subtitles-pt-BR.vtt +49 -0
  107. data/test_site/media/MIB2.mp4 +0 -0
  108. data/test_site/media/bbc_scotland_report.mp3 +0 -0
  109. data/test_site/media/count_and_bars.mp4 +0 -0
  110. data/test_site/media_page.html +60 -7
  111. data/testcentricity_web.gemspec +14 -8
  112. metadata +197 -25
  113. data/Gemfile.lock +0 -170
  114. data/features/basic_test_page_css.feature +0 -24
  115. data/features/basic_test_page_xpath.feature +0 -24
  116. data/features/support/pages/media_page.rb +0 -11
@@ -61,7 +61,7 @@ module TestCentricity
61
61
  #
62
62
  def choose_option(option)
63
63
  @base_object, = find_element
64
- object_not_found_exception(@base_object, nil)
64
+ object_not_found_exception(@base_object, 'SelectList')
65
65
 
66
66
  trigger_list
67
67
 
@@ -75,9 +75,9 @@ module TestCentricity
75
75
  end
76
76
  else
77
77
  if option.is_a?(Hash)
78
- page.find(:css, "#{@list_item}:nth-of-type(#{option[:index]})").click if option.key?(:index)
79
- page.find(:css, "#{@list_item}:nth-of-type(#{option[:value]})").click if option.key?(:value)
80
- page.find(:css, "#{@list_item}:nth-of-type(#{option[:text]})").click if option.key?(:text)
78
+ @base_object.first(:css, "#{@list_item}:nth-of-type(#{option[:index]})").click if option.key?(:index)
79
+ @base_object.first(:css, "#{@list_item}:nth-of-type(#{option[:value]})").click if option.key?(:value)
80
+ @base_object.first(:css, "#{@list_item}:nth-of-type(#{option[:text]})").click if option.key?(:text)
81
81
  else
82
82
  options = @base_object.all(@list_item).collect(&:text)
83
83
  sleep(2) unless options.include?(option)
@@ -117,10 +117,10 @@ module TestCentricity
117
117
  def set(text)
118
118
  raise "A 'text_field' list element must be defined before calling the 'set' method on a selectlist object" if @text_field.nil?
119
119
  @base_object, = find_element
120
- object_not_found_exception(@base_object, nil)
120
+ object_not_found_exception(@base_object, 'SelectList')
121
121
  trigger_list
122
-
123
- page.find(:css, @text_field, wait: 2).set(text)
122
+ input = find_component(@text_field, 'text field')
123
+ input.set("#{text}\n")
124
124
  end
125
125
 
126
126
  # Return array of strings of all options in a select box object.
@@ -132,7 +132,7 @@ module TestCentricity
132
132
  #
133
133
  def get_options
134
134
  @base_object, = find_element
135
- object_not_found_exception(@base_object, nil)
135
+ object_not_found_exception(@base_object, 'SelectList')
136
136
  if @options_list.nil?
137
137
  if @base_object.first(:css, @list_item, minimum: 0, wait: 2)
138
138
  @base_object.all(@list_item).collect(&:text)
@@ -159,7 +159,7 @@ module TestCentricity
159
159
  #
160
160
  def get_option_count
161
161
  @base_object, = find_element
162
- object_not_found_exception(@base_object, nil)
162
+ object_not_found_exception(@base_object, 'SelectList')
163
163
  if @options_list.nil?
164
164
  if @base_object.first(:css, @list_item, minimum: 0, wait: 2)
165
165
  @base_object.all(@list_item).count
@@ -186,7 +186,7 @@ module TestCentricity
186
186
  #
187
187
  def get_group_headings
188
188
  @base_object, = find_element
189
- object_not_found_exception(@base_object, nil)
189
+ object_not_found_exception(@base_object, 'SelectList')
190
190
  if @options_list.nil?
191
191
  if @base_object.first(:css, @group_heading, minimum: 0, wait: 2)
192
192
  @base_object.all(@group_heading).collect(&:text)
@@ -211,7 +211,7 @@ module TestCentricity
211
211
  #
212
212
  def get_group_count
213
213
  @base_object, = find_element
214
- object_not_found_exception(@base_object, nil)
214
+ object_not_found_exception(@base_object, 'SelectList')
215
215
  if @options_list.nil?
216
216
  if @base_object.first(:css, @group_item, minimum: 0, wait: 2)
217
217
  @base_object.all(@group_item).count
@@ -245,7 +245,7 @@ module TestCentricity
245
245
  #
246
246
  def get_selected_option
247
247
  @base_object, = find_element
248
- object_not_found_exception(@base_object, nil)
248
+ object_not_found_exception(@base_object, 'SelectList')
249
249
  trigger_list unless @options_list.nil?
250
250
  selection = if @base_object.first(:css, @list_item, minimum: 0, wait: 1, visible: :all)
251
251
  @base_object.first(:css, @selected_item, wait: 1, visible: :all).text
@@ -168,7 +168,7 @@ module TestCentricity
168
168
  def scroll_to(position)
169
169
  obj, type = find_element
170
170
  object_not_found_exception(obj, type)
171
- obj.scroll_to(position)
171
+ page.scroll_to(obj, align: position)
172
172
  end
173
173
 
174
174
  def set(value)
@@ -521,12 +521,13 @@ module TestCentricity
521
521
  def get_value(visible = true)
522
522
  obj, type = find_element(visible)
523
523
  object_not_found_exception(obj, type)
524
- case obj.tag_name.downcase
525
- when 'input', 'select', 'textarea'
526
- obj.value
527
- else
528
- obj.text
529
- end
524
+ text = case obj.tag_name.downcase
525
+ when 'input', 'select', 'textarea'
526
+ obj.value
527
+ else
528
+ obj.text
529
+ end
530
+ text.gsub(/[[:space:]]+/, ' ').strip unless text.nil?
530
531
  end
531
532
 
532
533
  alias get_caption get_value
@@ -998,6 +999,18 @@ module TestCentricity
998
999
  state.boolean? ? state : state == 'true'
999
1000
  end
1000
1001
 
1002
+ # Return crossorigin property
1003
+ #
1004
+ # @return crossorigin value
1005
+ # @example
1006
+ # with_creds = media_player.crossorigin == 'use-credentials'
1007
+ #
1008
+ def crossorigin
1009
+ obj, = find_element
1010
+ object_not_found_exception(obj, @type)
1011
+ obj.native.attribute('crossorigin')
1012
+ end
1013
+
1001
1014
  def get_attribute(attrib)
1002
1015
  obj, type = find_element(visible = false)
1003
1016
  object_not_found_exception(obj, type)
@@ -1083,10 +1096,10 @@ module TestCentricity
1083
1096
 
1084
1097
  def find_component(component, component_name)
1085
1098
  begin
1086
- element = @base_object.find(:css, component, minimum: 0, wait: 1)
1099
+ element = @base_object.find(:css, component, visible: :all, minimum: 0, wait: 1)
1087
1100
  rescue
1088
1101
  begin
1089
- element = page.find(:css, component, minimum: 0, wait: 5)
1102
+ element = page.find(:css, component, visible: :all, minimum: 0, wait: 2)
1090
1103
  rescue
1091
1104
  raise "Component #{component_name} (#{component}) for #{@type} named '#{@name}' (#{locator}) not found"
1092
1105
  end
@@ -14,7 +14,7 @@ module TestCentricity
14
14
  def video_height
15
15
  obj, = find_element
16
16
  object_not_found_exception(obj, :video)
17
- obj.native.attribute('videoHeight')
17
+ obj.native.attribute('videoHeight').to_i
18
18
  end
19
19
 
20
20
  # Return video Width property
@@ -26,7 +26,7 @@ module TestCentricity
26
26
  def video_width
27
27
  obj, = find_element
28
28
  object_not_found_exception(obj, :video)
29
- obj.native.attribute('videoWidth')
29
+ obj.native.attribute('videoWidth').to_i
30
30
  end
31
31
 
32
32
  # Return video poster property
@@ -0,0 +1,22 @@
1
+ class TestPage < TestCentricity::PageObject
2
+ trait(:page_name) { 'Basic Test Page' }
3
+ trait(:page_url) { '/basic_test_page.html' }
4
+ trait(:page_locator) { 'form#HTMLFormElements' }
5
+
6
+ elements element1: 'div#element1'
7
+ buttons button1: 'button#button1'
8
+ textfields field1: 'input#field1'
9
+ links link1: 'a#link1'
10
+ ranges range1: 'input#range1'
11
+ images image1: 'img#image1'
12
+ radios radio1: 'input#radio1'
13
+ checkboxes check1: 'input#check1'
14
+ filefields file1: 'input#file1'
15
+ labels label1: 'label#label1'
16
+ tables table1: 'table#table1'
17
+ selectlists select1: 'select#select1'
18
+ lists list1: 'ul#list1'
19
+ videos video1: 'video#video1'
20
+ audios audio1: 'audio#audio1'
21
+ sections section1: TestSection
22
+ end
@@ -0,0 +1,21 @@
1
+ class TestSection < TestCentricity::PageSection
2
+ trait(:section_locator) { 'div#section' }
3
+ trait(:section_name) { 'Basic Test Section' }
4
+
5
+ elements element1: 'div#element1'
6
+ buttons button1: 'button#button1'
7
+ textfields field1: 'input#field1'
8
+ links link1: 'a#link1'
9
+ ranges range1: 'input#range1'
10
+ images image1: 'img#image1'
11
+ radios radio1: 'input#radio1'
12
+ checkboxes check1: 'input#check1'
13
+ filefields file1: 'input#file1'
14
+ labels label1: 'label#label1'
15
+ tables table1: 'table#table1'
16
+ selectlists select1: 'select#select1'
17
+ lists list1: 'ul#list1'
18
+ videos video1: 'video#video1'
19
+ audios audio1: 'audio#audio1'
20
+ sections section2: TestSection
21
+ end
@@ -0,0 +1,31 @@
1
+ require 'require_all'
2
+ require 'capybara/rspec'
3
+ require 'httparty'
4
+ require 'simplecov'
5
+ require 'testcentricity_web'
6
+
7
+ require_rel 'fixtures'
8
+
9
+ include TestCentricity
10
+
11
+ SimpleCov.command_name("RSpec-#{Time.now.strftime('%Y%m%d%H%M%S')}")
12
+
13
+ $LOAD_PATH << './lib'
14
+
15
+ # set the default locale and auto load all translations from config/locales/*.rb,yml.
16
+ ENV['LOCALE'] = 'en-US' unless ENV['LOCALE']
17
+ I18n.load_path += Dir['config/locales/*.{rb,yml}']
18
+ I18n.default_locale = 'en-US'
19
+ I18n.locale = ENV['LOCALE']
20
+ Faker::Config.locale = ENV['LOCALE']
21
+
22
+ # prevent Test::Unit's AutoRunner from executing during RSpec's rake task
23
+ Test::Unit.run = true if defined?(Test::Unit) && Test::Unit.respond_to?(:run=)
24
+
25
+ RSpec.configure do |config|
26
+ config.mock_with :rspec do |mocks|
27
+ mocks.allow_message_expectations_on_nil = true
28
+ mocks.verify_doubled_constant_names = true
29
+ mocks.verify_partial_doubles = true
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Browsers, required: true do
4
+ before(:context) do
5
+ # instantiate local test environment
6
+ @environs ||= EnvironData
7
+ @environs.find_environ('LOCAL', :yaml)
8
+ ENV['WEB_BROWSER'] = 'chrome_headless'
9
+ end
10
+
11
+ context 'web browser with multiple tabs/windows' do
12
+ it 'returns number of browser windows/tabs' do
13
+ WebDriverConnect.initialize_web_driver
14
+ Capybara.current_session.open_new_window
15
+ Capybara.current_session.open_new_window
16
+ expect(Browsers.num_browser_instances).to eql 3
17
+ end
18
+
19
+ it 'closes original browser instance' do
20
+ WebDriverConnect.initialize_web_driver
21
+ Capybara.current_session.open_new_window
22
+ Browsers.close_old_browser_instance
23
+ expect(Browsers.num_browser_instances).to eql 1
24
+ end
25
+
26
+ it 'closes current browser instance' do
27
+ WebDriverConnect.initialize_web_driver
28
+ Capybara.current_session.open_new_window
29
+ Browsers.switch_to_new_browser_instance
30
+ Capybara.current_session.open_new_window
31
+ Browsers.close_current_browser_instance
32
+ expect(Browsers.num_browser_instances).to eql 2
33
+ end
34
+ end
35
+
36
+ after(:each) do
37
+ Browsers.close_all_browser_instances
38
+ Capybara.current_session.quit
39
+ Environ.session_state = :quit
40
+ end
41
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Audio, required: true do
4
+ subject(:css_audio) { described_class.new(:test_audio, self, 'audio#css_audio', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_audio.class).to eql TestCentricity::Audio
8
+ end
9
+
10
+ it 'registers with type audio' do
11
+ expect(css_audio.get_object_type).to eql :audio
12
+ end
13
+
14
+ it 'returns autoplay' do
15
+ allow(css_audio).to receive(:autoplay?).and_return(false)
16
+ expect(css_audio.autoplay?).to eql false
17
+ end
18
+
19
+ it 'returns controls' do
20
+ allow(css_audio).to receive(:controls?).and_return(true)
21
+ expect(css_audio.controls?).to eql true
22
+ end
23
+
24
+ it 'returns ended' do
25
+ allow(css_audio).to receive(:ended?).and_return(true)
26
+ expect(css_audio.ended?).to eql true
27
+ end
28
+
29
+ it 'returns loop' do
30
+ allow(css_audio).to receive(:loop?).and_return(false)
31
+ expect(css_audio.loop?).to eql false
32
+ end
33
+
34
+ it 'returns muted' do
35
+ allow(css_audio).to receive(:muted?).and_return(false)
36
+ expect(css_audio.muted?).to eql false
37
+ end
38
+
39
+ it 'returns paused' do
40
+ allow(css_audio).to receive(:paused?).and_return(true)
41
+ expect(css_audio.paused?).to eql true
42
+ end
43
+
44
+ it 'returns seeking' do
45
+ allow(css_audio).to receive(:seeking?).and_return(false)
46
+ expect(css_audio.seeking?).to eql false
47
+ end
48
+
49
+ it 'should play the audio' do
50
+ expect(css_audio).to receive(:play)
51
+ css_audio.play
52
+ end
53
+
54
+ it 'should pause the audio' do
55
+ expect(css_audio).to receive(:pause)
56
+ css_audio.pause
57
+ end
58
+
59
+ it 'should mute the audio' do
60
+ expect(css_audio).to receive(:mute)
61
+ css_audio.mute
62
+ end
63
+
64
+ it 'should unmute the audio' do
65
+ expect(css_audio).to receive(:unmute)
66
+ css_audio.unmute
67
+ end
68
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Button, required: true do
4
+ subject(:css_button) { described_class.new(:test_button, self, 'button#css_button', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_button.class).to eql TestCentricity::Button
8
+ end
9
+
10
+ it 'registers with type button' do
11
+ expect(css_button.get_object_type).to eql :button
12
+ end
13
+
14
+ it 'should click the button' do
15
+ expect(css_button).to receive(:click)
16
+ css_button.click
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::CheckBox, required: true do
4
+ subject(:css_check) { described_class.new(:test_check, self, 'input#css_check', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_check.class).to eql TestCentricity::CheckBox
8
+ end
9
+
10
+ it 'registers with type checkbox' do
11
+ expect(css_check.get_object_type).to eql :checkbox
12
+ end
13
+
14
+ it 'should check the checkbox' do
15
+ expect(css_check).to receive(:check)
16
+ css_check.check
17
+ end
18
+
19
+ it 'should uncheck the checkbox' do
20
+ expect(css_check).to receive(:uncheck)
21
+ css_check.uncheck
22
+ end
23
+
24
+ it 'should know if checkbox is checked' do
25
+ allow(css_check).to receive(:checked?).and_return(true)
26
+ expect(css_check.checked?).to eq(true)
27
+ end
28
+
29
+ it 'should know if checkbox is indeterminate' do
30
+ allow(css_check).to receive(:indeterminate?).and_return(true)
31
+ expect(css_check.indeterminate?).to eq(true)
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::FileField, required: true do
4
+ subject(:css_filefield) { described_class.new(:test_filefield, self, 'input#css_filefield', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_filefield.class).to eql TestCentricity::FileField
8
+ end
9
+
10
+ it 'registers with type label' do
11
+ expect(css_filefield.get_object_type).to eql :filefield
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Image, required: true do
4
+ subject(:css_image) { described_class.new(:test_image, self, 'img#css_image', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_image.class).to eql TestCentricity::Image
8
+ end
9
+
10
+ it 'registers with type image' do
11
+ expect(css_image.get_object_type).to eql :image
12
+ end
13
+
14
+ it 'returns loaded' do
15
+ allow(css_image).to receive(:loaded?).and_return(true)
16
+ expect(css_image.loaded?).to eql true
17
+ end
18
+
19
+ it 'returns broken' do
20
+ allow(css_image).to receive(:broken?).and_return(false)
21
+ expect(css_image.broken?).to eql false
22
+ end
23
+
24
+ it 'returns alt' do
25
+ allow(css_image).to receive(:alt).and_return('alt')
26
+ expect(css_image.alt).to eql 'alt'
27
+ end
28
+
29
+ it 'returns src' do
30
+ allow(css_image).to receive(:src).and_return('src')
31
+ expect(css_image.src).to eql 'src'
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Label, required: true do
4
+ subject(:css_label) { described_class.new(:test_label, self, 'label#css_label', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_label.class).to eql TestCentricity::Label
8
+ end
9
+
10
+ it 'registers with type label' do
11
+ expect(css_label.get_object_type).to eql :label
12
+ end
13
+
14
+ it 'returns caption' do
15
+ allow(css_label).to receive(:caption).and_return('caption')
16
+ expect(css_label.caption).to eql 'caption'
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Link, required: true do
4
+ subject(:css_link) { described_class.new(:test_label, self, 'a#css_label', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_link.class).to eql TestCentricity::Link
8
+ end
9
+
10
+ it 'registers with type link' do
11
+ expect(css_link.get_object_type).to eql :link
12
+ end
13
+
14
+ it 'returns href' do
15
+ allow(css_link).to receive(:href).and_return('href')
16
+ expect(css_link.href).to eql 'href'
17
+ end
18
+
19
+ it 'should click the link' do
20
+ expect(css_link).to receive(:click)
21
+ css_link.click
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::List, required: true do
4
+ subject(:css_list) { described_class.new(:test_list, self, 'ul#css_list', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_list.class).to eql TestCentricity::List
8
+ end
9
+
10
+ it 'registers with type list' do
11
+ expect(css_list.get_object_type).to eql :list
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::Radio, required: true do
4
+ subject(:css_radio) { described_class.new(:test_radio, self, 'input#css_radio', :page) }
5
+
6
+ it 'returns class' do
7
+ expect(css_radio.class).to eql TestCentricity::Radio
8
+ end
9
+
10
+ it 'registers with type radio' do
11
+ expect(css_radio.get_object_type).to eql :radio
12
+ end
13
+
14
+ it 'should select the radio' do
15
+ expect(css_radio).to receive(:select)
16
+ css_radio.select
17
+ end
18
+
19
+ it 'should unselect the radio' do
20
+ expect(css_radio).to receive(:unselect)
21
+ css_radio.unselect
22
+ end
23
+
24
+ it 'should know if radio is selected' do
25
+ allow(css_radio).to receive(:selected?).and_return(true)
26
+ expect(css_radio.selected?).to eq(true)
27
+ end
28
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe TestCentricity::UIElement, required: true do
4
+ subject(:css_element) { described_class.new(:css_test_element, self, 'button#css_button', :page) }
5
+ subject(:xpath_element) { described_class.new(:xpath_test_element, self, "//button[@id='xpath_button']", :page) }
6
+
7
+ it 'returns class' do
8
+ expect(css_element.class).to eql described_class
9
+ end
10
+
11
+ it 'returns css locator type' do
12
+ expect(css_element.get_locator_type).to eql :css
13
+ end
14
+
15
+ it 'returns xpath locator type' do
16
+ expect(xpath_element.get_locator_type).to eql :xpath
17
+ end
18
+
19
+ it 'returns name' do
20
+ expect(css_element.get_name).to eql :css_test_element
21
+ end
22
+
23
+ it 'returns locator' do
24
+ expect(css_element.get_locator).to eql 'button#css_button'
25
+ end
26
+
27
+ it 'returns css locator type' do
28
+ expect(css_element.get_locator_type).to eql :css
29
+ end
30
+
31
+ it 'should click the element' do
32
+ allow(css_element).to receive(:click)
33
+ css_element.click
34
+ end
35
+
36
+ it 'should double click the element' do
37
+ allow(css_element).to receive(:double_click)
38
+ css_element.double_click
39
+ end
40
+
41
+ it 'should right click the element' do
42
+ allow(css_element).to receive(:right_click)
43
+ css_element.right_click
44
+ end
45
+
46
+ it 'should click the element at specified offset' do
47
+ allow(css_element).to receive(:click_at)
48
+ css_element.click_at(10, 10)
49
+ end
50
+
51
+ it 'should hover over the element' do
52
+ allow(css_element).to receive(:hover)
53
+ css_element.hover
54
+ end
55
+
56
+ it 'should hover over the element at specified offset' do
57
+ allow(css_element).to receive(:hover_at)
58
+ css_element.hover_at(10, 15)
59
+ end
60
+
61
+ it 'should drag the element by specified offset' do
62
+ allow(css_element).to receive(:drag_by)
63
+ css_element.drag_by(20, 15)
64
+ end
65
+
66
+ it 'should know if element is visible' do
67
+ allow(css_element).to receive(:visible?).and_return(false)
68
+ expect(css_element.visible?).to eq(false)
69
+ end
70
+
71
+ it 'should know if element is hidden' do
72
+ allow(css_element).to receive(:hidden?).and_return(true)
73
+ expect(css_element.hidden?).to eq(true)
74
+ end
75
+
76
+ it 'should know if element exists' do
77
+ allow(css_element).to receive(:exists?).and_return(true)
78
+ expect(css_element.exists?).to be true
79
+ end
80
+
81
+ it 'should know if element is disabled' do
82
+ allow(css_element).to receive(:enabled?).and_return(true)
83
+ expect(css_element.enabled?).to eq(true)
84
+ end
85
+
86
+ it 'should know if element is disabled' do
87
+ allow(css_element).to receive(:disabled?).and_return(true)
88
+ expect(css_element.disabled?).to eq(true)
89
+ end
90
+
91
+ it 'should know if element is obscured' do
92
+ allow(css_element).to receive(:obscured?).and_return(true)
93
+ expect(css_element.obscured?).to eq(true)
94
+ end
95
+
96
+ it 'should know if element is focused' do
97
+ allow(css_element).to receive(:focused?).and_return(true)
98
+ expect(css_element.focused?).to eq(true)
99
+ end
100
+
101
+ it 'should know if element is displayed' do
102
+ allow(css_element).to receive(:displayed?).and_return(true)
103
+ expect(css_element.displayed?).to eq(true)
104
+ end
105
+
106
+ it 'should know if element is required' do
107
+ allow(css_element).to receive(:required?).and_return(true)
108
+ expect(css_element.required?).to eq(true)
109
+ end
110
+
111
+ it 'should send keys' do
112
+ allow(css_element).to receive(:send_keys).with('foo bar')
113
+ css_element.send_keys('foo bar')
114
+ end
115
+
116
+ it 'should right highlight the element' do
117
+ allow(css_element).to receive(:highlight)
118
+ css_element.highlight(2)
119
+ end
120
+
121
+ it 'should right unhighlight the element' do
122
+ allow(css_element).to receive(:unhighlight)
123
+ css_element.unhighlight
124
+ end
125
+ end