appium_lib_core 4.3.0 → 5.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc629c2d452b2bf40d98f09b53e76d4018d54ebda9ef8f0f0004677e6392ea42
4
- data.tar.gz: e0b6de5e05f066b40752eb148c791832283f9e9ac1d54c1bd3a804c2d5a6f3aa
3
+ metadata.gz: fd462f64262abe99f03dd5a421f2a2dd9c8064f1d44eff47bc1872a834793d27
4
+ data.tar.gz: 1a1ca492c3551d8c992e9f2b740460e67239887400602351423062e49912b73f
5
5
  SHA512:
6
- metadata.gz: 2cc700ab57cdbc85c3c1f216f5f003c4453be55b148f39deffe9aee83cdae369b75cf150103f5035e93a7804dda13d60996aa891ccbd7bb3cb6e7927fec0dc6f
7
- data.tar.gz: 0d0f0368958648b5799d13bc2c2d10ea45e27a583caf41a81d38dfc9eeb2a3d02909396b1623fe7ef37e116bf581296a37eac8422256f3e76c1c4a576d7e9786
6
+ metadata.gz: d9e4977dfb93ce734c59af5053a6331bfc2038bd3a03757a31fd7e48c3cdcc810204fb6f3027a1120afe91eda31ad61aa504fa25fdf2a2a21d36638c27982f8e
7
+ data.tar.gz: 3e23c561984a3ad4bf4214aad79fc730f8673d0bc29c81d26ff5143c0dbeb38d6eacc9278ba0caa11e4dfc51f82267f79b97efe6937ad8315c837e64876df162
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "11:00"
8
+ open-pull-requests-limit: 10
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  fail-fast: false
13
13
  matrix:
14
- ruby: [2.4, 2.5, 2.6, 2.7, 3.0]
14
+ ruby: [2.5, 2.6, 2.7, 3.0]
15
15
 
16
16
  runs-on: ubuntu-latest
17
17
 
@@ -38,7 +38,7 @@ jobs:
38
38
  fail-fast: false
39
39
  matrix:
40
40
  # Does not add 2.7 on Windows so far since a command fails only on Windows
41
- ruby: [2.4, 2.5, 2.6]
41
+ ruby: [2.5, 2.6]
42
42
 
43
43
  runs-on: windows-latest
44
44
 
data/CHANGELOG.md CHANGED
@@ -10,15 +10,33 @@ Read `release_notes.md` for commit level details.
10
10
 
11
11
  ### Deprecations
12
12
 
13
- ## [4.3.0] - 2021-02-05
13
+ ## [5.0.0.beta1]
14
+
15
+ - Update base selenium webdriver version to `4.0.0.beta2`
16
+ - Support only W3C spec
17
+ - Support Ruby 2.5+
18
+
19
+ ## [4.5.0] - 2021-03-14
14
20
 
15
21
  ### Enhancements
16
- - Add `start_recording_screen` for Mac2 driver
22
+ - Add `speed` argument for `Appium::Core::Base::Driver#set_location` since Appium 1.21.0
23
+ - Add `multiple` and `match_neighbour_threshold` arguments for `Appium::Core::Base::Driver#find_image_occurrence`
17
24
 
18
25
  ### Bug fixes
19
26
 
20
27
  ### Deprecations
21
28
 
29
+
30
+ ## [4.4.1(4.4.0)] - 2021-02-15(2021-02-13)
31
+
32
+ ### Enhancements
33
+ - Returns `{}` any errors in `Core#appium_server_version` to prevent errors in some cases
34
+
35
+ ## [4.3.1(4.3.0)] - 2021-02-07(2021-02-05)
36
+
37
+ ### Enhancements
38
+ - Add `start_recording_screen` for Mac2 driver
39
+
22
40
  ## [4.2.1] - 2021-01-10
23
41
 
24
42
  ### Enhancements
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'appium_lib_core/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.required_ruby_version = '>= 2.4'
7
+ spec.required_ruby_version = '>= 2.5'
8
8
 
9
9
  spec.name = 'appium_lib_core'
10
10
  spec.version = Appium::Core::VERSION
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_runtime_dependency 'selenium-webdriver', '~> 3.14', '>= 3.14.1'
25
+ spec.add_runtime_dependency 'selenium-webdriver', '4.0.0.beta2'
26
26
  spec.add_runtime_dependency 'faye-websocket', '~> 0.11.0'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '>= 1.14'
@@ -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.8.1'
33
+ spec.add_development_dependency 'webmock', '~> 3.12.1'
34
+ spec.add_development_dependency 'rubocop', '1.11.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
@@ -34,7 +34,6 @@ require_relative 'device/orientation'
34
34
  # The following files have selenium-webdriver related stuff.
35
35
  require_relative 'base/driver'
36
36
  require_relative 'base/bridge'
37
- require_relative 'base/bridge/mjsonwp'
38
37
  require_relative 'base/bridge/w3c'
39
38
  require_relative 'base/capabilities'
40
39
  require_relative 'base/http_default'
@@ -16,52 +16,16 @@ module Appium
16
16
  module Core
17
17
  class Base
18
18
  class Bridge < ::Selenium::WebDriver::Remote::Bridge
19
+ # TODO: Move W3C module to here
20
+
19
21
  # Prefix for extra capability defined by W3C
20
22
  APPIUM_PREFIX = 'appium:'
21
23
 
22
- # TODO: Remove the forceMjsonwp after Appium server won't need it
23
- FORCE_MJSONWP = :forceMjsonwp
24
-
25
- # Almost same as self.handshake in ::Selenium::WebDriver::Remote::Bridge
26
- #
27
- # Implements protocol handshake which:
28
- #
29
- # 1. Creates session with driver.
30
- # 2. Sniffs response.
31
- # 3. Based on the response, understands which dialect we should use.
32
- #
33
- # @return [Bridge::MJSONWP, Bridge::W3C]
34
- #
35
- def self.handshake(**opts)
36
- desired_capabilities = opts.delete(:desired_capabilities) { ::Selenium::WebDriver::Remote::Capabilities.new }
37
-
38
- if desired_capabilities.is_a?(Symbol)
39
- unless ::Selenium::WebDriver::Remote::Capabilities.respond_to?(desired_capabilities)
40
- raise ::Selenium::WebDriver::Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
41
- end
42
-
43
- desired_capabilities = ::Selenium::WebDriver::Remote::Capabilities.__send__(desired_capabilities)
44
- end
45
-
46
- bridge = new(opts)
47
- capabilities = bridge.create_session(desired_capabilities)
48
-
49
- case bridge.dialect
50
- when :oss # for MJSONWP
51
- Bridge::MJSONWP.new(capabilities, bridge.session_id, **opts)
52
- when :w3c
53
- Bridge::W3C.new(capabilities, bridge.session_id, **opts)
54
- else
55
- raise CoreError, 'cannot understand dialect'
56
- end
57
- end
58
-
59
24
  # Override
60
25
  # Creates session handling both OSS and W3C dialects.
61
- # Copy from Selenium::WebDriver::Remote::Bridge to keep using +merged_capabilities+ for Appium
62
26
  #
63
- # @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] desired_capabilities A capability
64
- # @return [::Selenium::WebDriver::Remote::Capabilities, ::Selenium::WebDriver::Remote::W3C::Capabilities]
27
+ # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] desired_capabilities A capability
28
+ # @return [::Selenium::WebDriver::Remote::Capabilities]
65
29
  #
66
30
  # @example
67
31
  #
@@ -79,37 +43,27 @@ module Appium
79
43
  # }
80
44
  # }
81
45
  # core = ::Appium::Core.for(caps)
82
- # driver = core.start_driver #=> driver.dialect == :w3c if the Appium server support W3C.
46
+ # driver = core.start_driver
83
47
  #
84
48
  def create_session(desired_capabilities)
85
- response = execute(:new_session, {}, merged_capabilities(desired_capabilities))
49
+ caps = add_appium_prefix(desired_capabilities)
50
+ response = execute(:new_session, {}, { capabilities: { firstMatch: [caps] } })
86
51
 
87
52
  @session_id = response['sessionId']
88
- oss_status = response['status'] # for compatibility with Appium 1.7.1-
89
- value = response['value']
90
-
91
- if value.is_a?(Hash) # include for W3C format
92
- @session_id = value['sessionId'] if value.key?('sessionId')
93
-
94
- if value.key?('capabilities')
95
- value = value['capabilities']
96
- elsif value.key?('value')
97
- value = value['value']
98
- end
99
- end
53
+ capabilities = response['capabilities']
100
54
 
101
55
  raise ::Selenium::WebDriver::Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
102
56
 
103
- json_create(oss_status, value)
57
+ @capabilities = json_create(capabilities)
104
58
  end
105
59
 
106
60
  # Append +appium:+ prefix for Appium following W3C spec
107
61
  # https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
108
62
  #
109
- # @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] capabilities A capability
110
- # @return [::Selenium::WebDriver::Remote::W3C::Capabilities]
63
+ # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
64
+ # @return [::Selenium::WebDriver::Remote::Capabilities]
111
65
  def add_appium_prefix(capabilities)
112
- w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.new
66
+ w3c_capabilities = ::Selenium::WebDriver::Remote::Capabilities.new
113
67
 
114
68
  capabilities = capabilities.__send__(:capabilities) unless capabilities.is_a?(Hash)
115
69
 
@@ -133,56 +87,17 @@ module Appium
133
87
  end
134
88
 
135
89
  def extension_prefix?(capability_name)
136
- snake_cased_capability_names = ::Selenium::WebDriver::Remote::W3C::Capabilities::KNOWN.map(&:to_s)
90
+ snake_cased_capability_names = ::Selenium::WebDriver::Remote::Capabilities::KNOWN.map(&:to_s)
137
91
  camel_cased_capability_names = snake_cased_capability_names.map { |v| camel_case(v) }
138
92
 
93
+ # Check 'EXTENSION_CAPABILITY_PATTERN'
139
94
  snake_cased_capability_names.include?(capability_name) ||
140
95
  camel_cased_capability_names.include?(capability_name) ||
141
- capability_name.match(::Selenium::WebDriver::Remote::W3C::Capabilities::EXTENSION_CAPABILITY_PATTERN)
96
+ capability_name.match(':')
142
97
  end
143
98
 
144
- def json_create(oss_status, value)
145
- if oss_status
146
- ::Selenium::WebDriver.logger.info 'Detected OSS dialect.'
147
- @dialect = :oss
148
- ::Selenium::WebDriver::Remote::Capabilities.json_create(value)
149
- else
150
- ::Selenium::WebDriver.logger.info 'Detected W3C dialect.'
151
- @dialect = :w3c
152
- ::Selenium::WebDriver::Remote::W3C::Capabilities.json_create(value)
153
- end
154
- end
155
-
156
- def delete_force_mjsonwp(capabilities)
157
- w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.new
158
-
159
- capabilities = capabilities.__send__(:capabilities) unless capabilities.is_a?(Hash)
160
- capabilities.each do |name, value|
161
- next if value.nil?
162
- next if value.is_a?(String) && value.empty?
163
- next if name == FORCE_MJSONWP
164
-
165
- w3c_capabilities[name] = value
166
- end
167
-
168
- w3c_capabilities
169
- end
170
-
171
- def merged_capabilities(desired_capabilities)
172
- force_mjsonwp = desired_capabilities[FORCE_MJSONWP]
173
- desired_capabilities = delete_force_mjsonwp(desired_capabilities) unless force_mjsonwp.nil?
174
-
175
- ::Appium::Logger.warn "'forceMjsonwp' no longer works. Sending both W3C and MJSONWP capabilities" if force_mjsonwp
176
-
177
- new_caps = add_appium_prefix(desired_capabilities)
178
- w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.from_oss(new_caps)
179
-
180
- {
181
- desiredCapabilities: desired_capabilities,
182
- capabilities: {
183
- firstMatch: [w3c_capabilities]
184
- }
185
- }
99
+ def json_create(value)
100
+ ::Selenium::WebDriver::Remote::Capabilities.json_create(value)
186
101
  end
187
102
  end # class Bridge
188
103
  end # class Base
@@ -16,7 +16,7 @@ module Appium
16
16
  module Core
17
17
  class Base
18
18
  class Bridge
19
- class W3C < ::Selenium::WebDriver::Remote::W3C::Bridge
19
+ class W3C < ::Selenium::WebDriver::Remote::Bridge
20
20
  include Device::DeviceLock
21
21
  include Device::Keyboard
22
22
  include Device::ImeActions
@@ -34,6 +34,106 @@ module Appium
34
34
  include Device::ExecuteDriver
35
35
  include Device::Orientation
36
36
 
37
+ # TODO: For compatibility. Should remove.
38
+ def dialect
39
+ :w3c
40
+ end
41
+
42
+ # TODO: fixme
43
+ def browser
44
+ @browser ||= begin
45
+ name = @capabilities.browser_name
46
+ name ? name.tr(' ', '_').downcase.to_sym : 'unknown'
47
+ rescue KeyError
48
+ 'unknown'
49
+ end
50
+ end
51
+
52
+ # Prefix for extra capability defined by W3C
53
+ APPIUM_PREFIX = 'appium:'
54
+
55
+ # Override
56
+ # Creates session handling both OSS and W3C dialects.
57
+ #
58
+ # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] desired_capabilities A capability
59
+ # @return [::Selenium::WebDriver::Remote::Capabilities]
60
+ #
61
+ # @example
62
+ #
63
+ # opts = {
64
+ # caps: {
65
+ # platformName: :ios,
66
+ # automationName: 'XCUITest',
67
+ # app: 'test/functional/app/UICatalog.app.zip',
68
+ # platformVersion: '11.4',
69
+ # deviceName: 'iPhone Simulator',
70
+ # useNewWDA: true,
71
+ # },
72
+ # appium_lib: {
73
+ # wait: 30
74
+ # }
75
+ # }
76
+ # core = ::Appium::Core.for(caps)
77
+ # driver = core.start_driver #=> driver.dialect == :w3c if the Appium server support W3C.
78
+ #
79
+ def create_session(desired_capabilities)
80
+ caps = add_appium_prefix(desired_capabilities)
81
+ response = execute(:new_session, {}, { capabilities: { firstMatch: [caps] } })
82
+
83
+ @session_id = response['sessionId']
84
+ capabilities = response['capabilities']
85
+
86
+ raise ::Selenium::WebDriver::Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
87
+
88
+ @capabilities = json_create(capabilities)
89
+ end
90
+
91
+ # Append +appium:+ prefix for Appium following W3C spec
92
+ # https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
93
+ #
94
+ # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
95
+ # @return [::Selenium::WebDriver::Remote::Capabilities]
96
+ def add_appium_prefix(capabilities)
97
+ w3c_capabilities = ::Selenium::WebDriver::Remote::Capabilities.new
98
+
99
+ capabilities = capabilities.__send__(:capabilities) unless capabilities.is_a?(Hash)
100
+
101
+ capabilities.each do |name, value|
102
+ next if value.nil?
103
+ next if value.is_a?(String) && value.empty?
104
+
105
+ capability_name = name.to_s
106
+ w3c_name = extension_prefix?(capability_name) ? name : "#{APPIUM_PREFIX}#{capability_name}"
107
+
108
+ w3c_capabilities[w3c_name] = value
109
+ end
110
+
111
+ w3c_capabilities
112
+ end
113
+
114
+ private
115
+
116
+ def camel_case(str)
117
+ str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
118
+ end
119
+
120
+ def extension_prefix?(capability_name)
121
+ snake_cased_capability_names = ::Selenium::WebDriver::Remote::Capabilities::KNOWN.map(&:to_s)
122
+ camel_cased_capability_names = snake_cased_capability_names.map { |v| camel_case(v) }
123
+
124
+ # Check 'EXTENSION_CAPABILITY_PATTERN'
125
+ snake_cased_capability_names.include?(capability_name) ||
126
+ camel_cased_capability_names.include?(capability_name) ||
127
+ capability_name.match(':')
128
+ end
129
+
130
+ def json_create(value)
131
+ @dialect = :w3c
132
+ ::Selenium::WebDriver::Remote::Capabilities.json_create(value)
133
+ end
134
+
135
+ public
136
+
37
137
  def commands(command)
38
138
  ::Appium::Core::Commands::W3C::COMMANDS[command]
39
139
  end
@@ -43,6 +143,10 @@ module Appium
43
143
  execute :get_all_sessions
44
144
  end
45
145
 
146
+ def status
147
+ execute :status
148
+ end
149
+
46
150
  # Perform touch actions for W3C module.
47
151
  # Generate +touch+ pointer action here and users can use this via +driver.action+
48
152
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
@@ -72,7 +176,7 @@ module Appium
72
176
 
73
177
  # Port from MJSONWP
74
178
  def session_capabilities
75
- ::Selenium::WebDriver::Remote::W3C::Capabilities.json_create execute(:get_capabilities)
179
+ ::Selenium::WebDriver::Remote::Capabilities.json_create execute(:get_capabilities)
76
180
  end
77
181
 
78
182
  # Port from MJSONWP
@@ -166,18 +270,9 @@ module Appium
166
270
 
167
271
  # For Appium
168
272
  # No implementation for W3C webdriver module
169
- # called in +extend DriverExtensions::HasLocation+
170
- # It has below code as well. We should consider the same context in Selenium 4 as backward compatibility.
171
- #
172
- # def location=(loc)
173
- # # note: Location = Struct.new(:latitude, :longitude, :altitude)
174
- # raise TypeError, "expected #{Location}, got #{loc.inspect}:#{loc.class}" unless loc.is_a?(Location)
175
- #
176
- # @bridge.set_location loc.latitude, loc.longitude, loc.altitude
177
- # end
178
- #
179
- def set_location(lat, lon, alt = 0.0)
273
+ def set_location(lat, lon, alt = 0.0, speed: nil)
180
274
  loc = { latitude: lat, longitude: lon, altitude: alt }
275
+ loc[:speed] = speed unless speed.nil?
181
276
  execute :set_location, {}, { location: loc }
182
277
  end
183
278