appium_lib_core 5.0.0 → 6.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -0
  3. data/README.md +55 -10
  4. data/appium_lib_core.gemspec +5 -5
  5. data/lib/appium_lib_core/common/base/bridge.rb +54 -40
  6. data/lib/appium_lib_core/common/base/capabilities.rb +8 -16
  7. data/lib/appium_lib_core/common/base/driver.rb +68 -40
  8. data/lib/appium_lib_core/common/base/has_location.rb +10 -10
  9. data/lib/appium_lib_core/common/base/http_default.rb +1 -1
  10. data/lib/appium_lib_core/common/base/rotable.rb +11 -3
  11. data/lib/appium_lib_core/common/base/search_context.rb +1 -2
  12. data/lib/appium_lib_core/common/command.rb +4 -2
  13. data/lib/appium_lib_core/common/device/app_management.rb +8 -14
  14. data/lib/appium_lib_core/common/device/value.rb +1 -3
  15. data/lib/appium_lib_core/common/error.rb +0 -4
  16. data/lib/appium_lib_core/driver.rb +170 -62
  17. data/lib/appium_lib_core/support/event_firing_bridge.rb +57 -0
  18. data/lib/appium_lib_core/version.rb +2 -2
  19. data/lib/appium_lib_core/{ios/uiautomation/bridge.rb → windows/device/app_management.rb} +20 -12
  20. data/lib/appium_lib_core/windows/device.rb +2 -0
  21. data/lib/appium_lib_core.rb +19 -5
  22. metadata +21 -34
  23. data/.github/ISSUE_TEMPLATE/issue-report.md +0 -29
  24. data/.github/contributing.md +0 -26
  25. data/.github/dependabot.yml +0 -8
  26. data/.github/issue_template.md +0 -20
  27. data/.github/workflows/unittest.yml +0 -67
  28. data/.gitignore +0 -18
  29. data/.rubocop.yml +0 -146
  30. data/azure-pipelines.yml +0 -15
  31. data/ci-jobs/functional/android_setup.yml +0 -3
  32. data/ci-jobs/functional/ios_setup.yml +0 -7
  33. data/ci-jobs/functional/publish_test_result.yml +0 -18
  34. data/ci-jobs/functional/run_appium.yml +0 -25
  35. data/ci-jobs/functional/start-emulator.sh +0 -26
  36. data/ci-jobs/functional_test.yml +0 -298
  37. data/docs/mobile_command.md +0 -34
  38. data/lib/appium_lib_core/ios/uiautomation/device.rb +0 -44
  39. data/lib/appium_lib_core/ios/uiautomation/patch.rb +0 -34
  40. data/lib/appium_lib_core/ios.rb +0 -20
  41. data/release_notes.md +0 -932
  42. data/script/commands.rb +0 -166
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88e1099c62a49f922529ee84563d0b475c160a981451da59210819e61956f985
4
- data.tar.gz: bb653d62d35c461e8e0c9dcec726064992e735418b20c85b4aa6aae16d9b0a88
3
+ metadata.gz: c45a558b448d89b1b356b221257279ff8c148680a1dc09f7414877e6e59a6257
4
+ data.tar.gz: d09d57109c80759c9b92942b7f8e1424c2614f34e4fcdbe9f6d4d0e48ee41816
5
5
  SHA512:
6
- metadata.gz: 1a18f9f6ea13b72f0aff09ea748c102fdfe202be60ac59f7fcaceee34485746a75fd83d8e438c2fd0447b64ce3c17655418ccdf599fba618afd75db7bab72e73
7
- data.tar.gz: 6cac7cbba8c64d8f97fa34af6adc1b33f432549950551826cfc0e1d0340e0add900b85bf0c09cbbfa9fae551aec873d68b08b9f301d9ace40e9716d453c3ca4b
6
+ metadata.gz: 6f50481e6656b18e7dfe5dc631137ab1ab041c9c6087fcf27b1fd24e91814e83ce051f22db1a3e4b41f5d2a4b8320e2ac7c323638e9e9b76d2508d66a7992cdf
7
+ data.tar.gz: 0b04644ee8c7704080935777b01886cca17acce8dab8c7953b769c9dd9ca33efc588e3da5e08bba6a91f0ac17bde973c607f3b886c4724eb84be3c44aece2690
data/CHANGELOG.md CHANGED
@@ -10,6 +10,146 @@ Read `release_notes.md` for commit level details.
10
10
 
11
11
  ### Deprecations
12
12
 
13
+ ## [6.3.0] - 2023-03-14
14
+
15
+ ### Enhancements
16
+ - Support custom listener
17
+ - e.g. A listener named `CustomListener` which inherits `::Selenium::WebDriver::Support::AbstractEventListener` can set as `appium_lib: { listener: CustomListener.new}` capability
18
+
19
+ ## [6.2.1] - 2023-03-09
20
+
21
+ ### Enhancements
22
+ - Add `uia_device_orientation_landscaperight` and `uia_device_orientation_portrait_upsidedown` symbols in the `drivede.rotation=`
23
+ - Add `drivede.orientation=` as a syntax sugar of `drivede.rotation=`
24
+
25
+
26
+ ## [6.2.0] - 2023-01-26
27
+
28
+ ### Enhancements
29
+
30
+ - Append `selenium-webdriver` `4.8` support
31
+ - Add `::Appium::Location` since `::Selenium::WebDriver::Location` no longer exists
32
+
33
+ ### Deprecations
34
+
35
+ - `::Selenium::WebDriver::Location` is deprecated in favor of `::Appium::Location` in Appium Ruby binding
36
+
37
+
38
+ ## [6.1.0] - 2023-01-18
39
+
40
+ ### Bug fixes
41
+ - `Element#immediate_value` sends `text` as the request body
42
+
43
+ ## [6.0.0] - 2022-12-25
44
+ - Remove iOS/UiAutomation classes
45
+ - The version may work for iOS 8. XCUITest driver will be the default behavior for iOS.
46
+
47
+ ## [5.8.0] - 2022-12-11
48
+
49
+ ### Enhancements
50
+ - Add `::Appium::Core::Driver#attach_to` to generate a driver instance which has the given session id.
51
+ - The primary usage is for debugging to attach to an existing session.
52
+
53
+ ## [5.7.0] - 2022-12-02
54
+
55
+ ### Enhancements
56
+ - Allow selenium webdriver version 4.7 [#423](https://github.com/appium/ruby_lib_core/pull/423)
57
+
58
+ ## [5.6.0] - 2022-11-08
59
+
60
+ ### Enhancements
61
+ - Append `selenium-webdriver` `4.6` support
62
+
63
+ ## [5.5.2] - 2022-10-11
64
+
65
+ ### Bug fixes
66
+ - Fix wrong deprecation message
67
+
68
+ ## [5.5.1] - 2022-10-10
69
+
70
+ ### Bug fixes
71
+ - Keep converting String to Symbol for `capabilities`, `caps` and `appium_lib` for the backward compatibility
72
+ - Wrong `automationName` and `platformName` detection in this library before starting a session
73
+
74
+ ### Deprecations
75
+ - Converting `capabilities`, `caps` and `appium_lib` from String to Symbol
76
+ - They are expected to be Symbol. Nothing affects existing users who already give the above keys as Symbol for `Appium::Core.for`.
77
+
78
+ ## [5.5.0] - 2022-10-09
79
+
80
+ ### Bug fixes
81
+ - Removed forcefully converting keys of capabilities into symbol, which caused unexpected capabilities format issue [ruby_lib/945](https://github.com/appium/ruby_lib/issues/945)
82
+
83
+ ## [5.4.0] - 2022-10-01
84
+
85
+ ### Enhancements
86
+ - Append `selnium-webdriver` `4.5` support
87
+
88
+ ## [5.3.0] - 2022-08-10
89
+
90
+ ### Enhancements
91
+
92
+ - Allow selenium webdriver version 4.4 [#404](https://github.com/appium/ruby_lib_core/pull/404)
93
+
94
+ ## [5.2.2] - 2022-06-26
95
+
96
+ ### Enhancements
97
+ - Relax the selenium webdriver version restriction of `4.2.0`
98
+
99
+ ### Bug fixes
100
+ - Remove undefined module in selenium webdriver version `4.3.0`
101
+
102
+ ## [5.2.1] - 2022-06-24
103
+
104
+ ### Bug fixes
105
+ - Restrict the selenium webdriver version to `4.2.0`
106
+
107
+ ## [5.2.0] - 2022-06-19
108
+
109
+ ### Enhancements
110
+
111
+ - Update base Selenium Ruby client to `4.2+`
112
+ - Please call `key_action` or set `[::Selenium::WebDriver::Interactions.key('keyboard')]` as the deviecs parameter to build `driver.send_keys().perform` W3C action.
113
+ - `driver.key_action.send_keys('xxx').perform` instead of `driver.action.send_keys('xxx').perform`, or `driver.action(devices: [::Selenium::WebDriver::Interactions.key('keyboard')]).send_keys('xxx').perform`.
114
+ - [This PR change](https://github.com/appium/ruby_lib_core/pull/381/files) will help to update your some actions.
115
+
116
+ ## [5.1.2] - 2022-06-02
117
+
118
+ ### Enhancements
119
+
120
+ - Limit selenium webdriver version less than `4.2`
121
+
122
+ ## [5.1.1] - 2022-04-18
123
+
124
+ ### Enhancements
125
+
126
+ - Remove unneccessry files from gem package to reduce the size.
127
+
128
+ ## [5.1.0] - 2021-12-25
129
+
130
+ ### Enhancements
131
+ - Make default pointerType `touch` for the pointer in W3C actions instead of `mouse` for Appium
132
+ - This change should not affect W3C actions
133
+
134
+ ## [5.0.3] - 2021-12-13
135
+
136
+ ### Enhancements
137
+ - Can add more arguments in `install_app`
138
+ - e.g. Add `timeoutMs` for XCUITest driver as `@driver.install_app("/path/to/test.ipa", timeoutMs: 20000)`
139
+
140
+ ### Bug fixes
141
+ - (internal) Allow to access to `bridge` attribute in `driver` instance for appium_flutter_finder
142
+
143
+ ## [5.0.2] - 2021-12-01
144
+
145
+ ### Bug fixes
146
+ - (internal) Fix firstMatch format in a new session creation
147
+
148
+ ## [5.0.1] - 2021-11-23
149
+
150
+ ### Enhancements
151
+ - Relaxed version restriction of selenium-webdriver
152
+
13
153
  ## [5.0.0] - 2021-11-05
14
154
 
15
155
  ### Enhancements
data/README.md CHANGED
@@ -10,12 +10,14 @@ This library wraps [selenium-webdriver](https://github.com/SeleniumHQ/selenium/w
10
10
 
11
11
  # Documentation
12
12
 
13
- - http://www.rubydoc.info/github/appium/ruby_lib_core
13
+ - https://www.rubydoc.info/gems/appium_lib_core
14
14
  - You can find working API examples in test code, [test/functional](test/functional)
15
+ - Appium 2.0
16
+ - https://appium.github.io/appium/docs/en/2.0/ (Not completed yet)
15
17
 
16
18
  # Migration from v4 to v5
17
19
 
18
- Please read `[5.0.0]` section in CHANGELOG.md
20
+ Please read [`[5.0.0]`](CHANGELOG.md#500---2021-11-05) section in [CHANGELOG](CHANGELOG.md)
19
21
 
20
22
  # Related library
21
23
  - https://github.com/appium/ruby_lib
@@ -30,20 +32,29 @@ $ bundle install
30
32
  $ bundle exec parallel_test test/unit/
31
33
  ```
32
34
 
35
+ or
36
+
37
+ ```bash
38
+ $ bundle install
39
+ $ bundle exec rake test:unit
40
+ ```
41
+
33
42
  ### Functional Tests
34
43
  Run functional tests which require the Appium server and real device, Simulator/Emulator.
35
44
 
36
- - Start Appium server
45
+ - Start Appium server (Appium 2.0 base)
37
46
  ```bash
38
- $ npm install -g appium opencv4nodejs
39
- $ appium --relaxed-security # To run all tests in local
47
+ $ npm install -g appium@next
48
+ $ appium driver install xcuitest
49
+ $ appium driver install uiautomator2 # etc
50
+ $ appium --base-path=/wd/hub --relaxed-security # To run all tests in local
40
51
  ```
41
52
 
42
53
  - Conduct tests
43
54
  ```bash
44
55
  $ bundle install
45
56
  $ rake test:func:android # Andorid, uiautomator2
46
- $ AUTOMATION_NAME_DROID=espresso rake test:func:android # Andorid, uiautomator2
57
+ $ APPIUM_DRIVER=espresso rake test:func:android # Andorid, uiautomator2
47
58
  $ rake test:func:ios # iOS
48
59
  ```
49
60
 
@@ -99,12 +110,12 @@ $ IGNORE_VERSION_SKIP=true CI=true bundle exec rake test:func:android
99
110
  require 'appium_lib_core'
100
111
 
101
112
  opts = {
102
- capabilities: { # or { caps: {....} }
103
- platformName: :ios,
113
+ capabilities: { # Append capabilities
114
+ platformName: 'ios',
104
115
  platformVersion: '11.0',
105
116
  deviceName: 'iPhone Simulator',
106
- automationName: 'XCUITest',
107
- app: '/path/to/MyiOS.app'
117
+ # app: '/path/to/MyiOS.app', # Without 'app' capability, an appium session starts with the home screen
118
+ automationName: 'XCUITest'
108
119
  },
109
120
  appium_lib: {
110
121
  wait: 30
@@ -125,13 +136,47 @@ $ IGNORE_VERSION_SKIP=true CI=true bundle exec rake test:func:android
125
136
  $ ruby test.rb
126
137
  ```
127
138
 
139
+ [Appium::Core.for](https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Driver#for-class_method) documentation has more example to build a new driver instance.
140
+
128
141
  More examples are in [test/functional](test/functional)
129
142
 
143
+ As of version 5.8.0, the client can attach to an existing session. The main purpose is for debugging.
144
+
145
+ ```ruby
146
+ # @driver is the driver instance of an existing session
147
+ attached_driver = ::Appium::Core::Driver.attach_to @driver.session_id, url: 'http://127.0.0.1:4723/wd/hub', automation_name: 'XCUITest', platform_name: 'ios'
148
+ assert attached_driver.session_id == @driver.session_id
149
+ attached_driver.page_source
150
+ ```
151
+
130
152
  ### Capabilities
131
153
 
132
154
  Read [Appium/Core/Driver](https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Driver) to catch up with available capabilities.
133
155
  Capabilities affect only ruby_lib is [Appium/Core/Options](https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Options).
134
156
 
157
+
158
+ ### Gives custom listener
159
+
160
+ An example to define a customer listener with [Selenium::WebDriver::Support::AbstractEventListener](https://www.selenium.dev/selenium/docs/api/rb/Selenium/WebDriver/Support/AbstractEventListener.html)
161
+
162
+ ```ruby
163
+ class CustomListener < ::Selenium::WebDriver::Support::AbstractEventListener
164
+ // something
165
+ end
166
+ capabilities: {
167
+ platformName: :ios,
168
+ platformVersion: '11.0',
169
+ deviceName: 'iPhone Simulator',
170
+ automationName: 'XCUITest',
171
+ app: '/path/to/MyiOS.app'
172
+ },
173
+ appium_lib: {
174
+ listener: CustomListener.new
175
+ }
176
+ @core = Appium::Core.for capabilities: capabilities, appium_lib: appium_lib
177
+ @core.start_driver
178
+ ```
179
+
135
180
  # Development
136
181
  - Demo app
137
182
  - https://android.googlesource.com/platform/development/+/master/samples/ApiDemos
@@ -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.6'
7
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7')
8
8
 
9
9
  spec.name = 'appium_lib_core'
10
10
  spec.version = Appium::Core::VERSION
@@ -16,21 +16,21 @@ Gem::Specification.new do |spec|
16
16
  spec.homepage = 'https://github.com/appium/ruby_lib_core/'
17
17
  spec.license = 'Apache-2.0'
18
18
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
- f.match(%r{^(doc|test|spec|features)/})
19
+ f.match(%r{(^(doc|docs|test|spec|features|ci-jobs|.github|script)/|release_notes.md|.gitignore|azure-pipelines.yml|.rubocop.yml)})
20
20
  end
21
21
  spec.bindir = 'exe'
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', '~> 4.0.0'
25
+ spec.add_runtime_dependency 'selenium-webdriver', '~> 4.2', '< 4.9'
26
26
  spec.add_runtime_dependency 'faye-websocket', '~> 0.11.0'
27
27
 
28
28
  spec.add_development_dependency 'rake', '~> 13.0'
29
29
  spec.add_development_dependency 'yard', '~> 0.9.11'
30
30
  spec.add_development_dependency 'minitest', '~> 5.0'
31
31
  spec.add_development_dependency 'minitest-reporters', '~> 1.1'
32
- spec.add_development_dependency 'webmock', '~> 3.14.0'
33
- spec.add_development_dependency 'rubocop', '1.22.3'
32
+ spec.add_development_dependency 'webmock', '~> 3.18.1'
33
+ spec.add_development_dependency 'rubocop', '1.47.0'
34
34
  spec.add_development_dependency 'appium_thor', '~> 1.0'
35
35
  spec.add_development_dependency 'parallel_tests'
36
36
  spec.add_development_dependency 'simplecov'
@@ -43,18 +43,44 @@ module Appium
43
43
 
44
44
  def browser
45
45
  @browser ||= begin
46
- name = @capabilities.browser_name
46
+ name = @capabilities&.browser_name
47
47
  name ? name.tr(' ', '_').downcase.to_sym : 'unknown'
48
48
  rescue KeyError
49
49
  APPIUM_NATIVE_BROWSER_NAME
50
50
  end
51
51
  end
52
52
 
53
+ # Appium only.
54
+ # Attach to an existing session.
55
+ #
56
+ # @param [String] The session id to attach to.
57
+ # @param [String] platform_name The platform name to keep in the dummy capabilities
58
+ # @param [String] platform_name The automation name to keep in the dummy capabilities
59
+ # @return [::Appium::Core::Base::Capabilities]
60
+ #
61
+ # @example
62
+ #
63
+ # new_driver = ::Appium::Core::Driver.attach_to(
64
+ # driver.session_id,
65
+ # url: 'http://127.0.0.1:4723/wd/hub', automation_name: 'UiAutomator2', platform_name: 'Android'
66
+ # )
67
+ #
68
+ def attach_to(session_id, platform_name, automation_name)
69
+ @available_commands = ::Appium::Core::Commands::COMMANDS.dup
70
+ @session_id = session_id
71
+
72
+ # generate a dummy capabilities instance which only has the given platformName and automationName
73
+ @capabilities = ::Appium::Core::Base::Capabilities.new(
74
+ 'platformName' => platform_name,
75
+ 'automationName' => automation_name
76
+ )
77
+ end
78
+
53
79
  # Override
54
80
  # Creates session handling.
55
81
  #
56
- # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
57
- # @return [::Selenium::WebDriver::Remote::Capabilities]
82
+ # @param [::Appium::Core::Base::Capabilities, Hash] capabilities A capability
83
+ # @return [::Appium::Core::Base::Capabilities]
58
84
  #
59
85
  # @example
60
86
  #
@@ -77,8 +103,8 @@ module Appium
77
103
  def create_session(capabilities)
78
104
  @available_commands = ::Appium::Core::Commands::COMMANDS.dup
79
105
 
80
- caps = add_appium_prefix(capabilities)
81
- response = execute(:new_session, {}, { capabilities: { alwaysMatch: caps, firstMatch: [] } })
106
+ always_match = add_appium_prefix(capabilities)
107
+ response = execute(:new_session, {}, { capabilities: { alwaysMatch: always_match, firstMatch: [{}] } })
82
108
 
83
109
  @session_id = response['sessionId']
84
110
  raise ::Selenium::WebDriver::Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
@@ -89,10 +115,10 @@ module Appium
89
115
  # Append +appium:+ prefix for Appium following W3C spec
90
116
  # https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
91
117
  #
92
- # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
93
- # @return [::Selenium::WebDriver::Remote::Capabilities]
118
+ # @param [::Appium::Core::Base::Capabilities, Hash] capabilities A capability
119
+ # @return [::Appium::Core::Base::Capabilities]
94
120
  def add_appium_prefix(capabilities)
95
- w3c_capabilities = ::Selenium::WebDriver::Remote::Capabilities.new
121
+ w3c_capabilities = ::Appium::Core::Base::Capabilities.new
96
122
 
97
123
  capabilities = capabilities.send(:capabilities) unless capabilities.is_a?(Hash)
98
124
 
@@ -111,12 +137,12 @@ module Appium
111
137
 
112
138
  private
113
139
 
114
- def camel_case(str)
115
- str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
140
+ def camel_case(str_or_sym)
141
+ str_or_sym.to_s.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
116
142
  end
117
143
 
118
144
  def extension_prefix?(capability_name)
119
- snake_cased_capability_names = ::Selenium::WebDriver::Remote::Capabilities::KNOWN.map(&:to_s)
145
+ snake_cased_capability_names = ::Appium::Core::Base::Capabilities::KNOWN.map(&:to_s)
120
146
  camel_cased_capability_names = snake_cased_capability_names.map { |v| camel_case(v) }
121
147
 
122
148
  # Check 'EXTENSION_CAPABILITY_PATTERN'
@@ -126,7 +152,7 @@ module Appium
126
152
  end
127
153
 
128
154
  def json_create(value)
129
- ::Selenium::WebDriver::Remote::Capabilities.json_create(value)
155
+ ::Appium::Core::Base::Capabilities.json_create(value)
130
156
  end
131
157
 
132
158
  public
@@ -153,26 +179,26 @@ module Appium
153
179
  execute :status
154
180
  end
155
181
 
156
- # Perform touch actions for W3C module.
182
+ # Perform 'touch' actions for W3C module.
157
183
  # Generate +touch+ pointer action here and users can use this via +driver.action+
158
184
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
159
185
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/PointerActions.html
160
186
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/KeyActions.html
161
187
  #
162
- # 'mouse' action is by default in the Ruby client. Appium server force the +mouse+ action to +touch+ once in
163
- # the server side. So we don't consider the case.
188
+ # The pointer type is 'touch' by default in the Appium Ruby client.
164
189
  #
165
190
  # @example
166
191
  #
167
192
  # element = @driver.find_element(:id, "some id")
168
193
  # @driver.action.click(element).perform # The 'click' is a part of 'PointerActions'
169
194
  #
170
- def action(async = false)
171
- # Used for default duration of each touch actions
172
- # Override from 250 milliseconds to 50 milliseconds
173
- action_builder = super
174
- action_builder.default_move_duration = 0.05
175
- action_builder
195
+ def action(_deprecated_async = nil, async: false, devices: nil)
196
+ ::Selenium::WebDriver::ActionBuilder.new(
197
+ self,
198
+ devices: devices || [::Selenium::WebDriver::Interactions.pointer(:touch, name: 'touch')],
199
+ async: async,
200
+ duration: 50 # milliseconds
201
+ )
176
202
  end
177
203
 
178
204
  # Port from MJSONWP
@@ -182,23 +208,7 @@ module Appium
182
208
 
183
209
  # Port from MJSONWP
184
210
  def session_capabilities
185
- ::Selenium::WebDriver::Remote::Capabilities.json_create execute(:get_capabilities)
186
- end
187
-
188
- # Port from MJSONWP
189
- def send_keys_to_active_element(key)
190
- text = ::Selenium::WebDriver::Keys.encode(key).join
191
- execute :send_keys_to_active_element, {}, { value: text.chars }
192
- end
193
-
194
- # For Appium
195
- # override
196
- def page_source
197
- # For W3C
198
- # execute_script('var source = document.documentElement.outerHTML;' \
199
- # 'if (!source) { source = new XMLSerializer().serializeToString(document); }' \
200
- # 'return source;')
201
- execute :get_page_source
211
+ ::Appium::Core::Base::Capabilities.json_create execute(:get_capabilities)
202
212
  end
203
213
 
204
214
  # For Appium
@@ -214,7 +224,8 @@ module Appium
214
224
  # override
215
225
  def element_attribute(element, name)
216
226
  # For W3C in Selenium Client
217
- # execute_atom :getAttribute, element, name
227
+ # execute_atom :getAttribute, element, name.
228
+ # 'dom_attribute' in the WebDriver Selenium.
218
229
  execute :get_element_attribute, id: element.id, name: name
219
230
  end
220
231
 
@@ -291,7 +302,7 @@ module Appium
291
302
  # called in 'extend DriverExtensions::HasLocation'
292
303
  def location
293
304
  obj = execute(:get_location) || {}
294
- ::Selenium::WebDriver::Location.new obj['latitude'], obj['longitude'], obj['altitude']
305
+ ::Appium::Location.new obj['latitude'], obj['longitude'], obj['altitude']
295
306
  end
296
307
 
297
308
  # For Appium
@@ -356,6 +367,9 @@ module Appium
356
367
  element_id = element_id_from(arg)
357
368
  return ::Appium::Core::Element.new(self, element_id) if element_id
358
369
 
370
+ shadow_root_id = shadow_root_id_from(arg)
371
+ return ::Selenium::WebDriver::Remote::ShadowRoot.new self, shadow_root_id if shadow_root_id
372
+
359
373
  arg.each { |k, v| arg[k] = unwrap_script_result(v) }
360
374
  else
361
375
  arg
@@ -15,22 +15,14 @@
15
15
  module Appium
16
16
  module Core
17
17
  class Base
18
- module Capabilities
19
- # @private
20
- # @param [Hash] opts_caps Capabilities for Appium server. All capability keys are converted to lowerCamelCase when
21
- # this client sends capabilities to Appium server as JSON format.
22
- # @return [::Selenium::WebDriver::Remote::Capabilities] Return instance of Appium::Core::Base::Capabilities
23
- # inherited ::Selenium::WebDriver::Remote::Capabilities
24
- def self.create_capabilities(opts_caps = {})
25
- # TODO: Move to 'Options' way instead of 'Capabilities'.
26
- # Selenium 5 will have Options instead of 'Capabilities'.
27
- # https://github.com/SeleniumHQ/selenium/blob/trunk/rb/lib/selenium/webdriver/common/options.rb
28
- # Then, Ruby client also shoud move to the Options way.
29
- # Appium's capabilities could change by depending on Appium versions. So it does not have
30
- # standard options like chrome and firefox etc. So, the implementation should differ from
31
- # other browsers. But here should inherit `Options` to follow Selenium.
32
- ::Selenium::WebDriver::Remote::Capabilities.new(opts_caps)
33
- end
18
+ class Capabilities < ::Selenium::WebDriver::Remote::Capabilities
19
+ # TODO: Move to 'Options' way instead of 'Capabilities'.
20
+ # Selenium 5 will have Options instead of 'Capabilities'.
21
+ # https://github.com/SeleniumHQ/selenium/blob/trunk/rb/lib/selenium/webdriver/common/options.rb
22
+ # Then, Ruby client also shoud move to the Options way.
23
+ # Appium's capabilities could change by depending on Appium versions. So it does not have
24
+ # standard options like chrome and firefox etc. So, the implementation should differ from
25
+ # other browsers. But here should inherit `Options` to follow Selenium.
34
26
  end
35
27
  end
36
28
  end