testcentricity_web 4.1.6 → 4.1.9

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