appium_lib_core 4.5.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: 27d5a8e4018e381172273c5b705a2166e8f47530101eed83ffd0ddf83e93653d
4
- data.tar.gz: 78ceb26083c9ae018101180cf13c91cd28f363e819119b6500b2d48a28273474
3
+ metadata.gz: fd462f64262abe99f03dd5a421f2a2dd9c8064f1d44eff47bc1872a834793d27
4
+ data.tar.gz: 1a1ca492c3551d8c992e9f2b740460e67239887400602351423062e49912b73f
5
5
  SHA512:
6
- metadata.gz: 5d07ce477474a38c3df1fb1bd989d9e6b28188ab21d7851bec98443940b0ea5d8b358c628998aeb1f62ca93be783c617dab3b4cf4fdf26e47e97def6467dca97
7
- data.tar.gz: 29634dc748e222cf65bc6af144656f291815e4c5eaea1fa177aa7e1543752ffbcbac0d4b206f4169ab306dd25e1d5a36c2a1b3d9b51cdef438456c27e52a7bea
6
+ metadata.gz: d9e4977dfb93ce734c59af5053a6331bfc2038bd3a03757a31fd7e48c3cdcc810204fb6f3027a1120afe91eda31ad61aa504fa25fdf2a2a21d36638c27982f8e
7
+ data.tar.gz: 3e23c561984a3ad4bf4214aad79fc730f8673d0bc29c81d26ff5143c0dbeb38d6eacc9278ba0caa11e4dfc51f82267f79b97efe6937ad8315c837e64876df162
@@ -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,6 +10,12 @@ Read `release_notes.md` for commit level details.
10
10
 
11
11
  ### Deprecations
12
12
 
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
+
13
19
  ## [4.5.0] - 2021-03-14
14
20
 
15
21
  ### 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'
@@ -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
@@ -76,7 +176,7 @@ module Appium
76
176
 
77
177
  # Port from MJSONWP
78
178
  def session_capabilities
79
- ::Selenium::WebDriver::Remote::W3C::Capabilities.json_create execute(:get_capabilities)
179
+ ::Selenium::WebDriver::Remote::Capabilities.json_create execute(:get_capabilities)
80
180
  end
81
181
 
82
182
  # Port from MJSONWP
@@ -19,10 +19,10 @@ module Appium
19
19
  # @private
20
20
  # @param [Hash] opts_caps Capabilities for Appium server. All capability keys are converted to lowerCamelCase when
21
21
  # this client sends capabilities to Appium server as JSON format.
22
- # @return [::Selenium::WebDriver::Remote::W3C::Capabilities] Return instance of Appium::Core::Base::Capabilities
23
- # inherited ::Selenium::WebDriver::Remote::W3C::Capabilities
22
+ # @return [::Selenium::WebDriver::Remote::Capabilities] Return instance of Appium::Core::Base::Capabilities
23
+ # inherited ::Selenium::WebDriver::Remote::Capabilities
24
24
  def self.create_capabilities(opts_caps = {})
25
- ::Selenium::WebDriver::Remote::W3C::Capabilities.new(opts_caps)
25
+ ::Selenium::WebDriver::Remote::Capabilities.new(opts_caps)
26
26
  end
27
27
  end
28
28
  end
@@ -16,8 +16,129 @@ module Appium
16
16
  module Core
17
17
  class Base
18
18
  module Commands
19
- OSS = ::Selenium::WebDriver::Remote::OSS::Bridge::COMMANDS.freeze
20
- W3C = ::Selenium::WebDriver::Remote::W3C::Bridge::COMMANDS.freeze
19
+ W3C = {
20
+ status: [:get, 'status'],
21
+
22
+ #
23
+ # session handling
24
+ #
25
+
26
+ new_session: [:post, 'session'],
27
+ delete_session: [:delete, 'session/:session_id'],
28
+
29
+ #
30
+ # basic driver
31
+ #
32
+
33
+ get: [:post, 'session/:session_id/url'],
34
+ get_current_url: [:get, 'session/:session_id/url'],
35
+ back: [:post, 'session/:session_id/back'],
36
+ forward: [:post, 'session/:session_id/forward'],
37
+ refresh: [:post, 'session/:session_id/refresh'],
38
+ get_title: [:get, 'session/:session_id/title'],
39
+
40
+ #
41
+ # window and Frame handling
42
+ #
43
+
44
+ get_window_handle: [:get, 'session/:session_id/window'],
45
+ new_window: [:post, 'session/:session_id/window/new'],
46
+ close_window: [:delete, 'session/:session_id/window'],
47
+ switch_to_window: [:post, 'session/:session_id/window'],
48
+ get_window_handles: [:get, 'session/:session_id/window/handles'],
49
+ fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
50
+ minimize_window: [:post, 'session/:session_id/window/minimize'],
51
+ maximize_window: [:post, 'session/:session_id/window/maximize'],
52
+ set_window_size: [:post, 'session/:session_id/window/size'],
53
+ get_window_size: [:get, 'session/:session_id/window/size'],
54
+ set_window_position: [:post, 'session/:session_id/window/position'],
55
+ get_window_position: [:get, 'session/:session_id/window/position'],
56
+ set_window_rect: [:post, 'session/:session_id/window/rect'],
57
+ get_window_rect: [:get, 'session/:session_id/window/rect'],
58
+ switch_to_frame: [:post, 'session/:session_id/frame'],
59
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
60
+
61
+ #
62
+ # element
63
+ #
64
+
65
+ find_element: [:post, 'session/:session_id/element'],
66
+ find_elements: [:post, 'session/:session_id/elements'],
67
+ find_child_element: [:post, 'session/:session_id/element/:id/element'],
68
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
69
+ get_active_element: [:get, 'session/:session_id/element/active'],
70
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
71
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
72
+ get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
73
+ get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
74
+ get_element_text: [:get, 'session/:session_id/element/:id/text'],
75
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
76
+ get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
77
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
78
+
79
+ #
80
+ # document handling
81
+ #
82
+
83
+ get_page_source: [:get, 'session/:session_id/source'],
84
+ execute_script: [:post, 'session/:session_id/execute/sync'],
85
+ execute_async_script: [:post, 'session/:session_id/execute/async'],
86
+
87
+ #
88
+ # cookies
89
+ #
90
+
91
+ get_all_cookies: [:get, 'session/:session_id/cookie'],
92
+ get_cookie: [:get, 'session/:session_id/cookie/:name'],
93
+ add_cookie: [:post, 'session/:session_id/cookie'],
94
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
95
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'],
96
+
97
+ #
98
+ # timeouts
99
+ #
100
+
101
+ set_timeout: [:post, 'session/:session_id/timeouts'],
102
+
103
+ #
104
+ # actions
105
+ #
106
+
107
+ actions: [:post, 'session/:session_id/actions'],
108
+ release_actions: [:delete, 'session/:session_id/actions'],
109
+ print_page: [:post, 'session/:session_id/print'],
110
+
111
+ #
112
+ # Element Operations
113
+ #
114
+
115
+ element_click: [:post, 'session/:session_id/element/:id/click'],
116
+ element_tap: [:post, 'session/:session_id/element/:id/tap'],
117
+ element_clear: [:post, 'session/:session_id/element/:id/clear'],
118
+ element_send_keys: [:post, 'session/:session_id/element/:id/value'],
119
+
120
+ #
121
+ # alerts
122
+ #
123
+
124
+ dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
125
+ accept_alert: [:post, 'session/:session_id/alert/accept'],
126
+ get_alert_text: [:get, 'session/:session_id/alert/text'],
127
+ send_alert_text: [:post, 'session/:session_id/alert/text'],
128
+
129
+ #
130
+ # screenshot
131
+ #
132
+
133
+ take_screenshot: [:get, 'session/:session_id/screenshot'],
134
+ take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
135
+
136
+ #
137
+ # server extensions
138
+ #
139
+
140
+ upload_file: [:post, 'session/:session_id/se/file']
141
+ }.freeze
21
142
  end # module Commands
22
143
  end # module Base
23
144
  end # module Core
@@ -18,6 +18,7 @@ require_relative 'screenshot'
18
18
  require_relative 'rotable'
19
19
  require_relative 'remote_status'
20
20
  require_relative 'has_location'
21
+ require_relative 'has_network_connection'
21
22
 
22
23
  module Appium
23
24
  module Core
@@ -27,23 +28,55 @@ module Appium
27
28
  include ::Selenium::WebDriver::DriverExtensions::HasSessionId
28
29
  include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
29
30
  include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
30
- include ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
31
- include ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
32
31
 
33
32
  include ::Appium::Core::Base::Rotatable
34
33
  include ::Appium::Core::Base::SearchContext
35
34
  include ::Appium::Core::Base::TakesScreenshot
36
35
  include ::Appium::Core::Base::HasRemoteStatus
37
36
  include ::Appium::Core::Base::HasLocation
37
+ include ::Appium::Core::Base::HasNetworkConnection
38
38
 
39
39
  # Private API.
40
40
  # Do not use this for general use. Used by flutter driver to get bridge for creating a new element
41
41
  attr_reader :bridge
42
42
 
43
- def initialize(opts = {})
44
- listener = opts.delete(:listener)
45
- @bridge = ::Appium::Core::Base::Bridge.handshake(**opts)
46
- super(@bridge, listener: listener)
43
+ # Almost same as self.handshake in ::Selenium::WebDriver::Remote::Bridge
44
+ #
45
+ # Implements protocol handshake which:
46
+ #
47
+ # 1. Creates session with driver.
48
+ # 2. Sniffs response.
49
+ # 3. Based on the response, understands which dialect we should use.
50
+ #
51
+ # @return [Bridge::W3C]
52
+ #
53
+ # TODO: Fixme
54
+ def create_bridge(**opts)
55
+ opts[:url] ||= service_url(opts)
56
+ caps = opts.delete(:capabilities)
57
+ # NOTE: This is deprecated
58
+ cap_array = caps.is_a?(Hash) ? [caps] : Array(caps)
59
+
60
+ desired_capabilities = opts.delete(:desired_capabilities)
61
+ if desired_capabilities
62
+ if desired_capabilities.is_a?(Hash)
63
+ desired_capabilities = ::Selenium::WebDriver::Remote::Capabilities(desired_capabilities)
64
+ end
65
+ cap_array << desired_capabilities
66
+ end
67
+
68
+ options = opts.delete(:options)
69
+ cap_array << options if options
70
+
71
+ capabilities = generate_capabilities(cap_array)
72
+
73
+ bridge_opts = { http_client: opts.delete(:http_client), url: opts.delete(:url) }
74
+ raise ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty?
75
+
76
+ bridge = ::Appium::Core::Base::Bridge::W3C.new(**bridge_opts)
77
+
78
+ bridge.create_session(capabilities)
79
+ bridge
47
80
  end
48
81
 
49
82
  # Get the dialect value
@@ -164,10 +197,24 @@ module Appium
164
197
  @bridge = bridge
165
198
  end
166
199
 
200
+ # Get appium Settings for current test session.
201
+ #
202
+ # @example
203
+ #
204
+ # @driver.settings.get
205
+ #
167
206
  def get
168
207
  @bridge.get_settings
169
208
  end
170
209
 
210
+ # Update Appium Settings for current test session
211
+ #
212
+ # @param [Hash] settings Settings to update, keys are settings, values to value to set each setting to
213
+ #
214
+ # @example
215
+ #
216
+ # @driver.settings.update({'allowInvisibleElements': true})
217
+ #
171
218
  def update(settings)
172
219
  @bridge.update_settings(settings)
173
220
  end
@@ -204,8 +251,8 @@ module Appium
204
251
  #
205
252
  # @example
206
253
  #
207
- # @driver.update_settings('allowInvisibleElements': true)
208
- # @driver.settings.update('allowInvisibleElements': true)
254
+ # @driver.update_settings({ 'allowInvisibleElements': true })
255
+ # @driver.settings.update({ 'allowInvisibleElements': true })
209
256
  # @driver.settings = { 'allowInvisibleElements': true }
210
257
  #
211
258
  def settings=(value)
@@ -887,13 +934,13 @@ module Appium
887
934
  # Retrieve the capabilities of the specified session.
888
935
  # It's almost same as +@driver.capabilities+ but you can get more details.
889
936
  #
890
- # @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::W3C::Capabilities]
937
+ # @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::Capabilities]
891
938
  #
892
939
  # @example
893
940
  # @driver.session_capabilities
894
941
  #
895
942
  # #=> uiautomator2
896
- # # <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fa38dae1360
943
+ # # <Selenium::WebDriver::Remote::Capabilities:0x007fa38dae1360
897
944
  # # @capabilities=
898
945
  # # {:proxy=>nil,
899
946
  # # :browser_name=>nil,
@@ -943,7 +990,7 @@ module Appium
943
990
  # # "viewportRect"=>{"left"=>0, "top"=>63, "width"=>1080, "height"=>1731}}>
944
991
  # #
945
992
  # #=> XCUITest
946
- # # <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fb15dc01370
993
+ # # <Selenium::WebDriver::Remote::Capabilities:0x007fb15dc01370
947
994
  # # @capabilities=
948
995
  # # {:proxy=>nil,
949
996
  # # :browser_name=>"UICatalog",
@@ -0,0 +1,56 @@
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 HasNetworkConnection
22
+ def network_connection_type
23
+ connection_value = @bridge.network_connection
24
+
25
+ connection_type = values_to_type[connection_value]
26
+
27
+ # In case the connection type is not recognized return the
28
+ # connection value.
29
+ connection_type || connection_value
30
+ end
31
+
32
+ def network_connection_type=(connection_type)
33
+ raise ArgumentError, 'Invalid connection type' unless valid_type? connection_type
34
+
35
+ connection_value = type_to_values[connection_type]
36
+
37
+ @bridge.network_connection = connection_value
38
+ end
39
+
40
+ private
41
+
42
+ def type_to_values
43
+ { airplane_mode: 1, wifi: 2, data: 4, all: 6, none: 0 }
44
+ end
45
+
46
+ def values_to_type
47
+ type_to_values.invert
48
+ end
49
+
50
+ def valid_type?(type)
51
+ type_to_values.keys.include? type
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -14,5 +14,4 @@
14
14
 
15
15
  require_relative 'base/command'
16
16
  require_relative 'command/common'
17
- require_relative 'command/mjsonwp'
18
17
  require_relative 'command/w3c'
@@ -79,10 +79,6 @@ module Appium
79
79
  end
80
80
 
81
81
  def create_bridge_command(method, &block)
82
- ::Appium::Core::Base::Bridge::MJSONWP.class_eval do
83
- undef_method method if method_defined? method
84
- block_given? ? class_eval(&block) : define_method(method) { execute method }
85
- end
86
82
  ::Appium::Core::Base::Bridge::W3C.class_eval do
87
83
  undef_method method if method_defined? method
88
84
  block_given? ? class_eval(&block) : define_method(method) { execute method }
@@ -368,10 +368,10 @@ module Appium
368
368
 
369
369
  begin
370
370
  # included https://github.com/SeleniumHQ/selenium/blob/43f8b3f66e7e01124eff6a5805269ee441f65707/rb/lib/selenium/webdriver/remote/driver.rb#L29
371
- @driver = ::Appium::Core::Base::Driver.new(http_client: @http_client,
372
- desired_capabilities: @caps,
373
- url: @custom_url,
374
- listener: @listener)
371
+ @driver = ::Appium::Core::Base::Driver.new(listener: @listener,
372
+ http_client: @http_client,
373
+ desired_capabilities: @caps,
374
+ url: @custom_url)
375
375
 
376
376
  if @direct_connect
377
377
  d_c = DirectConnections.new(@driver.capabilities)
@@ -14,7 +14,7 @@
14
14
 
15
15
  module Appium
16
16
  module Core
17
- VERSION = '4.5.0' unless defined? ::Appium::Core::VERSION
18
- DATE = '2021-03-14' unless defined? ::Appium::Core::DATE
17
+ VERSION = '5.0.0.beta1' unless defined? ::Appium::Core::VERSION
18
+ DATE = '2021-03-21' unless defined? ::Appium::Core::DATE
19
19
  end
20
20
  end
data/script/commands.rb CHANGED
@@ -18,25 +18,21 @@ require './lib/appium_lib_core'
18
18
  module Script
19
19
  class CommandsChecker
20
20
  attr_reader :spec_commands,
21
- :implemented_mjsonwp_commands, :implemented_w3c_commands, :implemented_core_commands,
22
- :webdriver_oss_commands, :webdriver_w3c_commands
21
+ :implemented_w3c_commands, :implemented_core_commands,
22
+ :webdriver_w3c_commands
23
23
 
24
24
  # Set commands implemented in this core library.
25
25
  #
26
- # - implemented_mjsonwp_commands: All commands include ::Selenium::WebDriver::Remote::OSS::Bridge::COMMANDS
27
26
  # - implemented_w3c_commands: All commands include ::Selenium::WebDriver::Remote::W3C::Bridge::COMMANDS
28
27
  # - implemented_core_commands: All commands except for selenium-webdriver's commands
29
- # - webdriver_oss_commands: ::Selenium::WebDriver::Remote::OSS::Bridge::COMMANDS
30
28
  # - webdriver_w3c_commands: ::Selenium::WebDriver::Remote::W3C::Bridge::COMMANDS
31
29
  #
32
30
  def initialize
33
31
  @spec_commands = nil
34
32
 
35
- @implemented_mjsonwp_commands = convert_driver_commands Appium::Core::Commands::MJSONWP::COMMANDS
36
33
  @implemented_w3c_commands = convert_driver_commands Appium::Core::Commands::W3C::COMMANDS
37
34
  @implemented_core_commands = convert_driver_commands Appium::Core::Commands::COMMANDS
38
35
 
39
- @webdriver_oss_commands = convert_driver_commands Appium::Core::Base::Commands::OSS
40
36
  @webdriver_w3c_commands = convert_driver_commands Appium::Core::Base::Commands::W3C
41
37
  end
42
38
 
@@ -80,18 +76,6 @@ module Script
80
76
  end
81
77
  end
82
78
 
83
- # All commands which haven't been implemented in ruby core library yet.
84
- # @return [Hash]
85
- #
86
- def all_diff_commands_mjsonwp
87
- result = compare_commands(@spec_commands, @implemented_mjsonwp_commands)
88
-
89
- white_list.each { |v| result.delete v }
90
- w3c_spec.each { |v| result.delete v }
91
-
92
- result
93
- end
94
-
95
79
  # All commands which haven't been implemented in ruby core library yet.
96
80
  # @return [Hash]
97
81
  #
@@ -111,13 +95,6 @@ module Script
111
95
  result
112
96
  end
113
97
 
114
- def diff_webdriver_oss
115
- result = compare_commands(@spec_commands, @webdriver_oss_commands)
116
- white_list.each { |v| result.delete v }
117
- w3c_spec.each { |v| result.delete v }
118
- result
119
- end
120
-
121
98
  def diff_webdriver_w3c
122
99
  result = compare_commands(@spec_commands, @webdriver_w3c_commands)
123
100
  white_list.each { |v| result.delete v }
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.5.0
4
+ version: 5.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuaki MATSUO
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-15 00:00:00.000000000 Z
11
+ date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.14'
20
- - - ">="
17
+ - - '='
21
18
  - !ruby/object:Gem::Version
22
- version: 3.14.1
19
+ version: 4.0.0.beta2
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '3.14'
30
- - - ">="
24
+ - - '='
31
25
  - !ruby/object:Gem::Version
32
- version: 3.14.1
26
+ version: 4.0.0.beta2
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: faye-websocket
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -120,28 +114,28 @@ dependencies:
120
114
  requirements:
121
115
  - - "~>"
122
116
  - !ruby/object:Gem::Version
123
- version: 3.11.0
117
+ version: 3.12.1
124
118
  type: :development
125
119
  prerelease: false
126
120
  version_requirements: !ruby/object:Gem::Requirement
127
121
  requirements:
128
122
  - - "~>"
129
123
  - !ruby/object:Gem::Version
130
- version: 3.11.0
124
+ version: 3.12.1
131
125
  - !ruby/object:Gem::Dependency
132
126
  name: rubocop
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - '='
136
130
  - !ruby/object:Gem::Version
137
- version: 1.8.1
131
+ version: 1.11.0
138
132
  type: :development
139
133
  prerelease: false
140
134
  version_requirements: !ruby/object:Gem::Requirement
141
135
  requirements:
142
136
  - - '='
143
137
  - !ruby/object:Gem::Version
144
- version: 1.8.1
138
+ version: 1.11.0
145
139
  - !ruby/object:Gem::Dependency
146
140
  name: appium_thor
147
141
  requirement: !ruby/object:Gem::Requirement
@@ -262,12 +256,12 @@ files:
262
256
  - lib/appium_lib_core/common.rb
263
257
  - lib/appium_lib_core/common/base.rb
264
258
  - lib/appium_lib_core/common/base/bridge.rb
265
- - lib/appium_lib_core/common/base/bridge/mjsonwp.rb
266
259
  - lib/appium_lib_core/common/base/bridge/w3c.rb
267
260
  - lib/appium_lib_core/common/base/capabilities.rb
268
261
  - lib/appium_lib_core/common/base/command.rb
269
262
  - lib/appium_lib_core/common/base/driver.rb
270
263
  - lib/appium_lib_core/common/base/has_location.rb
264
+ - lib/appium_lib_core/common/base/has_network_connection.rb
271
265
  - lib/appium_lib_core/common/base/http_default.rb
272
266
  - lib/appium_lib_core/common/base/platform.rb
273
267
  - lib/appium_lib_core/common/base/remote_status.rb
@@ -276,7 +270,6 @@ files:
276
270
  - lib/appium_lib_core/common/base/search_context.rb
277
271
  - lib/appium_lib_core/common/command.rb
278
272
  - lib/appium_lib_core/common/command/common.rb
279
- - lib/appium_lib_core/common/command/mjsonwp.rb
280
273
  - lib/appium_lib_core/common/command/w3c.rb
281
274
  - lib/appium_lib_core/common/device/app_management.rb
282
275
  - lib/appium_lib_core/common/device/app_state.rb
@@ -342,12 +335,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
342
335
  requirements:
343
336
  - - ">="
344
337
  - !ruby/object:Gem::Version
345
- version: '2.4'
338
+ version: '2.5'
346
339
  required_rubygems_version: !ruby/object:Gem::Requirement
347
340
  requirements:
348
- - - ">="
341
+ - - ">"
349
342
  - !ruby/object:Gem::Version
350
- version: '0'
343
+ version: 1.3.1
351
344
  requirements: []
352
345
  rubygems_version: 3.1.2
353
346
  signing_key:
@@ -1,91 +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 MJSONWP < ::Selenium::WebDriver::Remote::OSS::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::MJSONWP::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
- def status
46
- execute :status
47
- end
48
-
49
- # For Appium
50
- def log_event(vendor, event)
51
- execute :post_log_event, {}, { vendor: vendor, event: event }
52
- end
53
-
54
- # For Appium
55
- def log_events(type = nil)
56
- args = {}
57
- args['type'] = type unless type.nil?
58
-
59
- execute :get_log_events, {}, args
60
- end
61
-
62
- def take_element_screenshot(element)
63
- execute :take_element_screenshot, id: element.ref
64
- end
65
-
66
- def take_viewport_screenshot
67
- # TODO: this hasn't been supported by Espresso driver
68
- execute_script('mobile: viewportScreenshot')
69
- end
70
-
71
- def send_actions(_data)
72
- raise Error::UnsupportedOperationError, '#send_actions has not been supported in MJSONWP'
73
- end
74
-
75
- # For Appium
76
- # @param [Hash] id The id which can get as a response from server
77
- # @return [::Selenium::WebDriver::Element]
78
- def convert_to_element(id)
79
- ::Selenium::WebDriver::Element.new self, element_id_from(id)
80
- end
81
-
82
- def set_location(lat, lon, alt = 0.0, speed: nil)
83
- loc = { latitude: lat, longitude: lon, altitude: alt }
84
- loc[:speed] = speed unless speed.nil?
85
- execute :set_location, {}, { location: loc }
86
- end
87
- end # class MJSONWP
88
- end # class Bridge
89
- end # class Base
90
- end # module Core
91
- end # module Appium
@@ -1,28 +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 MJSONWP
19
- COMMANDS = ::Appium::Core::Commands::COMMANDS.merge(::Appium::Core::Base::Commands::OSS).merge(
20
- {
21
- # W3C already has.
22
- take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot']
23
- }
24
- ).freeze
25
- end # module MJSONWP
26
- end # module Commands
27
- end # module Core
28
- end # Appium