screen-object 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/ChangeLog +7 -0
  4. data/Gemfile +9 -0
  5. data/Rakefile +28 -0
  6. data/cucumber.yml +4 -0
  7. data/features/button.feature +28 -0
  8. data/features/checkbox.feature +11 -0
  9. data/features/navigation.feature +10 -0
  10. data/features/step_definitions/button_step.rb +46 -0
  11. data/features/step_definitions/checkbox_step.rb +12 -0
  12. data/features/step_definitions/navigation_steps.rb +14 -0
  13. data/features/step_definitions/table_step.rb +5 -0
  14. data/features/step_definitions/textfield_step.rb +5 -0
  15. data/features/support/appium.txt +9 -0
  16. data/features/support/appium_ios.txt +11 -0
  17. data/features/support/env.rb +30 -0
  18. data/features/support/screen.rb +79 -0
  19. data/features/support/screens/buttons_screen.rb +8 -0
  20. data/features/support/screens/landing_screen.rb +6 -0
  21. data/features/support/screens/main_screen.rb +6 -0
  22. data/features/table.feature +11 -0
  23. data/features/textfield.feature +10 -0
  24. data/lib/screen-object.rb +161 -0
  25. data/lib/screen-object/.DS_Store +0 -0
  26. data/lib/screen-object/accessors.rb +457 -0
  27. data/lib/screen-object/accessors/button.rb +36 -0
  28. data/lib/screen-object/accessors/checkbox.rb +38 -0
  29. data/lib/screen-object/accessors/element.rb +144 -0
  30. data/lib/screen-object/accessors/image.rb +25 -0
  31. data/lib/screen-object/accessors/table.rb +26 -0
  32. data/lib/screen-object/accessors/text.rb +46 -0
  33. data/lib/screen-object/accessors/textfield.rb +41 -0
  34. data/lib/screen-object/appium_server.rb +58 -0
  35. data/lib/screen-object/elements.rb +21 -0
  36. data/lib/screen-object/load_appium.rb +31 -0
  37. data/lib/screen-object/screen_factory.rb +43 -0
  38. data/lib/screen-object/version.rb +4 -0
  39. data/screen-object.gemspec +28 -0
  40. data/spec/integration/appium_server_spec.rb +24 -0
  41. data/spec/lib/appium_server_spec.rb +59 -0
  42. data/spec/lib/screen_object_spec.rb +37 -0
  43. data/spec/screen-object/button_spec.rb +25 -0
  44. data/spec/screen-object/checkbox_spec.rb +35 -0
  45. data/spec/screen-object/element_spec.rb +205 -0
  46. data/spec/screen-object/image_spec.rb +21 -0
  47. data/spec/screen-object/text_field_spec.rb +37 -0
  48. data/spec/screen-object/text_spec.rb +29 -0
  49. data/spec/spec_helper.rb +29 -0
  50. metadata +201 -0
@@ -0,0 +1,31 @@
1
+ =begin
2
+ ***********************************************************************************************************
3
+ Copyright 2016 Capital One Services, LLC
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+ Unless required by applicable law or agreed to in writing, software
9
+ distributed under the License is distributed on an "AS IS" BASIS,
10
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ See the License for the specific language governing permissions and limitations under the License.
12
+ ***********************************************************************************************************
13
+ =end
14
+
15
+ module ScreenObject
16
+ module Load_App
17
+
18
+ def self.start_driver
19
+ $driver.start_driver
20
+ end
21
+
22
+ def self.quit_driver
23
+ $driver.driver_quit
24
+ end
25
+
26
+ def self.load_driver(appium_txt)
27
+ #Appium.promote_singleton_appium_methods ScreenObject
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'page_navigation'
2
+
3
+ module ScreenObject
4
+
5
+ #
6
+ # Module to facilitate to creating of screen objects in step definitions. You
7
+ # can make the methods below available to all of your step definitions by adding
8
+ # this module to World.
9
+ #
10
+ # @example Making the ScreenFactory available to your step definitions
11
+ # World ScreenObject::ScreenFactory
12
+ #
13
+ # @example using a screen in a Scenario
14
+ # on MyScreenObject do |screen|
15
+ # screen.name = 'Cheezy'
16
+ # end
17
+ #
18
+ # If you plan to use the navigate_to method you will need to ensure
19
+ # you setup the possible routes ahead of time. You must always have
20
+ # a default route in order for this to work. Here is an example of
21
+ # how you define routes:
22
+ #
23
+ # @example Example routes defined in env.rb
24
+ # ScreenObject::ScreenFactory.routes = {
25
+ # :default => [[ScreenOne,:method1], [ScreenTwoA,:method2], [ScreenThree,:method3]],
26
+ # :another_route => [[ScreenOne,:method1, "arg1"], [ScreenTwoB,:method2b], [ScreenThree,:method3]]
27
+ # }
28
+ #
29
+ # Notice the first entry of :another_route is passing an argument
30
+ # to the method.
31
+ #
32
+
33
+ module ScreenFactory
34
+ include PageNavigation
35
+
36
+ def on(screen_class, &blk)
37
+ @current_screen = screen_class.new
38
+ blk.call @current_screen if blk
39
+ @current_screen
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module ScreenObject
3
+ VERSION = '1.0.0'
4
+ end
@@ -0,0 +1,28 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'screen-object/version'
3
+
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'screen-object'
7
+ s.version = ScreenObject::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Sreepad Bhagwat','Shailendra Jain']
10
+ s.license = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
11
+ s.homepage = 'https://github.kdc.capitalone.com/mobius/screen-object'
12
+ s.summary = 'Page Object like DSL for testing mobile application'
13
+ s.description = 'Page Object like DSL for testing mobile application'
14
+
15
+ s.files = `git ls-files | grep -v sample_app`.split("\n")
16
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ s.require_paths = ['lib']
19
+
20
+ #s.add_runtime_dependency 'appium_lib', '~> 7.0', '>= 7.0.0'
21
+ s.add_runtime_dependency 'appium_lib', '~> 8.0.2'
22
+ s.add_runtime_dependency 'page_navigation', '~> 0.9'
23
+ s.add_runtime_dependency 'childprocess', '~> 0.5'
24
+
25
+ s.add_development_dependency 'cucumber', '~> 1.3', '>= 1.3.0'
26
+ s.add_development_dependency 'rspec', '~> 3.1', '>= 3.1.0'
27
+ end
28
+
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'screen-object/appium_server'
3
+
4
+ describe ScreenObject::AppiumServer do
5
+
6
+
7
+ let(:the_server) { ScreenObject::AppiumServer.new }
8
+
9
+ context 'when appium server is started' do
10
+ it 'should start the appium server as a process' do
11
+ the_server.start
12
+ the_pid = the_server.process.pid
13
+ expect(the_server.process).to be_running_process
14
+ Process.kill(9, the_pid)
15
+ end
16
+
17
+ it 'should be stopped when exiting' do
18
+ the_server.start
19
+ the_pid = the_server.process.pid
20
+ the_server.stop
21
+ expect(the_server.process).to_not be_running_process
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ require 'screen-object/appium_server'
3
+
4
+ describe ScreenObject::AppiumServer do
5
+
6
+ attr_reader :the_server
7
+
8
+ before(:each) do
9
+ @process = double(:process)
10
+ allow(ChildProcess).to receive(:build).and_return(@process)
11
+ allow(@process).to receive(:start)
12
+ end
13
+
14
+ def the_server(params = {})
15
+ @the_server ||= ScreenObject::AppiumServer.new(params)
16
+ end
17
+
18
+ def expected_build_params(*params)
19
+ expect(ChildProcess).to receive(:build).with(*params).and_return(@process)
20
+ end
21
+
22
+
23
+ context "when starting the appium server" do
24
+ it 'should start the appium process with no parameters' do
25
+ expected_build_params('appium')
26
+ the_server.start
27
+ end
28
+
29
+ it 'should pass a parameter and value to the appium process' do
30
+ expected_build_params('appium', '--foo', 'bar')
31
+ the_server('foo' => 'bar').start
32
+ end
33
+
34
+ it 'should not contain value in the server start parameter if value is nil' do
35
+ expected_build_params('appium', '--foo')
36
+ the_server('foo' => nil).start
37
+ end
38
+
39
+ it 'should accept symbol as key for the parameter' do
40
+ expected_build_params('appium', '--foo', 'bar')
41
+ the_server(:foo => 'bar').start
42
+ end
43
+
44
+ it 'should start the server process' do
45
+ expected_build_params('appium')
46
+ expect(@process).to receive(:start)
47
+ the_server.start
48
+ end
49
+ end
50
+
51
+ context "When stopping the appium server" do
52
+ it 'should stop the appium process' do
53
+ the_server.start
54
+ expect(@process).to receive(:stop)
55
+ the_server.stop
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ require 'selenium-webdriver'
3
+
4
+ class TestScreen
5
+ include ScreenObject
6
+ end
7
+
8
+ describe ScreenObject do
9
+
10
+ let(:the_screen) { TestScreen.new }
11
+
12
+ context 'when waiting for something to happen' do
13
+
14
+ let(:wait) { double('wait') }
15
+
16
+ before do
17
+ allow(wait).to receive(:until)
18
+ end
19
+
20
+ it 'should wait for 5 seconds by default' do
21
+ expect(Selenium::WebDriver::Wait).to receive(:new).with(timeout: 5, message: nil).and_return(wait)
22
+ the_screen.wait_until { }
23
+ end
24
+
25
+ it 'should allow you to override the default wait time' do
26
+ expect(Selenium::WebDriver::Wait).to receive(:new).with(timeout: 10, message: nil).and_return(wait)
27
+ the_screen.wait_until(10) { }
28
+ end
29
+
30
+ it 'should allow you to provide a message to use when wait fails' do
31
+ expect(Selenium::WebDriver::Wait).to receive(:new).with(timeout: 10, message: 'foobar').and_return(wait)
32
+ the_screen.wait_until(10, 'foobar') { }
33
+ end
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,25 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "Interface" do
4
+
5
+ locator = "name~dummy"
6
+ let(:selenium_object) { double('') }
7
+ let(:button) {ScreenObject::AppElements::Button.new(locator)}
8
+
9
+ context "interaction with tap method" do
10
+ it "should tap on the button" do
11
+ expect(button).to receive(:element).and_return(selenium_object)
12
+ expect(selenium_object).to receive(:click).and_return(true)
13
+ expect(button.tap).to eq(true)
14
+ end
15
+ end
16
+
17
+ context "interaction with enable method" do
18
+ it "should check if button is enabled" do
19
+ expect(button).to receive(:element).and_return(selenium_object)
20
+ expect(selenium_object).to receive(:enabled?).and_return(true)
21
+ expect(button.enabled?).to eq(true)
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "Interface" do
4
+
5
+ locator = "name~dummy"
6
+ let(:selenium_object) { double('') }
7
+ let(:check_box) {ScreenObject::AppElements::CheckBox.new(locator)}
8
+
9
+ context "interaction with checked method" do
10
+ it "should retun true if checked?" do
11
+ expect(check_box).to receive(:element).and_return(selenium_object)
12
+ expect(selenium_object).to receive(:attribute).with('checked').and_return('true')
13
+ expect(check_box.checked?).to eq(true)
14
+ end
15
+ end
16
+
17
+ context "interaction with check method" do
18
+ it "should check the element" do
19
+ expect(check_box).to receive(:element).and_return(selenium_object)
20
+ expect(selenium_object).to receive(:click).and_return(true)
21
+ expect(check_box).to receive(:checked?).and_return(false)
22
+ expect(check_box.check).to eq(true)
23
+ end
24
+ end
25
+
26
+ context "interaction with uncheck method" do
27
+ it "should uncheck the element" do
28
+ expect(check_box).to receive(:element).and_return(selenium_object)
29
+ expect(selenium_object).to receive(:click).and_return(true)
30
+ expect(check_box).to receive(:checked?).and_return(true)
31
+ expect(check_box.uncheck).to eq(true)
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,205 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "Interface" do
4
+
5
+ locator = "name~dummy"
6
+ let(:selenium_driver) {double('')}
7
+ let(:element) {ScreenObject::AppElements::Element.new(locator)}
8
+
9
+ context "interaction with click method" do
10
+ it "should click on element" do
11
+ expect(element).to receive(:element).and_return(selenium_driver)
12
+ expect(selenium_driver).to receive(:click).and_return(true)
13
+ expect(element.click).to be true
14
+ end
15
+
16
+ end
17
+
18
+ context "interaction with value method" do
19
+ it "should return value" do
20
+ expect(element).to receive(:element).and_return(selenium_driver)
21
+ expect(selenium_driver).to receive(:value).and_return("value")
22
+ expect(element.value).to eql ("value")
23
+ end
24
+
25
+ end
26
+
27
+ context "interaction with exists? method" do
28
+ it "should return value" do
29
+ expect(element).to receive(:element).and_return(selenium_driver)
30
+ expect(selenium_driver).to receive(:displayed?).and_return(true)
31
+ expect(element.exists?).to eql (true)
32
+ end
33
+
34
+ end
35
+
36
+ context "interaction with element method" do
37
+ it "should return element object" do
38
+ expect(element).to receive(:driver).and_return(selenium_driver)
39
+ expect(selenium_driver).to receive(:find_element).and_return(selenium_driver)
40
+ expect(element.element).to eql (selenium_driver)
41
+ end
42
+
43
+ end
44
+
45
+ context "interaction with element method" do
46
+ it "should return element object" do
47
+ expect(element).to receive(:driver).and_return(selenium_driver)
48
+ expect(selenium_driver).to receive(:find_elements).and_return(selenium_driver)
49
+ expect(element.elements).to eql (selenium_driver)
50
+ end
51
+
52
+ end
53
+
54
+ context "interaction with element method" do
55
+ it "should return element object" do
56
+ expect(element).to receive(:dynamic_xpath).and_return(selenium_driver)
57
+ expect(selenium_driver).to receive(:displayed?).and_return(true)
58
+ expect(element.dynamic_text_exists?("dynamic_text")).to eql (true)
59
+ end
60
+
61
+ end
62
+
63
+ # context "interaction with scroll method" do
64
+ # it "should return element object" do
65
+ # expect(element).to receive(:driver).and_return(selenium_driver)
66
+ # expect(selenium_driver).to receive(:execute_script).and_return(selenium_driver)
67
+ # expect(element.scroll).to eql (selenium_driver)
68
+ # end
69
+ # end
70
+
71
+ context "interaction with scroll_for_element_click method" do
72
+ it "should click on object if it does exists on the first page" do
73
+ expect(element).to receive(:element).and_return(selenium_driver)
74
+ expect(selenium_driver).to receive(:displayed?).and_return(true)
75
+ expect(element).to receive(:element).and_return(selenium_driver)
76
+ expect(selenium_driver).to receive(:click).and_return(true)
77
+ expect(element.scroll_for_element_click).to eql (true)
78
+ end
79
+
80
+ end
81
+
82
+ context "interaction with scroll_for_element_click method" do
83
+ it "should scroll for element and click.." do
84
+ expect(element).to receive(:element).and_return(selenium_driver)
85
+ expect(selenium_driver).to receive(:displayed?).and_return(false)
86
+ expect(element).to receive(:scroll).and_return(selenium_driver)
87
+ expect(element).to receive(:element).and_return(selenium_driver)
88
+ expect(selenium_driver).to receive(:click).and_return(true)
89
+ expect(element.scroll_for_element_click).to eql (true)
90
+ end
91
+
92
+ end
93
+
94
+ context "interaction with scroll_for_dynamic_element_click method" do
95
+ it "should click on object if it does exists on the first page" do
96
+ expect(element).to receive(:dynamic_xpath).with("expected_text").and_return(selenium_driver)
97
+ expect(selenium_driver).to receive(:displayed?).and_return(true)
98
+ expect(element).to receive(:element).and_return(selenium_driver)
99
+ expect(selenium_driver).to receive(:click).and_return(true)
100
+ expect(element.scroll_for_dynamic_element_click("expected_text")).to eql (true)
101
+ end
102
+
103
+ end
104
+
105
+ context "interaction with scroll_for_dynamic_element_click method" do
106
+ it "should scroll for element and click.." do
107
+ expect(element).to receive(:dynamic_xpath).with("expected_text").and_return(selenium_driver)
108
+ expect(selenium_driver).to receive(:displayed?).and_return(false)
109
+ expect(element).to receive(:scroll).and_return(selenium_driver)
110
+ expect(element).to receive(:element).and_return(selenium_driver)
111
+ expect(selenium_driver).to receive(:click).and_return(true)
112
+ expect(element.scroll_for_dynamic_element_click("expected_text")).to eql (true)
113
+ end
114
+
115
+ end
116
+
117
+ context "interaction with click_text method" do
118
+ it "should click on object if it does exists on the first page" do
119
+ expect(element).to receive(:exists?).and_return(true)
120
+ expect(element).to receive(:click).and_return(true)
121
+ expect(element.click_text("text")).to eq (true)
122
+ end
123
+
124
+ end
125
+
126
+ context "interaction with click_text method" do
127
+ it "should click on object if it does exists on the first page" do
128
+ expect(element).to receive(:exists?).and_return(false)
129
+ expect(element).to receive(:scroll_to_text).with("text").and_return(selenium_driver)
130
+ expect(element).to receive(:element).and_return(selenium_driver)
131
+ expect(selenium_driver).to receive(:click).and_return(true)
132
+ expect(element.click_text("text")).to eq (true)
133
+ end
134
+
135
+ end
136
+
137
+ context "interaction with click_dynamic_text method" do
138
+ it "should click on object if it does exists on the first page" do
139
+ expect(element).to receive(:dynamic_text_exists?).with("text").and_return(true)
140
+ expect(element).to receive(:element).and_return(selenium_driver)
141
+ expect(selenium_driver).to receive(:click).and_return(true)
142
+ expect(element.click_dynamic_text("text")).to eq (true)
143
+ end
144
+
145
+ end
146
+
147
+ context "interaction with click_dynamic_text method" do
148
+ it "should click on object if it does exists on the first page" do
149
+ expect(element).to receive(:dynamic_text_exists?).with("text").and_return(false)
150
+ expect(element).to receive(:scroll_to_text).with("text").and_return(selenium_driver)
151
+ expect(element).to receive(:element).and_return(selenium_driver)
152
+ expect(selenium_driver).to receive(:click).and_return(true)
153
+ expect(element.click_dynamic_text("text")).to eq (true)
154
+ end
155
+
156
+ end
157
+
158
+
159
+ context "interaction with click_exact_text method" do
160
+ it "should click on object if it does exists on the first page" do
161
+ expect(element).to receive(:exists?).and_return(true)
162
+ expect(element).to receive(:click).and_return(true)
163
+ expect(element.click_exact_text("text")).to eq (true)
164
+ end
165
+
166
+ end
167
+
168
+ context "interaction with click_exact_text method" do
169
+ it "should click on object if it does exists on the first page" do
170
+ expect(element).to receive(:exists?).and_return(false)
171
+ expect(element).to receive(:scroll_to_exact_text).with("text").and_return(selenium_driver)
172
+ expect(element).to receive(:element).and_return(selenium_driver)
173
+ expect(selenium_driver).to receive(:click).and_return(true)
174
+ expect(element.click_exact_text("text")).to eq (true)
175
+ end
176
+
177
+ end
178
+
179
+ context "interaction with click_dynamic_exact_text method" do
180
+ it "should click on object if it does exists on the first page" do
181
+ expect(element).to receive(:dynamic_text_exists?).with("text").and_return(true)
182
+ expect(element).to receive(:element).and_return(selenium_driver)
183
+ expect(selenium_driver).to receive(:click).and_return(true)
184
+ expect(element.click_dynamic_exact_text("text")).to eq (true)
185
+ end
186
+
187
+ end
188
+
189
+ context "interaction with click_exact_text method" do
190
+ it "should click on object if it does exists on the first page" do
191
+ expect(element).to receive(:dynamic_text_exists?).with("text").and_return(false)
192
+ expect(element).to receive(:scroll_to_exact_text).with("text").and_return(selenium_driver)
193
+
194
+ expect(element).to receive(:element).and_return(selenium_driver)
195
+ expect(selenium_driver).to receive(:click).and_return(true)
196
+ expect(element.click_dynamic_exact_text("text")).to eq (true)
197
+ end
198
+
199
+ end
200
+
201
+
202
+ end
203
+
204
+
205
+