appium_lib_core 4.1.0 → 9.3.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +357 -270
  3. data/README.md +68 -16
  4. data/Rakefile +8 -20
  5. data/Steepfile +11 -0
  6. data/appium_lib_core.gemspec +13 -15
  7. data/bin/console +0 -4
  8. data/lib/appium_lib_core/android/device/auth_finger_print.rb +4 -1
  9. data/lib/appium_lib_core/android/device/clipboard.rb +4 -2
  10. data/lib/appium_lib_core/android/device/emulator.rb +11 -5
  11. data/lib/appium_lib_core/android/device/network.rb +10 -0
  12. data/lib/appium_lib_core/android/device/performance.rb +3 -0
  13. data/lib/appium_lib_core/android/device/screen.rb +5 -1
  14. data/lib/appium_lib_core/android/device.rb +83 -20
  15. data/lib/appium_lib_core/common/base/bridge.rb +238 -95
  16. data/lib/appium_lib_core/common/base/capabilities.rb +21 -8
  17. data/lib/appium_lib_core/common/{command/mjsonwp.rb → base/device_ime.rb} +33 -12
  18. data/lib/appium_lib_core/common/base/driver.rb +260 -334
  19. data/lib/appium_lib_core/common/base/driver_settings.rb +51 -0
  20. data/lib/appium_lib_core/common/base/has_location.rb +80 -0
  21. data/lib/appium_lib_core/common/base/has_network_connection.rb +56 -0
  22. data/lib/appium_lib_core/common/base/http_default.rb +22 -38
  23. data/lib/appium_lib_core/{ios/uiautomation/bridge.rb → common/base/remote_status.rb} +9 -8
  24. data/lib/appium_lib_core/common/base/rotable.rb +62 -0
  25. data/lib/appium_lib_core/common/base/screenshot.rb +10 -10
  26. data/lib/appium_lib_core/common/base/search_context.rb +98 -172
  27. data/lib/appium_lib_core/common/base.rb +1 -5
  28. data/lib/appium_lib_core/common/command.rb +244 -4
  29. data/lib/appium_lib_core/common/device/app_management.rb +2 -26
  30. data/lib/appium_lib_core/common/device/context.rb +1 -5
  31. data/lib/appium_lib_core/common/device/image_comparison.rb +27 -10
  32. data/lib/appium_lib_core/common/device/keyevent.rb +4 -4
  33. data/lib/appium_lib_core/common/device/{touch_actions.rb → orientation.rb} +6 -10
  34. data/lib/appium_lib_core/common/device/screen_record.rb +8 -2
  35. data/lib/appium_lib_core/common/error.rb +5 -5
  36. data/lib/appium_lib_core/common/log.rb +5 -4
  37. data/lib/appium_lib_core/common/wait.rb +38 -6
  38. data/lib/appium_lib_core/device.rb +3 -9
  39. data/lib/appium_lib_core/driver.rb +193 -182
  40. data/lib/appium_lib_core/{patch.rb → element.rb} +64 -26
  41. data/lib/appium_lib_core/ios/device/clipboard.rb +4 -2
  42. data/lib/appium_lib_core/ios/xcuitest/device.rb +2 -0
  43. data/lib/appium_lib_core/{common/base/command.rb → mac2/bridge.rb} +9 -8
  44. data/lib/appium_lib_core/mac2/device/screen.rb +48 -0
  45. data/lib/appium_lib_core/mac2/device.rb +92 -0
  46. data/lib/appium_lib_core/{ios.rb → mac2.rb} +2 -5
  47. data/lib/appium_lib_core/support/event_firing_bridge.rb +57 -0
  48. data/lib/appium_lib_core/version.rb +2 -2
  49. data/lib/appium_lib_core.rb +23 -10
  50. data/rbs_collection.lock.yaml +252 -0
  51. data/rbs_collection.yaml +15 -0
  52. data/sig/gems/selenium/abstract_event_listener.rbs +8 -0
  53. data/sig/gems/selenium/capabilities.rbs +8 -0
  54. data/sig/gems/selenium/common.rbs +10 -0
  55. data/sig/gems/selenium/default.rbs +10 -0
  56. data/sig/gems/selenium/driver.rbs +7 -0
  57. data/sig/gems/selenium/has_session_id.rbs +8 -0
  58. data/sig/gems/selenium/has_web_storage.rbs +8 -0
  59. data/sig/gems/selenium/uploads_files.rbs +8 -0
  60. data/sig/lib/appium_lib_core/common/base/capabilities.rbs +9 -0
  61. data/sig/lib/appium_lib_core/common/base/driver.rbs +167 -0
  62. data/sig/lib/appium_lib_core/common/base/driver_settings.rbs +15 -0
  63. data/sig/lib/appium_lib_core/common/base/has_location.rbs +13 -0
  64. data/sig/lib/appium_lib_core/common/base/has_network_connection.rbs +19 -0
  65. data/sig/lib/appium_lib_core/common/base/http_default.rbs +38 -0
  66. data/sig/lib/appium_lib_core/common/base/platform.rbs +7 -0
  67. data/sig/lib/appium_lib_core/common/base/remote_status.rbs +9 -0
  68. data/sig/lib/appium_lib_core/common/base/rotable.rbs +17 -0
  69. data/sig/lib/appium_lib_core/common/base/screenshot.rbs +19 -0
  70. data/sig/lib/appium_lib_core/common/device/battery_status.rbs +13 -0
  71. data/sig/lib/appium_lib_core/common/wait.rbs +31 -0
  72. data/sig/lib/appium_lib_core/device.rbs +21 -0
  73. data/sig/lib/appium_lib_core/driver.rbs +196 -0
  74. data/sig/lib/appium_lib_core/ios/xcuitest/device/battery.rbs +15 -0
  75. data/sig/lib/appium_lib_core/version.rbs +7 -0
  76. data/sig/lib/appium_lib_core.rbs +8 -0
  77. metadata +88 -111
  78. data/.github/ISSUE_TEMPLATE/issue-report.md +0 -29
  79. data/.github/contributing.md +0 -26
  80. data/.github/issue_template.md +0 -20
  81. data/.github/workflows/unittest.yml +0 -68
  82. data/.gitignore +0 -18
  83. data/.rubocop.yml +0 -58
  84. data/azure-pipelines.yml +0 -15
  85. data/ci-jobs/functional/android_setup.yml +0 -3
  86. data/ci-jobs/functional/ios_setup.yml +0 -7
  87. data/ci-jobs/functional/publish_test_result.yml +0 -18
  88. data/ci-jobs/functional/run_appium.yml +0 -25
  89. data/ci-jobs/functional/start-emulator.sh +0 -26
  90. data/ci-jobs/functional_test.yml +0 -298
  91. data/docs/mobile_command.md +0 -34
  92. data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +0 -81
  93. data/lib/appium_lib_core/common/base/bridge/w3c.rb +0 -252
  94. data/lib/appium_lib_core/common/command/common.rb +0 -110
  95. data/lib/appium_lib_core/common/command/w3c.rb +0 -56
  96. data/lib/appium_lib_core/common/device/value.rb +0 -52
  97. data/lib/appium_lib_core/common/touch_action/multi_touch.rb +0 -56
  98. data/lib/appium_lib_core/common/touch_action/touch_actions.rb +0 -203
  99. data/lib/appium_lib_core/ios/uiautomation/device.rb +0 -44
  100. data/lib/appium_lib_core/ios/uiautomation/patch.rb +0 -34
  101. data/release_notes.md +0 -816
  102. data/script/commands.rb +0 -200
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Appium
16
- module Core
17
- # Perform a series of gestures, one after another. Gestures are chained
18
- # together and only performed when +perform()+ is called. Default is conducted by global driver.
19
- #
20
- # Each method returns the object itself, so calls can be chained.
21
- #
22
- # Consider to use W3C spec touch action like the followings.
23
- # https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
24
- # https://github.com/appium/ruby_lib_core/blob/master/test/functional/android/webdriver/w3c_actions_test.rb
25
- # https://github.com/appium/ruby_lib_core/blob/master/test/functional/ios/webdriver/w3c_actions_test.rb
26
- #
27
- # @example
28
- #
29
- # @driver = Appium::Core.for(opts).start_driver
30
- # action = Appium::Core::TouchAction.new(@driver).press(x: 45, y: 100).wait(600).release
31
- # action.perform
32
- # action = Appium::Core::TouchAction.new(@driver).swipe(....)
33
- # action.perform
34
- #
35
- class TouchAction
36
- ACTIONS = %i(move_to long_press double_tap two_finger_tap press release tap wait perform).freeze
37
- COMPLEX_ACTIONS = %i(swipe).freeze
38
-
39
- attr_reader :actions, :driver
40
-
41
- def initialize(driver)
42
- @actions = []
43
- @driver = driver
44
- end
45
-
46
- # Move to the given co-ordinates.
47
- #
48
- # +move_to+'s +x+ and +y+ have two case. One is working as coordinate, the other is working as offset.
49
- #
50
- # @param opts [Hash] Options
51
- # @option opts [integer] :x x co-ordinate to move to if element isn't set. Works as an absolute if x is set with Element.
52
- # @option opts [integer] :y y co-ordinate to move to if element isn't set. Works as an absolute if y is set with Element.
53
- # @option opts [WebDriver::Element] Element to scope this move within.
54
- def move_to(opts)
55
- opts = args_with_ele_ref(opts)
56
- chain_method(:moveTo, opts)
57
- end
58
-
59
- # Press down for a specific duration.
60
- # Alternatively, you can use +press(...).wait(...).release()+ instead of +long_press+ if duration doesn't work well.
61
- # https://github.com/appium/ruby_lib/issues/231#issuecomment-269895512
62
- # e.g. Appium::Core::TouchAction.new.press(x: 280, y: 530).wait(2000).release.perform
63
- #
64
- # @param opts [Hash] Options
65
- # @option opts [WebDriver::Element] element the element to press.
66
- # @option opts [integer] x X co-ordinate to press on.
67
- # @option opts [integer] y Y co-ordinate to press on.
68
- # @option opts [integer] duration Number of milliseconds to press.
69
- def long_press(opts)
70
- args = opts.select { |k, _v| %i(element x y duration).include? k }
71
- args = args_with_ele_ref(args)
72
- chain_method(:longPress, args) # longPress is what the appium server expects
73
- end
74
-
75
- # Press a finger onto the screen. Finger will stay down until you call +release+.
76
- #
77
- # @param opts [Hash] Options
78
- # @option opts [WebDriver::Element] :element (Optional) Element to press within.
79
- # @option opts [integer] :x x co-ordinate to press on
80
- # @option opts [integer] :y y co-ordinate to press on
81
- # @option opts [Float] pressure (iOS Only) press as force touch.
82
- # See the description of +force+ property on Apple's UITouch class
83
- # (https://developer.apple.com/documentation/uikit/uitouch?language=objc)
84
- # for more details on possible value ranges.
85
- def press(opts)
86
- args = opts.select { |k, _v| %i(element x y).include? k }
87
- args = args_with_ele_ref(args)
88
- args[:pressure] = opts.delete(:pressure) unless opts[:pressure].nil?
89
- chain_method(:press, args)
90
- end
91
-
92
- # Remove a finger from the screen.
93
- #
94
- # @param opts [Hash] Options
95
- # @option opts [WebDriver::Element] :element (Optional) Element to release from.
96
- # @option opts [integer] :x x co-ordinate to release from
97
- # @option opts [integer] :y y co-ordinate to release from
98
- def release(opts = nil)
99
- args = args_with_ele_ref(opts) if opts
100
- chain_method(:release, args)
101
- end
102
-
103
- # Touch a point on the screen.
104
- # Alternatively, you can use +press(...).release.perform+ instead of +tap(...).perform+.
105
- #
106
- # @param opts [Hash] Options
107
- # @option opts [WebDriver::Element] :element (Optional) Element to restrict scope too.
108
- # @option opts [integer] :x x co-ordinate to tap
109
- # @option opts [integer] :y y co-ordinate to tap
110
- # @option opts [integer] :fingers how many fingers to tap with (Default 1)
111
- def tap(opts)
112
- opts[:count] = opts.delete(:fingers) if opts[:fingers]
113
- opts[:count] ||= 1
114
- args = args_with_ele_ref opts
115
- chain_method(:tap, args)
116
- end
117
-
118
- # Double tap an element on the screen
119
- #
120
- # @param opts [Hash] Options
121
- # @option opts [WebDriver::Element] :element (Optional) Element to restrict scope too.
122
- # @option opts [integer] :x x co-ordinate to tap
123
- # @option opts [integer] :y y co-ordinate to tap
124
-
125
- def double_tap(opts)
126
- args = opts.select { |k, _v| %i(element x y).include? k }
127
- args = args_with_ele_ref(args)
128
- chain_method(:doubleTap, args) # doubleTap is what the appium server expects
129
- end
130
-
131
- # Two finger tap an element on the screen
132
- #
133
- # @param opts [Hash] Options
134
- # @option opts [WebDriver::Element] :element (Optional) Element to restrict scope too.
135
- # @option opts [integer] :x x co-ordinate to tap
136
- # @option opts [integer] :y y co-ordinate to tap
137
- def two_finger_tap(opts)
138
- args = opts.select { |k, _v| %i(element x y).include? k }
139
- args = args_with_ele_ref(args)
140
- chain_method(:twoFingerTap, args) # twoFingerTap is what the appium server expects
141
- end
142
-
143
- # Pause for a number of milliseconds before the next action
144
- # @param milliseconds [integer] Number of milliseconds to pause for
145
- def wait(milliseconds)
146
- args = { ms: milliseconds }
147
- chain_method(:wait, args)
148
- end
149
-
150
- # Convenience method to perform a swipe.
151
- #
152
- # @param opts [Hash] Options
153
- # @option opts [int] :start_x Where to start swiping, on the x axis. Default 0.
154
- # @option opts [int] :start_y Where to start swiping, on the y axis. Default 0.
155
- # @option opts [int] :end_x Move to the end, on the x axis. Default 0.
156
- # @option opts [int] :end_y Move to the end, on the y axis. Default 0.
157
- # @option opts [int] :duration How long the actual swipe takes to complete in milliseconds. Default 200.
158
- def swipe(opts)
159
- start_x = opts.fetch :start_x, 0
160
- start_y = opts.fetch :start_y, 0
161
- end_x = opts.fetch :end_x, 0
162
- end_y = opts.fetch :end_y, 0
163
-
164
- duration = opts.fetch :duration, 200
165
-
166
- press x: start_x, y: start_y
167
- wait(duration) if duration
168
- move_to x: end_x, y: end_y
169
-
170
- release
171
-
172
- self
173
- end
174
-
175
- # Ask the driver to perform all actions in this action chain.
176
- def perform
177
- @driver.touch_actions @actions
178
- @actions.clear
179
- self
180
- end
181
-
182
- # Does nothing, currently.
183
- def cancel
184
- @actions << { action: cancel }
185
- @driver.touch_actions @actions
186
- self
187
- end
188
-
189
- private
190
-
191
- def chain_method(method, args = nil)
192
- action = args ? { action: method, options: args } : { action: method }
193
- @actions << action
194
- self
195
- end
196
-
197
- def args_with_ele_ref(args)
198
- args[:element] = args[:element].ref if args.key? :element
199
- args
200
- end
201
- end # class TouchAction
202
- end # module Core
203
- end # module Appium
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Appium
16
- module Core
17
- module Ios
18
- module Uiautomation
19
- module Device
20
- def self.add_methods
21
- # UiAutomation, Override included method in bridge
22
- ::Appium::Core::Device.add_endpoint_method(:hide_keyboard) do
23
- def hide_keyboard(close_key = nil, strategy = nil)
24
- option = {}
25
-
26
- option[:key] = close_key || 'Done' # default to Done key.
27
- option[:strategy] = strategy || :pressKey # default to pressKey
28
-
29
- execute :hide_keyboard, {}, option
30
- end
31
- end
32
-
33
- # UiAutomation, Override included method in bridge
34
- ::Appium::Core::Device.add_endpoint_method(:background_app) do
35
- def background_app(duration = 0)
36
- execute :background_app, {}, seconds: duration
37
- end
38
- end
39
- end
40
- end # module Device
41
- end # module Uiautomation
42
- end # module Ios
43
- end # module Core
44
- end # module Appium
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Appium
16
- module Core
17
- module Ios
18
- module Uiautomation
19
- # @private
20
- # class_eval inside a method because class Selenium::WebDriver::Element
21
- # will trigger as soon as the file is required. in contrast a method
22
- # will trigger only when invoked.
23
- def self.patch_webdriver_element
24
- ::Selenium::WebDriver::Element.class_eval do
25
- # Cross platform way of entering text into a textfield
26
- def type(text, driver)
27
- driver.execute_script %(au.getElement('#{ref}').setValue('#{text}');)
28
- end # def type
29
- end # Selenium::WebDriver::Element.class_eval
30
- end # def patch_webdriver_element
31
- end # module Uiautomation
32
- end # module Ios
33
- end # module Core
34
- end # module Appium