appium_lib_core 4.1.0 → 9.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +352 -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 +263 -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 +207 -164
  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 +200 -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
@@ -12,176 +12,102 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- module Appium
16
- module Core
17
- class Base
18
- module SearchContext
19
- # referenced: ::Selenium::WebDriver::SearchContext
20
-
21
- FINDERS = ::Selenium::WebDriver::SearchContext::FINDERS.merge(
22
- accessibility_id: 'accessibility id',
23
- image: '-image',
24
- custom: '-custom',
25
- # Android
26
- uiautomator: '-android uiautomator', # Unavailable in Espresso
27
- viewtag: '-android viewtag', # Available in Espresso
28
- data_matcher: '-android datamatcher', # Available in Espresso
29
- view_matcher: '-android viewmatcher', # Available in Espresso
30
- # iOS
31
- uiautomation: '-ios uiautomation',
32
- predicate: '-ios predicate string',
33
- class_chain: '-ios class chain',
34
- # Windows with windows prefix
35
- windows_uiautomation: '-windows uiautomation',
36
- # Tizen with Tizen prefix
37
- tizen_uiautomation: '-tizen uiautomation'
38
- )
39
-
40
- # rubocop:disable Layout/LineLength
41
- #
42
- # Find the first element matching the given arguments
43
- #
44
- # - Android can find with uiautomator like a {http://developer.android.com/tools/help/uiautomator/UiSelector.html UISelector}.
45
- # - iOS can find with a {https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAWindowClassReference/UIAWindow/UIAWindow.html#//apple_ref/doc/uid/TP40009930 UIAutomation command}.
46
- # - iOS, only for XCUITest(WebDriverAgent), can find with a {https://github.com/facebook/WebDriverAgent/wiki/Queries class chain}
47
- #
48
- # == Find with image
49
- # Return an element if current view has a partial image. The logic depends on template matching by OpenCV.
50
- # {https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md image-comparison}
51
- #
52
- # You can handle settings for the comparision following {https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6 here}
53
- #
54
- # == Espresso viewmatcher and datamatcher
55
- # Espresso has {https://developer.android.com/training/testing/espresso/basics _onView_ matcher}
56
- # and {https://medium.com/androiddevelopers/adapterviews-and-espresso-f4172aa853cf _onData_ matcher} for more reference
57
- # that allows you to target adapters instead of Views. This method find methods based on reflections
58
- #
59
- # This is a selector strategy that allows users to pass a selector of the form:
60
- #
61
- # <code>{ name: '<name>', args: ['arg1', 'arg2', '...'], class: '<optional class>' }</code>
62
- #
63
- # - _name_: The name of a method to invoke. The method must return
64
- # a Hamcrest {http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matcher.html Matcher}
65
- # - _args_: The args provided to the method
66
- # - _class_: The class name that the method is part of (defaults to <code>org.hamcrest.Matchers</code>).
67
- # Can be fully qualified, or simple, and simple defaults to <code>androidx.test.espresso.matcher</code> package
68
- # (e.g.: <code>class=CursorMatchers</code> fully qualified is <code>class=androidx.test.espresso.matcher.CursorMatchers</code>
69
- #
70
- # See example how to send viewmatcher and datamatcher in Ruby client
71
- #
72
- #
73
- # @overload find_element(how, what)
74
- # @param [Symbol, String] how The method to find the element by
75
- # @param [String] what The locator to use
76
- #
77
- # @overload find_element(opts)
78
- # @param [Hash] opts Find options
79
- # @option opts [Symbol] :how Key named after the method to find the element by, containing the locator
80
- # @return [Element]
81
- # @raise [Error::NoSuchElementError] if the element doesn't exist
82
- #
83
- # @example Find element with each keys
84
- #
85
- # # with accessibility id. All platforms.
86
- # @driver.find_elements :accessibility_id, 'Animation'
87
- # @driver.find_elements :accessibility_id, 'Animation'
88
- #
89
- # # with base64 encoded template image. All platforms.
90
- # @driver.find_elements :image, Base64.strict_encode64(File.read(file_path))
91
- #
92
- # # For Android
93
- # ## With uiautomator
94
- # @driver.find_elements :uiautomator, 'new UiSelector().clickable(true)'
95
- # ## With viewtag, but only for Espresso
96
- # ## 'setTag'/'getTag' in https://developer.android.com/reference/android/view/View
97
- # @driver.find_elements :viewtag, 'new UiSelector().clickable(true)'
98
- # # With data_matcher. The argument should be JSON format.
99
- # @driver.find_elements :data_matcher, { name: 'hasEntry', args: %w(title Animation) }.to_json
100
- #
101
- # # For iOS
102
- # ## With :predicate
103
- # @driver.find_elements :predicate, "isWDVisible == 1"
104
- # @driver.find_elements :predicate, 'wdName == "Buttons"'
105
- # @driver.find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'
106
- #
107
- # ## With Class Chain
108
- # ### select the third child button of the first child window element
109
- # @driver.find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
110
- # ### select all the children windows
111
- # @driver.find_elements :class_chain, 'XCUIElementTypeWindow'
112
- # ### select the second last child of the second child window
113
- # @driver.find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
114
- # ### matching predicate. <code>'</code> is the mark.
115
- # @driver.find_elements :class_chain, 'XCUIElementTypeWindow['visible = 1]['name = "bla"']'
116
- # ### containing predicate. '$' is the mark.
117
- # ### Require appium-xcuitest-driver 2.54.0+. PR: https://github.com/facebook/WebDriverAgent/pull/707/files
118
- # @driver.find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
119
- # e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
120
- # e.tag_name #=> "XCUIElementTypeWindow"
121
- # e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
122
- # e.tag_name #=> "XCUIElementTypeStaticText"
123
- #
124
- # # For Windows
125
- # @driver.find_elements :windows_uiautomation, '....'
126
- #
127
- # # For Tizen
128
- # @driver.find_elements :tizen_uiautomation, '....'
129
- #
130
- # rubocop:enable Layout/LineLength
131
- def find_element(*args)
132
- how, what = extract_args(args)
133
- by = _set_by_from_finders(how)
134
- begin
135
- bridge.find_element_by by, what.to_s, ref
136
- rescue Selenium::WebDriver::Error::TimeoutError
137
- raise Selenium::WebDriver::Error::NoSuchElementError
138
- end
139
- end
140
-
141
- #
142
- # Find all elements matching the given arguments
143
- #
144
- # @see SearchContext#find_elements
145
- #
146
- def find_elements(*args)
147
- how, what = extract_args(args)
148
- by = _set_by_from_finders(how)
149
- begin
150
- bridge.find_elements_by by, what.to_s, ref
151
- rescue Selenium::WebDriver::Error::TimeoutError
152
- []
153
- end
154
- end
155
-
156
- private
157
-
158
- def _set_by_from_finders(how)
159
- by = FINDERS[how.to_sym]
160
- raise ArgumentError, "cannot find element by #{how.inspect}. Available finders are #{FINDERS.keys}." unless by
161
-
162
- by
163
- end
164
-
165
- def extract_args(args)
166
- case args.size
167
- when 2
168
- args
169
- when 1
170
- arg = args.first
171
-
172
- raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift" unless arg.respond_to?(:shift)
173
-
174
- # this will be a single-entry hash, so use #shift over #first or #[]
175
- arr = arg.dup.shift
176
-
177
- raise ArgumentError, "expected #{arr.inspect} to have 2 elements" unless arr.size == 2
15
+ # rubocop:disable Layout/LineLength
16
+ #
17
+ # Find the first element matching the given arguments
18
+ #
19
+ # - Android can find with uiautomator like a {http://developer.android.com/tools/help/uiautomator/UiSelector.html UISelector}.
20
+ # - iOS can find with a {https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAWindowClassReference/UIAWindow/UIAWindow.html#//apple_ref/doc/uid/TP40009930 UIAutomation command}.
21
+ # - iOS, only for XCUITest(WebDriverAgent), can find with a {https://github.com/facebook/WebDriverAgent/wiki/Queries class chain}
22
+ #
23
+ # == Find with image
24
+ # Return an element if current view has a partial image. The logic depends on template matching by OpenCV.
25
+ # {https://github.com/appium/appium/blob/1.x/docs/en/writing-running-appium/image-comparison.md image-comparison}
26
+ #
27
+ # You can handle settings for the comparision following {https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6 here}
28
+ #
29
+ # == Espresso viewmatcher and datamatcher
30
+ # Espresso has {https://developer.android.com/training/testing/espresso/basics _onView_ matcher}
31
+ # and {https://medium.com/androiddevelopers/adapterviews-and-espresso-f4172aa853cf _onData_ matcher} for more reference
32
+ # that allows you to target adapters instead of Views. This method find methods based on reflections
33
+ #
34
+ # This is a selector strategy that allows users to pass a selector of the form:
35
+ #
36
+ # <code>{ name: '<name>', args: ['arg1', 'arg2', '...'], class: '<optional class>' }</code>
37
+ #
38
+ # - _name_: The name of a method to invoke. The method must return
39
+ # a Hamcrest {http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matcher.html Matcher}
40
+ # - _args_: The args provided to the method
41
+ # - _class_: The class name that the method is part of (defaults to <code>org.hamcrest.Matchers</code>).
42
+ # Can be fully qualified, or simple, and simple defaults to <code>androidx.test.espresso.matcher</code> package
43
+ # (e.g.: <code>class=CursorMatchers</code> fully qualified is <code>class=androidx.test.espresso.matcher.CursorMatchers</code>
44
+ #
45
+ # See example how to send viewmatcher and datamatcher in Ruby client
46
+ #
47
+ #
48
+ # @overload find_element(how, what)
49
+ # @param [Symbol, String] how The method to find the element by
50
+ # @param [String] what The locator to use
51
+ #
52
+ # @overload find_element(opts)
53
+ # @param [Hash] opts Find options
54
+ # @option opts [Symbol] :how Key named after the method to find the element by, containing the locator
55
+ # @return [Element]
56
+ # @raise [Error::NoSuchElementError] if the element doesn't exist
57
+ #
58
+ # @example Find element with each keys
59
+ #
60
+ # # with accessibility id. All platforms.
61
+ # @driver.find_elements :accessibility_id, 'Animation'
62
+ # @driver.find_elements :accessibility_id, 'Animation'
63
+ #
64
+ # # with base64 encoded template image. All platforms.
65
+ # @driver.find_elements :image, Base64.strict_encode64(File.read(file_path))
66
+ #
67
+ # # For Android
68
+ # ## With uiautomator
69
+ # @driver.find_elements :uiautomator, 'new UiSelector().clickable(true)'
70
+ # ## With viewtag, but only for Espresso
71
+ # ## 'setTag'/'getTag' in https://developer.android.com/reference/android/view/View
72
+ # @driver.find_elements :viewtag, 'new UiSelector().clickable(true)'
73
+ # # With data_matcher. The argument should be JSON format.
74
+ # @driver.find_elements :data_matcher, { name: 'hasEntry', args: %w(title Animation) }.to_json
75
+ #
76
+ # # For iOS
77
+ # ## With :predicate
78
+ # @driver.find_elements :predicate, "isWDVisible == 1"
79
+ # @driver.find_elements :predicate, 'wdName == "Buttons"'
80
+ # @driver.find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'
81
+ #
82
+ # ## With Class Chain
83
+ # ### select the third child button of the first child window element
84
+ # @driver.find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
85
+ # ### select all the children windows
86
+ # @driver.find_elements :class_chain, 'XCUIElementTypeWindow'
87
+ # ### select the second last child of the second child window
88
+ # @driver.find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
89
+ # ### matching predicate. <code>'</code> is the mark.
90
+ # @driver.find_elements :class_chain, 'XCUIElementTypeWindow['visible = 1]['name = "bla"']'
91
+ # ### containing predicate. '$' is the mark.
92
+ # ### Require appium-xcuitest-driver 2.54.0+. PR: https://github.com/facebook/WebDriverAgent/pull/707/files
93
+ # @driver.find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
94
+ # e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
95
+ # e.tag_name #=> "XCUIElementTypeWindow"
96
+ # e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
97
+ # e.tag_name #=> "XCUIElementTypeStaticText"
98
+ #
99
+ # rubocop:enable Layout/LineLength
178
100
 
179
- arr
180
- else
181
- raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
182
- end
183
- end
184
- end # module SearchContext
185
- end # class Base
186
- end # module Core
187
- end # module Appium
101
+ APPIUM_EXTRA_FINDERS = {
102
+ accessibility_id: 'accessibility id',
103
+ image: '-image',
104
+ custom: '-custom',
105
+ # Android
106
+ uiautomator: '-android uiautomator', # Unavailable in Espresso
107
+ viewtag: '-android viewtag', # Available in Espresso
108
+ data_matcher: '-android datamatcher', # Available in Espresso
109
+ view_matcher: '-android viewmatcher', # Available in Espresso
110
+ # iOS
111
+ predicate: '-ios predicate string',
112
+ class_chain: '-ios class chain'
113
+ }.freeze
@@ -17,7 +17,6 @@ require_relative 'device/keyboard'
17
17
  require_relative 'device/ime_actions'
18
18
  require_relative 'device/setting'
19
19
  require_relative 'device/context'
20
- require_relative 'device/value'
21
20
  require_relative 'device/file_management'
22
21
  require_relative 'device/keyevent'
23
22
  require_relative 'device/image_comparison'
@@ -27,16 +26,13 @@ require_relative 'device/screen_record'
27
26
  require_relative 'device/battery_status'
28
27
  require_relative 'device/clipboard_content_type'
29
28
  require_relative 'device/device'
30
- require_relative 'device/touch_actions'
31
29
  require_relative 'device/execute_driver'
30
+ require_relative 'device/orientation'
32
31
 
33
32
  # The following files have selenium-webdriver related stuff.
34
33
  require_relative 'base/driver'
35
34
  require_relative 'base/bridge'
36
- require_relative 'base/bridge/mjsonwp'
37
- require_relative 'base/bridge/w3c'
38
35
  require_relative 'base/capabilities'
39
36
  require_relative 'base/http_default'
40
37
  require_relative 'base/search_context'
41
- require_relative 'base/command'
42
38
  require_relative 'base/platform'
@@ -12,7 +12,247 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require_relative 'base/command'
16
- require_relative 'command/common'
17
- require_relative 'command/mjsonwp'
18
- require_relative 'command/w3c'
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
+ ###
22
+ # W3C
23
+ ###
24
+ status: [:get, 'status'],
25
+
26
+ #
27
+ # session handling
28
+ #
29
+
30
+ new_session: [:post, 'session'],
31
+ delete_session: [:delete, 'session/:session_id'],
32
+
33
+ #
34
+ # basic driver
35
+ #
36
+
37
+ get: [:post, 'session/:session_id/url'],
38
+ get_current_url: [:get, 'session/:session_id/url'],
39
+ back: [:post, 'session/:session_id/back'],
40
+ forward: [:post, 'session/:session_id/forward'],
41
+ refresh: [:post, 'session/:session_id/refresh'],
42
+ get_title: [:get, 'session/:session_id/title'],
43
+
44
+ #
45
+ # window and Frame handling
46
+ #
47
+
48
+ get_window_handle: [:get, 'session/:session_id/window'],
49
+ new_window: [:post, 'session/:session_id/window/new'],
50
+ close_window: [:delete, 'session/:session_id/window'],
51
+ switch_to_window: [:post, 'session/:session_id/window'],
52
+ get_window_handles: [:get, 'session/:session_id/window/handles'],
53
+ fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
54
+ minimize_window: [:post, 'session/:session_id/window/minimize'],
55
+ maximize_window: [:post, 'session/:session_id/window/maximize'],
56
+ set_window_size: [:post, 'session/:session_id/window/size'],
57
+ get_window_size: [:get, 'session/:session_id/window/size'],
58
+ set_window_position: [:post, 'session/:session_id/window/position'],
59
+ get_window_position: [:get, 'session/:session_id/window/position'],
60
+ set_window_rect: [:post, 'session/:session_id/window/rect'],
61
+ get_window_rect: [:get, 'session/:session_id/window/rect'],
62
+ switch_to_frame: [:post, 'session/:session_id/frame'],
63
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
64
+
65
+ #
66
+ # element
67
+ #
68
+
69
+ find_element: [:post, 'session/:session_id/element'],
70
+ find_elements: [:post, 'session/:session_id/elements'],
71
+ find_child_element: [:post, 'session/:session_id/element/:id/element'],
72
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
73
+ find_shadow_child_element: [:post, 'session/:session_id/shadow/:id/element'],
74
+ find_shadow_child_elements: [:post, 'session/:session_id/shadow/:id/elements'],
75
+ get_active_element: [:get, 'session/:session_id/element/active'],
76
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
77
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
78
+ get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
79
+ get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
80
+ get_element_aria_role: [:get, 'session/:session_id/element/:id/computedrole'],
81
+ get_element_aria_label: [:get, 'session/:session_id/element/:id/computedlabel'],
82
+ get_element_text: [:get, 'session/:session_id/element/:id/text'],
83
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
84
+ get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
85
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
86
+
87
+ #
88
+ # document handling
89
+ #
90
+
91
+ get_page_source: [:get, 'session/:session_id/source'],
92
+ execute_script: [:post, 'session/:session_id/execute/sync'],
93
+ execute_async_script: [:post, 'session/:session_id/execute/async'],
94
+
95
+ #
96
+ # cookies
97
+ #
98
+
99
+ get_all_cookies: [:get, 'session/:session_id/cookie'],
100
+ get_cookie: [:get, 'session/:session_id/cookie/:name'],
101
+ add_cookie: [:post, 'session/:session_id/cookie'],
102
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
103
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'],
104
+
105
+ #
106
+ # timeouts
107
+ #
108
+
109
+ set_timeout: [:post, 'session/:session_id/timeouts'],
110
+
111
+ #
112
+ # actions
113
+ #
114
+
115
+ actions: [:post, 'session/:session_id/actions'],
116
+ release_actions: [:delete, 'session/:session_id/actions'],
117
+ print_page: [:post, 'session/:session_id/print'],
118
+
119
+ #
120
+ # Element Operations
121
+ #
122
+
123
+ element_click: [:post, 'session/:session_id/element/:id/click'],
124
+ element_tap: [:post, 'session/:session_id/element/:id/tap'],
125
+ element_clear: [:post, 'session/:session_id/element/:id/clear'],
126
+ element_send_keys: [:post, 'session/:session_id/element/:id/value'],
127
+
128
+ #
129
+ # alerts
130
+ #
131
+
132
+ dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
133
+ accept_alert: [:post, 'session/:session_id/alert/accept'],
134
+ get_alert_text: [:get, 'session/:session_id/alert/text'],
135
+ send_alert_text: [:post, 'session/:session_id/alert/text'],
136
+
137
+ #
138
+ # screenshot
139
+ #
140
+
141
+ take_screenshot: [:get, 'session/:session_id/screenshot'],
142
+ take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
143
+
144
+ #
145
+ # server extensions
146
+ #
147
+
148
+ upload_file: [:post, 'session/:session_id/se/file'],
149
+
150
+ ###
151
+ # Used by Appium, but no in W3C
152
+ ###
153
+
154
+ # ::Appium::Core::Base::Commands::OSS has the following commands and Appium also use them.
155
+ # Delegated to ::Appium::Core::Base::Commands::OSS commands
156
+ is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'], # hint: https://w3c.github.io/webdriver/#element-displayedness
157
+
158
+ get_timeouts: [:get, 'session/:session_id/timeouts'], # https://w3c.github.io/webdriver/#get-timeouts
159
+
160
+ ### rotatable
161
+ get_screen_orientation: [:get, 'session/:session_id/orientation'],
162
+ set_screen_orientation: [:post, 'session/:session_id/orientation'],
163
+
164
+ get_location: [:get, 'session/:session_id/location'],
165
+ set_location: [:post, 'session/:session_id/location'],
166
+
167
+ ### For IME
168
+ ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'],
169
+ ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'],
170
+ ime_is_activated: [:get, 'session/:session_id/ime/activated'],
171
+ ime_deactivate: [:post, 'session/:session_id/ime/deactivate'],
172
+ ime_activate_engine: [:post, 'session/:session_id/ime/activate'],
173
+
174
+ ### Logs
175
+ get_available_log_types: [:get, 'session/:session_id/log/types'],
176
+ get_log: [:post, 'session/:session_id/log'],
177
+
178
+ ###
179
+ # Appium own
180
+ ###
181
+
182
+ # common
183
+ available_contexts: [:get, 'session/:session_id/contexts'],
184
+ set_context: [:post, 'session/:session_id/context'],
185
+ current_context: [:get, 'session/:session_id/context'],
186
+
187
+ background_app: [:post, 'session/:session_id/appium/app/background'],
188
+ app_strings: [:post, 'session/:session_id/appium/app/strings'],
189
+
190
+ device_locked?: [:post, 'session/:session_id/appium/device/is_locked'],
191
+ unlock: [:post, 'session/:session_id/appium/device/unlock'],
192
+ lock: [:post, 'session/:session_id/appium/device/lock'],
193
+ device_time: [:get, 'session/:session_id/appium/device/system_time'],
194
+ install_app: [:post, 'session/:session_id/appium/device/install_app'],
195
+ remove_app: [:post, 'session/:session_id/appium/device/remove_app'],
196
+ app_installed?: [:post, 'session/:session_id/appium/device/app_installed'],
197
+ activate_app: [:post, 'session/:session_id/appium/device/activate_app'],
198
+ terminate_app: [:post, 'session/:session_id/appium/device/terminate_app'],
199
+ app_state: [:post, 'session/:session_id/appium/device/app_state'],
200
+ shake: [:post, 'session/:session_id/appium/device/shake'],
201
+ hide_keyboard: [:post, 'session/:session_id/appium/device/hide_keyboard'],
202
+ press_keycode: [:post, 'session/:session_id/appium/device/press_keycode'],
203
+ long_press_keycode: [:post, 'session/:session_id/appium/device/long_press_keycode'],
204
+ push_file: [:post, 'session/:session_id/appium/device/push_file'],
205
+ pull_file: [:post, 'session/:session_id/appium/device/pull_file'],
206
+ pull_folder: [:post, 'session/:session_id/appium/device/pull_folder'],
207
+ get_clipboard: [:post, 'session/:session_id/appium/device/get_clipboard'],
208
+ set_clipboard: [:post, 'session/:session_id/appium/device/set_clipboard'],
209
+ finger_print: [:post, 'session/:session_id/appium/device/finger_print'],
210
+ get_settings: [:get, 'session/:session_id/appium/settings'],
211
+ update_settings: [:post, 'session/:session_id/appium/settings'],
212
+ stop_recording_screen: [:post, 'session/:session_id/appium/stop_recording_screen'],
213
+ start_recording_screen: [:post, 'session/:session_id/appium/start_recording_screen'],
214
+ compare_images: [:post, 'session/:session_id/appium/compare_images'],
215
+ is_keyboard_shown: [:get, 'session/:session_id/appium/device/is_keyboard_shown'],
216
+ execute_driver: [:post, 'session/:session_id/appium/execute_driver'],
217
+ post_log_event: [:post, 'session/:session_id/appium/log_event'],
218
+ get_log_events: [:post, 'session/:session_id/appium/events']
219
+ }.freeze
220
+
221
+ COMMAND_ANDROID = {
222
+ open_notifications: [:post, 'session/:session_id/appium/device/open_notifications'],
223
+ toggle_airplane_mode: [:post, 'session/:session_id/appium/device/toggle_airplane_mode'],
224
+ start_activity: [:post, 'session/:session_id/appium/device/start_activity'],
225
+ current_activity: [:get, 'session/:session_id/appium/device/current_activity'],
226
+ current_package: [:get, 'session/:session_id/appium/device/current_package'],
227
+ get_system_bars: [:get, 'session/:session_id/appium/device/system_bars'],
228
+ get_display_density: [:get, 'session/:session_id/appium/device/display_density'],
229
+ toggle_wifi: [:post, 'session/:session_id/appium/device/toggle_wifi'],
230
+ toggle_data: [:post, 'session/:session_id/appium/device/toggle_data'],
231
+ toggle_location_services: [:post, 'session/:session_id/appium/device/toggle_location_services'],
232
+ get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'],
233
+ get_performance_data: [:post, 'session/:session_id/appium/getPerformanceData'],
234
+ get_network_connection: [:get, 'session/:session_id/network_connection'], # defined also in OSS
235
+ set_network_connection: [:post, 'session/:session_id/network_connection'], # defined also in OSS
236
+
237
+ # only emulator
238
+ send_sms: [:post, 'session/:session_id/appium/device/send_sms'],
239
+ gsm_call: [:post, 'session/:session_id/appium/device/gsm_call'],
240
+ gsm_signal: [:post, 'session/:session_id/appium/device/gsm_signal'],
241
+ gsm_voice: [:post, 'session/:session_id/appium/device/gsm_voice'],
242
+ set_network_speed: [:post, 'session/:session_id/appium/device/network_speed'],
243
+ set_power_capacity: [:post, 'session/:session_id/appium/device/power_capacity'],
244
+ set_power_ac: [:post, 'session/:session_id/appium/device/power_ac'],
245
+
246
+ # For chromium: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
247
+ chrome_send_command: [:post, 'session/:session_id/goog/cdp/execute']
248
+ }.freeze
249
+
250
+ COMMAND_IOS = {
251
+ touch_id: [:post, 'session/:session_id/appium/simulator/touch_id'],
252
+ toggle_touch_id_enrollment: [:post, 'session/:session_id/appium/simulator/toggle_touch_id_enrollment']
253
+ }.freeze
254
+
255
+ COMMANDS = {}.merge(COMMAND).merge(COMMAND_ANDROID).merge(COMMAND_IOS).freeze
256
+ end # module Commands
257
+ end # module Core
258
+ end # module Appium
@@ -17,18 +17,6 @@ module Appium
17
17
  class Base
18
18
  module Device
19
19
  module AppManagement
20
- def launch_app
21
- execute :launch_app
22
- end
23
-
24
- def close_app
25
- execute :close_app
26
- end
27
-
28
- def reset
29
- execute :reset
30
- end
31
-
32
20
  def app_strings(language = nil)
33
21
  opts = language ? { language: language } : {}
34
22
  execute :app_strings, {}, opts
@@ -39,21 +27,9 @@ module Appium
39
27
  raise NotImplementedError
40
28
  end
41
29
 
42
- def install_app(path,
43
- replace: nil,
44
- timeout: nil,
45
- allow_test_packages: nil,
46
- use_sdcard: nil,
47
- grant_permissions: nil)
30
+ def install_app(path, options = {})
48
31
  args = { appPath: path }
49
-
50
- args[:options] = {} if options?(replace, timeout, allow_test_packages, use_sdcard, grant_permissions)
51
-
52
- args[:options][:replace] = replace unless replace.nil?
53
- args[:options][:timeout] = timeout unless timeout.nil?
54
- args[:options][:allowTestPackages] = allow_test_packages unless allow_test_packages.nil?
55
- args[:options][:useSdcard] = use_sdcard unless use_sdcard.nil?
56
- args[:options][:grantPermissions] = grant_permissions unless grant_permissions.nil?
32
+ args[:options] = options unless options.empty?
57
33
 
58
34
  execute :install_app, {}, args
59
35
  end
@@ -29,10 +29,6 @@ module Appium
29
29
  end
30
30
  end
31
31
 
32
- def switch_to_default_context
33
- set_context nil
34
- end
35
-
36
32
  def current_context
37
33
  execute :current_context
38
34
  end
@@ -42,7 +38,7 @@ module Appium
42
38
  execute(:available_contexts, {}) || []
43
39
  end
44
40
 
45
- def set_context(context = null)
41
+ def set_context(context = nil)
46
42
  execute :set_context, {}, name: context
47
43
  end
48
44
  end # module ImeActions