screen-object 1.0.0

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 (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,36 @@
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
+ #require_relative File.expand_path('../element',__FILE__)
16
+
17
+
18
+ module ScreenObject
19
+ module AppElements
20
+ class Button < AppElements::Element
21
+
22
+ def tap
23
+ element.click
24
+ end
25
+
26
+ def enabled?
27
+ begin
28
+ element.enabled?
29
+ rescue
30
+ false
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,38 @@
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
+
16
+ module ScreenObject
17
+ module AppElements
18
+ class CheckBox < AppElements::Element
19
+
20
+ def checked?
21
+ if element.attribute('checked') == 'true'
22
+ return true
23
+ else
24
+ return false
25
+ end
26
+ end
27
+
28
+ def check
29
+ element.click unless checked?
30
+ end
31
+
32
+ def uncheck
33
+ element.click if checked?
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,144 @@
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 AppElements
17
+
18
+ class Element
19
+
20
+ attr_reader :locator
21
+
22
+ def initialize(locator)
23
+ @locator=locator.split("~")
24
+ end
25
+
26
+ def driver
27
+ $driver
28
+ end
29
+
30
+ def click
31
+ element.click
32
+ end
33
+
34
+ def value
35
+ element.value
36
+ end
37
+
38
+ def exists?
39
+ begin
40
+ element.displayed?
41
+ rescue
42
+ false
43
+ end
44
+ end
45
+
46
+ def element
47
+ driver.find_element(:"#{locator[0]}",locator[1])
48
+ end
49
+
50
+ def elements
51
+ driver.find_elements(:"#{locator[0]}",locator[1])
52
+ end
53
+
54
+ def element_attributes
55
+ %w[name resource-id value text]
56
+ end
57
+
58
+ def dynamic_xpath(text)
59
+ concat_attribute=[]
60
+ element_attributes.each{|i| concat_attribute << %Q(contains(@#{i}, '#{text}'))}
61
+ puts "//#{locator[0]}[#{concat_attribute.join(' or ')}]"
62
+ locator1="xpath~//#{locator[0]}[#{concat_attribute.join(' or ')}]"
63
+ @locator=locator1.split("~")
64
+ element
65
+ end
66
+
67
+ def dynamic_text_exists? dynamic_text
68
+ begin
69
+ dynamic_xpath(dynamic_text).displayed?
70
+ rescue
71
+ false
72
+ end
73
+ end
74
+
75
+ def scroll
76
+ $driver.execute_script 'mobile: scrollTo',:element => element.ref
77
+ # $driver.execute_script("mobile: scroll",:direction => direction.downcase, :element => element.ref)
78
+ end
79
+
80
+ def scroll_to_text(text)
81
+ $driver.scroll_to(text)
82
+ end
83
+
84
+ def scroll_to_exact_text(text)
85
+ $driver.scroll_to_exact(text)
86
+ end
87
+
88
+ def scroll_for_element_click
89
+ if element.displayed?
90
+ element.click
91
+ else
92
+ scroll
93
+ element.click
94
+ end
95
+ end
96
+
97
+ def scroll_for_dynamic_element_click (expected_text)
98
+ if dynamic_xpath(expected_text).displayed?
99
+ element.click
100
+ else
101
+ scroll
102
+ element.click
103
+ end
104
+ end
105
+
106
+ def click_text(text)
107
+ if exists?
108
+ click
109
+ else
110
+ scroll_to_text(text)
111
+ element.click
112
+ end
113
+ end
114
+
115
+ def click_dynamic_text(text)
116
+ if dynamic_text_exists?(text)
117
+ element.click
118
+ else
119
+ scroll_to_text(text)
120
+ element.click
121
+ end
122
+ end
123
+
124
+ def click_exact_text(text)
125
+ if exists?
126
+ click
127
+ else
128
+ scroll_to_exact_text(text)
129
+ element.click
130
+ end
131
+ end
132
+
133
+ def click_dynamic_exact_text(text)
134
+ if dynamic_text_exists?(text)
135
+ element.click
136
+ else
137
+ scroll_to_exact_text(text)
138
+ element.click
139
+ end
140
+ end
141
+
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,25 @@
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 AppElements
17
+ class Image < AppElements::Element
18
+
19
+ def click
20
+ element.click
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
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 AppElements
17
+
18
+ class Table < AppElements::Element
19
+
20
+ def cell_count
21
+ elements.length
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,46 @@
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 AppElements
17
+ class Text < AppElements::Element
18
+
19
+ def text
20
+ element.text()
21
+ end
22
+
23
+ def click
24
+ element.click
25
+ end
26
+
27
+ def dynamic_text_exists? dynamic_text
28
+ begin
29
+ dynamic_xpath(dynamic_text).displayed?
30
+ rescue
31
+ false
32
+ end
33
+ end
34
+
35
+ def dynamic_text dynamic_text
36
+ begin
37
+ dynamic_xpath(dynamic_text).displayed?
38
+ text
39
+ rescue
40
+ false
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,41 @@
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 AppElements
17
+ class TextField < AppElements::Element
18
+
19
+ def text=(text)
20
+ element.send_keys text
21
+ end
22
+
23
+ def text
24
+ element.text
25
+ end
26
+
27
+ def clear
28
+ element.clear
29
+ end
30
+
31
+ def enabled?
32
+ begin
33
+ element.enabled?
34
+ rescue
35
+ false
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,58 @@
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
+ require 'childprocess'
16
+
17
+ #
18
+ # This class is designed to start and stop the appium server process. In order to use
19
+ # it you must have appium and node installed on your computer. You can pass parameters
20
+ # to appium at startup via the constructor.
21
+ #
22
+ module ScreenObject
23
+ class AppiumServer
24
+
25
+ attr_accessor :process
26
+
27
+
28
+ def initialize(params={})
29
+ @params = params
30
+ end
31
+
32
+ #
33
+ # Start the appium server
34
+ #
35
+ def start
36
+ @process = ChildProcess.build(*parameters)
37
+ process.start
38
+ end
39
+
40
+ #
41
+ # Stop the appium server
42
+ #
43
+ def stop
44
+ process.stop
45
+ end
46
+
47
+ private
48
+
49
+ def parameters
50
+ cmd = ['appium']
51
+ @params.each do |key, value|
52
+ cmd << '--'+key.to_s
53
+ cmd << value.to_s if not value.nil? and value.size > 0
54
+ end
55
+ cmd
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,21 @@
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
+ require 'screen-object/accessors/element'
16
+ require 'screen-object/accessors/button'
17
+ require 'screen-object/accessors/image'
18
+ require 'screen-object/accessors/text'
19
+ require 'screen-object/accessors/textfield'
20
+ require 'screen-object/accessors/checkbox'
21
+ require 'screen-object/accessors/table'