appium_lib_core 4.1.0 → 4.7.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.
data/README.md CHANGED
@@ -11,6 +11,7 @@ This library wraps [selenium-webdriver](https://github.com/SeleniumHQ/selenium/w
11
11
  # Documentation
12
12
 
13
13
  - http://www.rubydoc.info/github/appium/ruby_lib_core
14
+ - You can find working API examples in test code, [test/functional](test/functional)
14
15
 
15
16
  # Related library
16
17
  - https://github.com/appium/ruby_lib
@@ -120,7 +121,7 @@ $ IGNORE_VERSION_SKIP=true CI=true bundle exec rake test:func:android
120
121
  $ ruby test.rb
121
122
  ```
122
123
 
123
- More examples are in [test/functional](test/functional)
124
+ More examples are in [test/functional](test/functional)
124
125
 
125
126
  ### Capabilities
126
127
 
data/Rakefile CHANGED
@@ -38,6 +38,7 @@ namespace :test do
38
38
  namespace :unit do
39
39
  desc('Run all iOS related unit tests in test directory')
40
40
  Rake::TestTask.new(:ios) do |t|
41
+ ENV['UNIT_TEST'] = '1'
41
42
  t.libs << 'test'
42
43
  t.libs << 'lib'
43
44
  t.test_files = FileList['test/unit/ios/**/*_test.rb']
@@ -45,6 +46,7 @@ namespace :test do
45
46
 
46
47
  desc('Run all Android related unit tests in test directory')
47
48
  Rake::TestTask.new(:android) do |t|
49
+ ENV['UNIT_TEST'] = '1'
48
50
  t.libs << 'test'
49
51
  t.libs << 'lib'
50
52
  t.test_files = FileList['test/unit/android/**/*_test.rb']
@@ -52,6 +54,7 @@ namespace :test do
52
54
 
53
55
  desc('Run all common related unit tests in test directory')
54
56
  Rake::TestTask.new(:common) do |t|
57
+ ENV['UNIT_TEST'] = '1'
55
58
  t.libs << 'test'
56
59
  t.libs << 'lib'
57
60
  t.test_files = FileList['test/unit/common/**/*_test.rb']
@@ -59,6 +62,7 @@ namespace :test do
59
62
 
60
63
  desc('Run all Windows related unit tests in test directory')
61
64
  Rake::TestTask.new(:windows) do |t|
65
+ ENV['UNIT_TEST'] = '1'
62
66
  t.libs << 'test'
63
67
  t.libs << 'lib'
64
68
  t.test_files = FileList['test/unit/windows/**/*_test.rb']
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'yard', '~> 0.9.11'
31
31
  spec.add_development_dependency 'minitest', '~> 5.0'
32
32
  spec.add_development_dependency 'minitest-reporters', '~> 1.1'
33
- spec.add_development_dependency 'webmock', '~> 3.11.0'
34
- spec.add_development_dependency 'rubocop', '1.7.0'
33
+ spec.add_development_dependency 'webmock', '~> 3.13.0'
34
+ spec.add_development_dependency 'rubocop', '1.12.0'
35
35
  spec.add_development_dependency 'appium_thor', '~> 1.0'
36
36
  spec.add_development_dependency 'pry'
37
37
  spec.add_development_dependency 'pry-byebug'
@@ -1,8 +1,8 @@
1
1
  steps:
2
2
  - task: NodeTool@0
3
3
  inputs:
4
- versionSpec: 10.x
5
- displayName: Install Node 10.x
4
+ versionSpec: 12.x
5
+ displayName: Install Node 12.x
6
6
  - script: npm install -g appium@${APPIUM_VERSION}
7
7
  displayName: Install appium beta
8
8
  - script: npm install -g mjpeg-consumer
@@ -4,7 +4,7 @@ parameters:
4
4
  vmImageForIOS: 'macOS-10.15' # Not sure the reason, but macOS 10.14 instance raises no info.plist error
5
5
  xcodeForIOS: 12.2
6
6
  xcodeForTVOS: 12.2
7
- androidSDK: 30
7
+ androidSDK: 29 # API Level 30 emulators are more unstable than 29
8
8
  appiumVersion: 'beta'
9
9
  ignoreVersionSkip: true
10
10
  CI: true
@@ -290,16 +290,16 @@ module Appium
290
290
  # @driver.finger_print 1
291
291
  #
292
292
 
293
- # @!method execute_cdp(cmd, params)
293
+ # @!method execute_cdp(cmd, **params)
294
294
  # Execute Chrome Devtools protocol commands
295
295
  # https://chromedevtools.github.io/devtools-protocol
296
296
  #
297
297
  # @param [String] cmd The name of command
298
- # @param [Hash] params The parameter for the command as hash.
298
+ # @option params The parameter for the command as keyword options.
299
299
  #
300
300
  # @example
301
301
  #
302
- # @driver.execute_cdp 'Page.captureScreenshot', { quality: 50, format: 'jpeg' }
302
+ # @driver.execute_cdp 'Page.captureScreenshot', quality: 50, format: 'jpeg'
303
303
  # @driver.execute_cdp 'Page.getResourceTree'
304
304
  #
305
305
 
@@ -415,7 +415,7 @@ module Appium
415
415
  # SeleniumWebdriver could already define this method
416
416
  return if method_defined? :execute_cdp
417
417
 
418
- def execute_cdp(cmd, params = {})
418
+ def execute_cdp(cmd, **params)
419
419
  execute :chrome_send_command, {}, { cmd: cmd, params: params }
420
420
  end
421
421
  end
@@ -33,8 +33,24 @@ module Appium
33
33
  include Device::TouchActions
34
34
  include Device::ExecuteDriver
35
35
 
36
+ attr_reader :available_commands
37
+
38
+ def initialize(capabilities, session_id, **opts)
39
+ @available_commands = ::Appium::Core::Commands::MJSONWP::COMMANDS.dup
40
+ super(capabilities, session_id, **opts)
41
+ end
42
+
36
43
  def commands(command)
37
- ::Appium::Core::Commands::MJSONWP::COMMANDS[command]
44
+ @available_commands[command]
45
+ end
46
+
47
+ # command for Appium 2.0.
48
+ def add_command(method:, url:, name:, &block)
49
+ raise ::Appium::Core::Error::ArgumentError, "#{name} is already defined" if @available_commands.key? name
50
+
51
+ @available_commands[name] = [method, url]
52
+
53
+ ::Appium::Core::Device.add_endpoint_method name, &block
38
54
  end
39
55
 
40
56
  # Returns all available sessions on the Appium server instance
@@ -42,6 +58,10 @@ module Appium
42
58
  execute :get_all_sessions
43
59
  end
44
60
 
61
+ def status
62
+ execute :status
63
+ end
64
+
45
65
  # For Appium
46
66
  def log_event(vendor, event)
47
67
  execute :post_log_event, {}, { vendor: vendor, event: event }
@@ -74,6 +94,13 @@ module Appium
74
94
  def convert_to_element(id)
75
95
  ::Selenium::WebDriver::Element.new self, element_id_from(id)
76
96
  end
97
+
98
+ def set_location(lat, lon, alt = 0.0, speed: nil, satellites: nil)
99
+ loc = { latitude: lat, longitude: lon, altitude: alt }
100
+ loc[:speed] = speed unless speed.nil?
101
+ loc[:satellites] = satellites unless satellites.nil?
102
+ execute :set_location, {}, { location: loc }
103
+ end
77
104
  end # class MJSONWP
78
105
  end # class Bridge
79
106
  end # class Base
@@ -32,9 +32,26 @@ module Appium
32
32
  include Device::Device
33
33
  include Device::TouchActions
34
34
  include Device::ExecuteDriver
35
+ include Device::Orientation
36
+
37
+ attr_reader :available_commands
38
+
39
+ def initialize(capabilities, session_id, **opts)
40
+ @available_commands = ::Appium::Core::Commands::W3C::COMMANDS.dup
41
+ super(capabilities, session_id, **opts)
42
+ end
35
43
 
36
44
  def commands(command)
37
- ::Appium::Core::Commands::W3C::COMMANDS[command]
45
+ @available_commands[command]
46
+ end
47
+
48
+ # command for Appium 2.0.
49
+ def add_command(method:, url:, name:, &block)
50
+ raise ::Appium::Core::Error::ArgumentError, "#{name} is already defined" if @available_commands.key? name
51
+
52
+ @available_commands[name] = [method, url]
53
+
54
+ ::Appium::Core::Device.add_endpoint_method name, &block
38
55
  end
39
56
 
40
57
  # Returns all available sessions on the Appium server instance
@@ -42,6 +59,10 @@ module Appium
42
59
  execute :get_all_sessions
43
60
  end
44
61
 
62
+ def status
63
+ execute :status
64
+ end
65
+
45
66
  # Perform touch actions for W3C module.
46
67
  # Generate +touch+ pointer action here and users can use this via +driver.action+
47
68
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
@@ -165,18 +186,10 @@ module Appium
165
186
 
166
187
  # For Appium
167
188
  # 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)
189
+ def set_location(lat, lon, alt = 0.0, speed: nil, satellites: nil)
179
190
  loc = { latitude: lat, longitude: lon, altitude: alt }
191
+ loc[:speed] = speed unless speed.nil?
192
+ loc[:satellites] = satellites unless satellites.nil?
180
193
  execute :set_location, {}, { location: loc }
181
194
  end
182
195
 
@@ -15,6 +15,9 @@
15
15
  require 'base64'
16
16
  require_relative 'search_context'
17
17
  require_relative 'screenshot'
18
+ require_relative 'rotable'
19
+ require_relative 'remote_status'
20
+ require_relative 'has_location'
18
21
 
19
22
  module Appium
20
23
  module Core
@@ -22,12 +25,16 @@ module Appium
22
25
  class Driver < ::Selenium::WebDriver::Driver
23
26
  include ::Selenium::WebDriver::DriverExtensions::UploadsFiles
24
27
  include ::Selenium::WebDriver::DriverExtensions::HasSessionId
25
- include ::Selenium::WebDriver::DriverExtensions::Rotatable
26
28
  include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
27
29
  include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
30
+ include ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
31
+ include ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
28
32
 
33
+ include ::Appium::Core::Base::Rotatable
29
34
  include ::Appium::Core::Base::SearchContext
30
- include ::Appium::Core::Base::TakeScreenshot
35
+ include ::Appium::Core::Base::TakesScreenshot
36
+ include ::Appium::Core::Base::HasRemoteStatus
37
+ include ::Appium::Core::Base::HasLocation
31
38
 
32
39
  # Private API.
33
40
  # Do not use this for general use. Used by flutter driver to get bridge for creating a new element
@@ -36,16 +43,6 @@ module Appium
36
43
  def initialize(opts = {})
37
44
  listener = opts.delete(:listener)
38
45
  @bridge = ::Appium::Core::Base::Bridge.handshake(**opts)
39
- if @bridge.dialect == :oss # MJSONWP
40
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
41
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
42
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
43
- elsif @bridge.dialect == :w3c
44
- # TODO: Only for Appium. Ideally, we'd like to remove the below like selenium-webdriver
45
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
46
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
47
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
48
- end
49
46
  super(@bridge, listener: listener)
50
47
  end
51
48
 
@@ -58,6 +55,7 @@ module Appium
58
55
  # Update +server_url+ and HTTP clients following this arguments, protocol, host, port and path.
59
56
  # After this method, +@bridge.http+ will be a new instance following them instead of +server_url+ which is
60
57
  # set before creating session.
58
+ # If +@bridge.http+ did not have +update_sending_request_to+ method, this method returns immediately.
61
59
  #
62
60
  # @example
63
61
  #
@@ -66,10 +64,95 @@ module Appium
66
64
  # driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'
67
65
  #
68
66
  def update_sending_request_to(protocol:, host:, port:, path:)
69
- @bridge.http.update_sending_request_to(scheme: protocol,
70
- host: host,
71
- port: port,
72
- path: path)
67
+ unless @bridge.http&.class&.method_defined? :update_sending_request_to
68
+ ::Appium::Logger.warn "#{@bridge.http&.class} has no 'update_sending_request_to'. " \
69
+ 'It keeps current connection target.'
70
+ return
71
+ end
72
+
73
+ @bridge.http&.update_sending_request_to(scheme: protocol,
74
+ host: host,
75
+ port: port,
76
+ path: path)
77
+ end
78
+
79
+ AVAILABLE_METHODS = [
80
+ :get, :head, :post, :put, :delete,
81
+ :connect, :options, :trace, :patch
82
+ ].freeze
83
+ # Define a new custom method to the driver so that you can define your own method for
84
+ # drivers/plugins in Appium 2.0. Appium 2.0 and its custom drivers/plugins allow you
85
+ # to define custom commands that are not part of W3C spec.
86
+ #
87
+ # @param [Symbol] method HTTP request method as https://www.w3.org/TR/webdriver/#endpoints
88
+ # @param [string] url The url to URL template as https://www.w3.org/TR/webdriver/#endpoints.
89
+ # +:session_id+ is the placeholder of 'session id'.
90
+ # Other place holders can be specified with +:+ prefix like +:id+.
91
+ # Then, the +:id+ will be replaced with a given value as the seconds argument of +execute+
92
+ # @param [Symbol] name The name of method that is called as the driver instance method.
93
+ # @param [Proc] block The block to involve as the method.
94
+ # Please define a method that has the same +name+ with arguments you want.
95
+ # The method must has +execute+ method. tHe +execute+ is calls the +url+
96
+ # with the given parameters.
97
+ # The first argument should be +name+ as symbol.
98
+ # The second argument should be hash. If keys in the hash matches +:+ prefix
99
+ # string in the given url, the matched string in the given url will be
100
+ # values in the hash.
101
+ # The third argument should be hash. The hash will be the request body.
102
+ # Please read examples below for more details.
103
+ # @raise [ArgumentError] If the given +name+ is already defined or +method+ are invalid value.
104
+ #
105
+ # @example
106
+ #
107
+ # @driver.add_command(
108
+ # method: :get,
109
+ # url: 'session/:session_id/path/to/custom/url',
110
+ # name: :test_command
111
+ # )
112
+ # # Send a GET request to 'session/<session id>/path/to/custom/url'
113
+ # @driver.test_command
114
+ #
115
+ #
116
+ # @driver.add_command(
117
+ # method: :post,
118
+ # url: 'session/:session_id/path/to/custom/url',
119
+ # name: :test_command
120
+ # ) do
121
+ # def test_command(argument)
122
+ # execute(:test_command, {}, { dummy: argument })
123
+ # end
124
+ # end
125
+ # # Send a POST request to 'session/<session id>/path/to/custom/url'
126
+ # # with body "{ dummy: 1 }" as JSON object. "1" is the argument.
127
+ # # ':session_id' in the given 'url' is replaced with current 'session id'.
128
+ # @driver.test_command(1)
129
+ #
130
+ #
131
+ # @driver.add_command(
132
+ # method: :post,
133
+ # url: 'session/:session_id/element/:id/custom/action',
134
+ # name: :test_action_command
135
+ # ) do
136
+ # def test_action_command(element_id, action)
137
+ # execute(:test_action_command, {id: element_id}, { dummy_action: action })
138
+ # end
139
+ # end
140
+ # # Send a POST request to 'session/<session id>/element/<element id>/custom/action'
141
+ # # with body "{ dummy_action: #{action} }" as JSON object. "action" is the seconds argument.
142
+ # # ':session_id' in the given url is replaced with current 'session id'.
143
+ # # ':id' in the given url is replaced with the given 'element_id'.
144
+ # e = @driver.find_element :accessibility_id, 'an element'
145
+ # @driver.test_action_command(e.ref, 'action')
146
+ #
147
+ def add_command(method:, url:, name:, &block)
148
+ unless AVAILABLE_METHODS.include? method
149
+ raise ::Appium::Core::Error::ArgumentError, "Available method is either #{AVAILABLE_METHODS}"
150
+ end
151
+
152
+ # TODO: Remove this logger
153
+ ::Appium::Logger.info '[Experimental] this method is experimental for Appium 2.0. This interface may change.'
154
+
155
+ @bridge.add_command method: method, url: url, name: name, &block
73
156
  end
74
157
 
75
158
  ### Methods for Appium
@@ -160,10 +243,24 @@ module Appium
160
243
  @bridge = bridge
161
244
  end
162
245
 
246
+ # Get appium Settings for current test session.
247
+ #
248
+ # @example
249
+ #
250
+ # @driver.settings.get
251
+ #
163
252
  def get
164
253
  @bridge.get_settings
165
254
  end
166
255
 
256
+ # Update Appium Settings for current test session
257
+ #
258
+ # @param [Hash] settings Settings to update, keys are settings, values to value to set each setting to
259
+ #
260
+ # @example
261
+ #
262
+ # @driver.settings.update({'allowInvisibleElements': true})
263
+ #
167
264
  def update(settings)
168
265
  @bridge.update_settings(settings)
169
266
  end
@@ -200,8 +297,8 @@ module Appium
200
297
  #
201
298
  # @example
202
299
  #
203
- # @driver.update_settings('allowInvisibleElements': true)
204
- # @driver.settings.update('allowInvisibleElements': true)
300
+ # @driver.update_settings({ 'allowInvisibleElements': true })
301
+ # @driver.settings.update({ 'allowInvisibleElements': true })
205
302
  # @driver.settings = { 'allowInvisibleElements': true }
206
303
  #
207
304
  def settings=(value)
@@ -239,6 +336,8 @@ module Appium
239
336
 
240
337
  # Returns an instance of DeviceIME
241
338
  #
339
+ # @return [Appium::Core::Base::Driver::DeviceIME]
340
+ #
242
341
  # @example
243
342
  #
244
343
  # @driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
@@ -289,6 +388,8 @@ module Appium
289
388
  # @!method ime_activated
290
389
  # Android only. Indicates whether IME input is active at the moment (not if it is available).
291
390
  #
391
+ # @return [Boolean]
392
+ #
292
393
  # @example
293
394
  #
294
395
  # @driver.ime_activated #=> True if IME is activated
@@ -853,7 +954,7 @@ module Appium
853
954
  end
854
955
 
855
956
  # Get the device window's logs.
856
- # @return [String]
957
+ # @return [Appium::Core::Logs]
857
958
  #
858
959
  # @example
859
960
  #
@@ -879,7 +980,7 @@ module Appium
879
980
  # Retrieve the capabilities of the specified session.
880
981
  # It's almost same as +@driver.capabilities+ but you can get more details.
881
982
  #
882
- # @return [Selenium::WebDriver::Remote::Capabilities]
983
+ # @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::W3C::Capabilities]
883
984
  #
884
985
  # @example
885
986
  # @driver.session_capabilities
@@ -992,11 +1093,14 @@ module Appium
992
1093
  visualize: visualize)
993
1094
  end
994
1095
 
995
- def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
1096
+ def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil,
1097
+ multiple: nil, match_neighbour_threshold: nil)
996
1098
  @bridge.find_image_occurrence(full_image: full_image,
997
1099
  partial_image: partial_image,
998
1100
  visualize: visualize,
999
- threshold: threshold)
1101
+ threshold: threshold,
1102
+ multiple: multiple,
1103
+ match_neighbour_threshold: match_neighbour_threshold)
1000
1104
  end
1001
1105
 
1002
1106
  def get_images_similarity(first_image:, second_image:, visualize: false)
@@ -1038,7 +1142,7 @@ module Appium
1038
1142
  #
1039
1143
  # @param [String] img_path A path to a partial image you'd like to find
1040
1144
  #
1041
- # @return [::Selenium::WebDriver::Element]
1145
+ # @return [Array<Selenium::WebDriver::Element>]
1042
1146
  #
1043
1147
  # @example
1044
1148
  #
@@ -0,0 +1,80 @@
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
+ #
19
+ # @api private
20
+ #
21
+ module HasLocation
22
+ # Get the location of the device.
23
+ #
24
+ # @return [::Selenium::WebDriver::Location]
25
+ #
26
+ # @example
27
+ #
28
+ # driver.location #=> ::Selenium::WebDriver::Location.new(10, 10, 10)
29
+ #
30
+ def location
31
+ @bridge.location
32
+ end
33
+
34
+ # Set the location of the device.
35
+ #
36
+ # @param [::Selenium::WebDriver::Location] location Set the location.
37
+ #
38
+ # @example
39
+ #
40
+ # driver.location = ::Selenium::WebDriver::Location.new(10, 10, 10)
41
+ #
42
+ def location=(location)
43
+ unless location.is_a?(::Selenium::WebDriver::Location)
44
+ raise TypeError, "expected #{::Selenium::WebDriver::Location}, got #{location.inspect}:#{location.class}"
45
+ end
46
+
47
+ @bridge.set_location location.latitude, location.longitude, location.altitude
48
+ end
49
+
50
+ # Set the location of the device.
51
+ #
52
+ # @param [String, Number] latitude Set the latitude.
53
+ # @param [String, Number] longitude Set the longitude.
54
+ # @param [String, Number] altitude Set the altitude.
55
+ # @param [String, Number] speed Set the speed to apply the location on Android real devices
56
+ # in meters/second @since Appium 1.21.0 and in knots for emulators @since Appium 1.22.0.
57
+ # @param [String, Number] satellites Sets the number of geo satellites being tracked @since Appium 1.22.0.
58
+ # This number is respected on Emulators.
59
+ # @param [::Selenium::WebDriver::Location]
60
+ #
61
+ # @example
62
+ #
63
+ # driver.location = ::Selenium::WebDriver::Location.new(10, 10, 10)
64
+ #
65
+ def set_location(latitude, longitude, altitude, speed: nil, satellites: nil)
66
+ if speed.nil? && satellites.nil?
67
+ self.location = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
68
+ else
69
+ loc = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
70
+
71
+ speed = Float(speed) unless speed.nil?
72
+ satellites = Integer(satellites) unless satellites.nil?
73
+
74
+ @bridge.set_location loc.latitude, loc.longitude, loc.altitude, speed: speed, satellites: satellites
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -55,8 +55,6 @@ module Appium
55
55
  def update_sending_request_to(scheme:, host:, port:, path:)
56
56
  return @server_url unless validate_url_param(scheme, host, port, path)
57
57
 
58
- ::Appium::Logger.debug("[experimental] This feature, #{__method__}, is an experimental")
59
-
60
58
  # Add / if 'path' does not have it
61
59
  path = path.start_with?('/') ? path : "/#{path}"
62
60
  path = path.end_with?('/') ? path : "#{path}/"
@@ -71,7 +69,7 @@ module Appium
71
69
  return true unless [scheme, host, port, path].include?(nil)
72
70
 
73
71
  message = "Given parameters are scheme: '#{scheme}', host: '#{host}', port: '#{port}', path: '#{path}'"
74
- ::Appium::Logger.warn(message)
72
+ ::Appium::Logger.debug(message)
75
73
  false
76
74
  end
77
75
 
@@ -0,0 +1,31 @@
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
+ #
19
+ # @api private
20
+ #
21
+
22
+ module HasRemoteStatus
23
+ # Selenium binding has this ability only in Remote Binding,
24
+ # so this library has this method by own for safe.
25
+ def remote_status
26
+ bridge.status
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,54 @@
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
+ #
19
+ # @api private
20
+ #
21
+
22
+ module Rotatable
23
+ ORIENTATIONS = %i[landscape portrait].freeze
24
+
25
+ #
26
+ # Change the screen orientation
27
+ #
28
+ # @param [:landscape, :portrait] orientation
29
+ #
30
+ #
31
+ def rotation=(orientation)
32
+ unless ORIENTATIONS.include?(orientation)
33
+ raise ArgumentError, "expected #{ORIENTATIONS.inspect}, got #{orientation.inspect}"
34
+ end
35
+
36
+ bridge.screen_orientation = orientation.to_s.upcase
37
+ end
38
+ alias rotate rotation=
39
+
40
+ #
41
+ # Get the current screen orientation
42
+ #
43
+ # @return [:landscape, :portrait] orientation
44
+ #
45
+ # @api public
46
+ #
47
+
48
+ def orientation
49
+ bridge.screen_orientation.to_sym.downcase
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -15,7 +15,7 @@
15
15
  module Appium
16
16
  module Core
17
17
  class Base
18
- module TakeScreenshot
18
+ module TakesScreenshot
19
19
  #
20
20
  # Save a PNG screenshot to the given path
21
21
  #
@@ -141,6 +141,8 @@ module Appium
141
141
  #
142
142
  # Find all elements matching the given arguments
143
143
  #
144
+ # @return [Array<Selenium::WebDriver::Element>]
145
+ #
144
146
  # @see SearchContext#find_elements
145
147
  #
146
148
  def find_elements(*args)