appium_lib_core 4.1.0 → 5.0.3

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +8 -0
  3. data/.github/workflows/codeql-analysis.yml +70 -0
  4. data/.github/workflows/unittest.yml +8 -9
  5. data/.rubocop.yml +95 -1
  6. data/CHANGELOG.md +102 -275
  7. data/README.md +11 -6
  8. data/Rakefile +4 -0
  9. data/appium_lib_core.gemspec +4 -7
  10. data/bin/console +0 -4
  11. data/ci-jobs/functional/run_appium.yml +3 -3
  12. data/ci-jobs/functional_test.yml +3 -3
  13. data/docs/mobile_command.md +2 -2
  14. data/lib/appium_lib_core/android/device/auth_finger_print.rb +2 -1
  15. data/lib/appium_lib_core/android/device.rb +4 -4
  16. data/lib/appium_lib_core/common/base/bridge.rb +297 -90
  17. data/lib/appium_lib_core/common/base/capabilities.rb +10 -3
  18. data/lib/appium_lib_core/common/base/device_ime.rb +49 -0
  19. data/lib/appium_lib_core/common/base/driver.rb +198 -184
  20. data/lib/appium_lib_core/common/base/driver_settings.rb +51 -0
  21. data/lib/appium_lib_core/common/base/has_location.rb +80 -0
  22. data/lib/appium_lib_core/common/base/has_network_connection.rb +56 -0
  23. data/lib/appium_lib_core/common/base/http_default.rb +1 -3
  24. data/lib/appium_lib_core/common/base/remote_status.rb +31 -0
  25. data/lib/appium_lib_core/common/base/rotable.rb +54 -0
  26. data/lib/appium_lib_core/common/base/screenshot.rb +6 -6
  27. data/lib/appium_lib_core/common/base/search_context.rb +19 -4
  28. data/lib/appium_lib_core/common/base.rb +1 -3
  29. data/lib/appium_lib_core/common/command.rb +257 -4
  30. data/lib/appium_lib_core/common/device/app_management.rb +2 -14
  31. data/lib/appium_lib_core/common/device/image_comparison.rb +12 -4
  32. data/lib/appium_lib_core/common/device/keyevent.rb +4 -4
  33. data/lib/appium_lib_core/common/{command/mjsonwp.rb → device/orientation.rb} +14 -11
  34. data/lib/appium_lib_core/common/device/touch_actions.rb +2 -0
  35. data/lib/appium_lib_core/common/device/value.rb +6 -6
  36. data/lib/appium_lib_core/common/error.rb +4 -1
  37. data/lib/appium_lib_core/common/log.rb +4 -1
  38. data/lib/appium_lib_core/common/touch_action/multi_touch.rb +19 -0
  39. data/lib/appium_lib_core/common/touch_action/touch_actions.rb +16 -2
  40. data/lib/appium_lib_core/common/wait.rb +38 -6
  41. data/lib/appium_lib_core/device.rb +1 -5
  42. data/lib/appium_lib_core/driver.rb +30 -46
  43. data/lib/appium_lib_core/{patch.rb → element.rb} +66 -9
  44. data/lib/appium_lib_core/ios/uiautomation/patch.rb +1 -1
  45. data/lib/appium_lib_core/{common/base/command.rb → mac2/bridge.rb} +9 -8
  46. data/lib/appium_lib_core/mac2/device/screen.rb +48 -0
  47. data/lib/appium_lib_core/mac2/device.rb +92 -0
  48. data/lib/appium_lib_core/mac2.rb +17 -0
  49. data/lib/appium_lib_core/version.rb +2 -2
  50. data/lib/appium_lib_core.rb +2 -5
  51. data/release_notes.md +140 -0
  52. data/script/commands.rb +3 -37
  53. metadata +27 -68
  54. data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +0 -81
  55. data/lib/appium_lib_core/common/base/bridge/w3c.rb +0 -252
  56. data/lib/appium_lib_core/common/command/common.rb +0 -110
  57. data/lib/appium_lib_core/common/command/w3c.rb +0 -56
@@ -1,252 +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
- class Base
18
- class Bridge
19
- class W3C < ::Selenium::WebDriver::Remote::W3C::Bridge
20
- include Device::DeviceLock
21
- include Device::Keyboard
22
- include Device::ImeActions
23
- include Device::Setting
24
- include Device::Context
25
- include Device::Value
26
- include Device::FileManagement
27
- include Device::KeyEvent
28
- include Device::ImageComparison
29
- include Device::AppManagement
30
- include Device::AppState
31
- include Device::ScreenRecord::Command
32
- include Device::Device
33
- include Device::TouchActions
34
- include Device::ExecuteDriver
35
-
36
- def commands(command)
37
- ::Appium::Core::Commands::W3C::COMMANDS[command]
38
- end
39
-
40
- # Returns all available sessions on the Appium server instance
41
- def sessions
42
- execute :get_all_sessions
43
- end
44
-
45
- # Perform touch actions for W3C module.
46
- # Generate +touch+ pointer action here and users can use this via +driver.action+
47
- # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
48
- # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/PointerActions.html
49
- # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/KeyActions.html
50
- #
51
- # 'mouse' action is by default in the Ruby client. Appium server force the +mouse+ action to +touch+ once in
52
- # the server side. So we don't consider the case.
53
- #
54
- # @example
55
- #
56
- # element = @driver.find_element(:id, "some id")
57
- # @driver.action.click(element).perform # The 'click' is a part of 'PointerActions'
58
- #
59
- def action(async = false)
60
- # Used for default duration of each touch actions
61
- # Override from 250 milliseconds to 50 milliseconds
62
- action_builder = super
63
- action_builder.default_move_duration = 0.05
64
- action_builder
65
- end
66
-
67
- # Port from MJSONWP
68
- def get_timeouts
69
- execute :get_timeouts
70
- end
71
-
72
- # Port from MJSONWP
73
- def session_capabilities
74
- ::Selenium::WebDriver::Remote::W3C::Capabilities.json_create execute(:get_capabilities)
75
- end
76
-
77
- # Port from MJSONWP
78
- def send_keys_to_active_element(key)
79
- text = ::Selenium::WebDriver::Keys.encode(key).join('')
80
- execute :send_keys_to_active_element, {}, { value: text.split(//) }
81
- end
82
-
83
- # For Appium
84
- # override
85
- def page_source
86
- # For W3C
87
- # execute_script('var source = document.documentElement.outerHTML;' \
88
- # 'if (!source) { source = new XMLSerializer().serializeToString(document); }' \
89
- # 'return source;')
90
- execute :get_page_source
91
- end
92
-
93
- # For Appium
94
- # override
95
- def element_displayed?(element)
96
- # For W3C
97
- # https://github.com/SeleniumHQ/selenium/commit/b618499adcc3a9f667590652c5757c0caa703289
98
- # execute_atom :isDisplayed, element
99
- execute :is_element_displayed, id: element.ref
100
- end
101
-
102
- # For Appium
103
- # override
104
- def element_attribute(element, name)
105
- # For W3C in Selenium Client
106
- # execute_atom :getAttribute, element, name
107
- execute :get_element_attribute, id: element.ref, name: name
108
- end
109
-
110
- # For Appium
111
- # override
112
- def find_element_by(how, what, parent = nil)
113
- how, what = convert_locators(how, what)
114
-
115
- id = if parent
116
- execute :find_child_element, { id: parent }, { using: how, value: what }
117
- else
118
- execute :find_element, {}, { using: how, value: what }
119
- end
120
- ::Selenium::WebDriver::Element.new self, element_id_from(id)
121
- end
122
-
123
- # For Appium
124
- # override
125
- def find_elements_by(how, what, parent = nil)
126
- how, what = convert_locators(how, what)
127
-
128
- ids = if parent
129
- execute :find_child_elements, { id: parent }, { using: how, value: what }
130
- else
131
- execute :find_elements, {}, { using: how, value: what }
132
- end
133
-
134
- ids.map { |id| ::Selenium::WebDriver::Element.new self, element_id_from(id) }
135
- end
136
-
137
- # For Appium
138
- # @param [Hash] id The id which can get as a response from server
139
- # @return [::Selenium::WebDriver::Element]
140
- def convert_to_element(id)
141
- ::Selenium::WebDriver::Element.new self, element_id_from(id)
142
- end
143
-
144
- # For Appium
145
- # override
146
- # called in 'extend DriverExtensions::HasNetworkConnection'
147
- def network_connection
148
- execute :get_network_connection
149
- end
150
-
151
- # For Appium
152
- # override
153
- # called in 'extend DriverExtensions::HasNetworkConnection'
154
- def network_connection=(type)
155
- execute :set_network_connection, {}, { parameters: { type: type } }
156
- end
157
-
158
- # For Appium
159
- # No implementation for W3C webdriver module
160
- # called in 'extend DriverExtensions::HasLocation'
161
- def location
162
- obj = execute(:get_location) || {}
163
- ::Selenium::WebDriver::Location.new obj['latitude'], obj['longitude'], obj['altitude']
164
- end
165
-
166
- # For Appium
167
- # No implementation for W3C webdriver module
168
- # called in +extend DriverExtensions::HasLocation+
169
- # It has below code as well. We should consider the same context in Selenium 4 as backward compatibility.
170
- #
171
- # def location=(loc)
172
- # # note: Location = Struct.new(:latitude, :longitude, :altitude)
173
- # raise TypeError, "expected #{Location}, got #{loc.inspect}:#{loc.class}" unless loc.is_a?(Location)
174
- #
175
- # @bridge.set_location loc.latitude, loc.longitude, loc.altitude
176
- # end
177
- #
178
- def set_location(lat, lon, alt = 0.0)
179
- loc = { latitude: lat, longitude: lon, altitude: alt }
180
- execute :set_location, {}, { location: loc }
181
- end
182
-
183
- #
184
- # logs
185
- #
186
- # For Appium
187
- # No implementation for W3C webdriver module
188
- def available_log_types
189
- types = execute :get_available_log_types
190
- Array(types).map(&:to_sym)
191
- end
192
-
193
- # For Appium
194
- # No implementation for W3C webdriver module
195
- def log(type)
196
- data = execute :get_log, {}, { type: type.to_s }
197
-
198
- Array(data).map do |l|
199
- begin
200
- ::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
201
- rescue KeyError
202
- next
203
- end
204
- end
205
- end
206
-
207
- # For Appium
208
- def log_event(vendor, event)
209
- execute :post_log_event, {}, { vendor: vendor, event: event }
210
- end
211
-
212
- # For Appium
213
- def log_events(type = nil)
214
- args = {}
215
- args['type'] = type unless type.nil?
216
-
217
- execute :get_log_events, {}, args
218
- end
219
-
220
- def take_viewport_screenshot
221
- execute_script('mobile: viewportScreenshot')
222
- end
223
-
224
- def take_element_screenshot(element)
225
- execute :take_element_screenshot, id: element.ref
226
- end
227
-
228
- private
229
-
230
- # Don't convert locators for Appium Client
231
- # TODO: Only for Appium. Ideally, we'd like to keep the selenium-webdriver
232
- def convert_locators(how, what)
233
- # case how
234
- # when 'class name'
235
- # how = 'css selector'
236
- # what = ".#{escape_css(what)}"
237
- # when 'id'
238
- # how = 'css selector'
239
- # what = "##{escape_css(what)}"
240
- # when 'name'
241
- # how = 'css selector'
242
- # what = "*[name='#{escape_css(what)}']"
243
- # when 'tag name'
244
- # how = 'css selector'
245
- # end
246
- [how, what]
247
- end
248
- end # class W3C
249
- end # class Bridge
250
- end # class Base
251
- end # module Core
252
- end # module Appium
@@ -1,110 +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
- # ref: https://github.com/appium/appium-base-driver/blob/master/lib/mjsonwp/routes.js
18
- module Commands
19
- # Some commands differ for each driver.
20
- COMMAND = {
21
- # common
22
- get_all_sessions: [:get, 'sessions'],
23
- available_contexts: [:get, 'session/:session_id/contexts'],
24
- set_context: [:post, 'session/:session_id/context'],
25
- current_context: [:get, 'session/:session_id/context'],
26
-
27
- touch_actions: [:post, 'session/:session_id/touch/perform'],
28
- multi_touch: [:post, 'session/:session_id/touch/multi/perform'],
29
-
30
- set_immediate_value: [:post, 'session/:session_id/appium/element/:id/value'],
31
- replace_value: [:post, 'session/:session_id/appium/element/:id/replace_value'],
32
-
33
- launch_app: [:post, 'session/:session_id/appium/app/launch'],
34
- close_app: [:post, 'session/:session_id/appium/app/close'],
35
- reset: [:post, 'session/:session_id/appium/app/reset'],
36
- background_app: [:post, 'session/:session_id/appium/app/background'],
37
- app_strings: [:post, 'session/:session_id/appium/app/strings'],
38
-
39
- device_locked?: [:post, 'session/:session_id/appium/device/is_locked'],
40
- unlock: [:post, 'session/:session_id/appium/device/unlock'],
41
- lock: [:post, 'session/:session_id/appium/device/lock'],
42
- device_time: [:get, 'session/:session_id/appium/device/system_time'],
43
- install_app: [:post, 'session/:session_id/appium/device/install_app'],
44
- remove_app: [:post, 'session/:session_id/appium/device/remove_app'],
45
- app_installed?: [:post, 'session/:session_id/appium/device/app_installed'],
46
- activate_app: [:post, 'session/:session_id/appium/device/activate_app'],
47
- terminate_app: [:post, 'session/:session_id/appium/device/terminate_app'],
48
- app_state: [:post, 'session/:session_id/appium/device/app_state'],
49
- shake: [:post, 'session/:session_id/appium/device/shake'],
50
- hide_keyboard: [:post, 'session/:session_id/appium/device/hide_keyboard'],
51
- press_keycode: [:post, 'session/:session_id/appium/device/press_keycode'],
52
- long_press_keycode: [:post, 'session/:session_id/appium/device/long_press_keycode'],
53
- # keyevent is only for Selendroid
54
- keyevent: [:post, 'session/:session_id/appium/device/keyevent'],
55
- push_file: [:post, 'session/:session_id/appium/device/push_file'],
56
- pull_file: [:post, 'session/:session_id/appium/device/pull_file'],
57
- pull_folder: [:post, 'session/:session_id/appium/device/pull_folder'],
58
- get_clipboard: [:post, 'session/:session_id/appium/device/get_clipboard'],
59
- set_clipboard: [:post, 'session/:session_id/appium/device/set_clipboard'],
60
- finger_print: [:post, 'session/:session_id/appium/device/finger_print'],
61
- get_settings: [:get, 'session/:session_id/appium/settings'],
62
- update_settings: [:post, 'session/:session_id/appium/settings'],
63
- stop_recording_screen: [:post, 'session/:session_id/appium/stop_recording_screen'],
64
- start_recording_screen: [:post, 'session/:session_id/appium/start_recording_screen'],
65
- compare_images: [:post, 'session/:session_id/appium/compare_images'],
66
- is_keyboard_shown: [:get, 'session/:session_id/appium/device/is_keyboard_shown'],
67
- execute_driver: [:post, 'session/:session_id/appium/execute_driver'],
68
- post_log_event: [:post, 'session/:session_id/appium/log_event'],
69
- get_log_events: [:post, 'session/:session_id/appium/events']
70
- }.freeze
71
-
72
- COMMAND_ANDROID = {
73
- open_notifications: [:post, 'session/:session_id/appium/device/open_notifications'],
74
- toggle_airplane_mode: [:post, 'session/:session_id/appium/device/toggle_airplane_mode'],
75
- start_activity: [:post, 'session/:session_id/appium/device/start_activity'],
76
- current_activity: [:get, 'session/:session_id/appium/device/current_activity'],
77
- current_package: [:get, 'session/:session_id/appium/device/current_package'],
78
- get_system_bars: [:get, 'session/:session_id/appium/device/system_bars'],
79
- get_display_density: [:get, 'session/:session_id/appium/device/display_density'],
80
- toggle_wifi: [:post, 'session/:session_id/appium/device/toggle_wifi'],
81
- toggle_data: [:post, 'session/:session_id/appium/device/toggle_data'],
82
- toggle_location_services: [:post, 'session/:session_id/appium/device/toggle_location_services'],
83
- end_coverage: [:post, 'session/:session_id/appium/app/end_test_coverage'],
84
- get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'],
85
- get_performance_data: [:post, 'session/:session_id/appium/getPerformanceData'],
86
- get_network_connection: [:get, 'session/:session_id/network_connection'], # defined also in OSS
87
- set_network_connection: [:post, 'session/:session_id/network_connection'], # defined also in OSS
88
-
89
- # only emulator
90
- send_sms: [:post, 'session/:session_id/appium/device/send_sms'],
91
- gsm_call: [:post, 'session/:session_id/appium/device/gsm_call'],
92
- gsm_signal: [:post, 'session/:session_id/appium/device/gsm_signal'],
93
- gsm_voice: [:post, 'session/:session_id/appium/device/gsm_voice'],
94
- set_network_speed: [:post, 'session/:session_id/appium/device/network_speed'],
95
- set_power_capacity: [:post, 'session/:session_id/appium/device/power_capacity'],
96
- set_power_ac: [:post, 'session/:session_id/appium/device/power_ac'],
97
-
98
- # For chromium: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
99
- chrome_send_command: [:post, 'session/:session_id/goog/cdp/execute']
100
- }.freeze
101
-
102
- COMMAND_IOS = {
103
- touch_id: [:post, 'session/:session_id/appium/simulator/touch_id'],
104
- toggle_touch_id_enrollment: [:post, 'session/:session_id/appium/simulator/toggle_touch_id_enrollment']
105
- }.freeze
106
-
107
- COMMANDS = {}.merge(COMMAND).merge(COMMAND_ANDROID).merge(COMMAND_IOS).freeze
108
- end # module Commands
109
- end # module Core
110
- end # module Appium
@@ -1,56 +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 Commands
18
- module W3C
19
- COMMANDS = ::Appium::Core::Commands::COMMANDS.merge(::Appium::Core::Base::Commands::W3C).merge(
20
- {
21
- # ::Appium::Core::Base::Commands::OSS has the following commands and Appium also use them.
22
- # Delegated to ::Appium::Core::Base::Commands::OSS commands
23
- status: [:get, 'status'], # https://w3c.github.io/webdriver/#dfn-status
24
- is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'], # hint: https://w3c.github.io/webdriver/#element-displayedness
25
-
26
- get_timeouts: [:get, 'session/:session_id/timeouts'], # https://w3c.github.io/webdriver/#get-timeouts
27
-
28
- # Add OSS commands to W3C commands. We can remove them if we would like to remove them from W3C module.
29
- ### Session capability
30
- get_capabilities: [:get, 'session/:session_id'],
31
-
32
- ### rotatable
33
- get_screen_orientation: [:get, 'session/:session_id/orientation'],
34
- set_screen_orientation: [:post, 'session/:session_id/orientation'],
35
-
36
- get_location: [:get, 'session/:session_id/location'],
37
- set_location: [:post, 'session/:session_id/location'],
38
-
39
- ### For IME
40
- ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'],
41
- ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'],
42
- ime_is_activated: [:get, 'session/:session_id/ime/activated'],
43
- ime_deactivate: [:post, 'session/:session_id/ime/deactivate'],
44
- ime_activate_engine: [:post, 'session/:session_id/ime/activate'],
45
-
46
- send_keys_to_active_element: [:post, 'session/:session_id/keys'],
47
-
48
- ### Logs
49
- get_available_log_types: [:get, 'session/:session_id/log/types'],
50
- get_log: [:post, 'session/:session_id/log']
51
- }
52
- ).freeze
53
- end # module W3C
54
- end # module Commands
55
- end # module Core
56
- end # module Appium