Skip to content

Commit 2f888e7

Browse files
authored
fix: remove symbolize (#413)
1 parent 6d65b1b commit 2f888e7

File tree

7 files changed

+35
-98
lines changed

7 files changed

+35
-98
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Read `release_notes.md` for commit level details.
99
### Bug fixes
1010

1111
### Deprecations
12+
- 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)
1213

1314
## [5.4.0] - 2022-10-01
1415

lib/appium_lib_core/common/base/bridge.rb

+11-8
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ def browser
5353
# Override
5454
# Creates session handling.
5555
#
56-
# @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
57-
# @return [::Selenium::WebDriver::Remote::Capabilities]
56+
# @param [::Appium::Core::Base::Capabilities, Hash] capabilities A capability
57+
# @return [::Appium::Core::Base::Capabilities]
5858
#
5959
# @example
6060
#
@@ -89,10 +89,10 @@ def create_session(capabilities)
8989
# Append +appium:+ prefix for Appium following W3C spec
9090
# https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
9191
#
92-
# @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
93-
# @return [::Selenium::WebDriver::Remote::Capabilities]
92+
# @param [::Appium::Core::Base::Capabilities, Hash] capabilities A capability
93+
# @return [::Appium::Core::Base::Capabilities]
9494
def add_appium_prefix(capabilities)
95-
w3c_capabilities = ::Selenium::WebDriver::Remote::Capabilities.new
95+
w3c_capabilities = ::Appium::Core::Base::Capabilities.new
9696

9797
capabilities = capabilities.send(:capabilities) unless capabilities.is_a?(Hash)
9898

@@ -116,7 +116,7 @@ def camel_case(str_or_sym)
116116
end
117117

118118
def extension_prefix?(capability_name)
119-
snake_cased_capability_names = ::Selenium::WebDriver::Remote::Capabilities::KNOWN.map(&:to_s)
119+
snake_cased_capability_names = ::Appium::Core::Base::Capabilities::KNOWN.map(&:to_s)
120120
camel_cased_capability_names = snake_cased_capability_names.map { |v| camel_case(v) }
121121

122122
# Check 'EXTENSION_CAPABILITY_PATTERN'
@@ -126,7 +126,7 @@ def extension_prefix?(capability_name)
126126
end
127127

128128
def json_create(value)
129-
::Selenium::WebDriver::Remote::Capabilities.json_create(value)
129+
::Appium::Core::Base::Capabilities.json_create(value)
130130
end
131131

132132
public
@@ -182,7 +182,7 @@ def get_timeouts
182182

183183
# Port from MJSONWP
184184
def session_capabilities
185-
::Selenium::WebDriver::Remote::Capabilities.json_create execute(:get_capabilities)
185+
::Appium::Core::Base::Capabilities.json_create execute(:get_capabilities)
186186
end
187187

188188
# Override for safe. Newer ruby selenium webdriver already has the same code
@@ -345,6 +345,9 @@ def unwrap_script_result(arg)
345345
element_id = element_id_from(arg)
346346
return ::Appium::Core::Element.new(self, element_id) if element_id
347347

348+
shadow_root_id = shadow_root_id_from(arg)
349+
return ::Selenium::WebDriver::Remote::ShadowRoot.new self, shadow_root_id if shadow_root_id
350+
348351
arg.each { |k, v| arg[k] = unwrap_script_result(v) }
349352
else
350353
arg

lib/appium_lib_core/common/base/capabilities.rb

+8-16
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,14 @@
1515
module Appium
1616
module Core
1717
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.
3426
end
3527
end
3628
end

lib/appium_lib_core/driver.rb

+2-28
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,6 @@ def initialize(opts = {})
293293
@delegate_target = self # for testing purpose
294294
@automation_name = nil # initialise before 'set_automation_name'
295295

296-
opts = Appium.symbolize_keys opts
297-
validate_keys(opts)
298-
299296
@custom_url = opts.delete :url
300297
@caps = get_caps(opts)
301298

@@ -371,7 +368,7 @@ def start_driver(server_url: nil,
371368
begin
372369
@driver = ::Appium::Core::Base::Driver.new(listener: @listener,
373370
http_client: @http_client,
374-
capabilities: @caps, # ::Selenium::WebDriver::Remote::Capabilities
371+
capabilities: @caps, # ::Appium::Core::Base::Capabilities
375372
url: @custom_url,
376373
wait_timeout: @wait_timeout,
377374
wait_interval: @wait_interval,
@@ -555,32 +552,9 @@ def extend_for(device:, automation_name:) # rubocop:disable Metrics/CyclomaticCo
555552
self
556553
end
557554

558-
# @private
559-
def validate_keys(opts)
560-
flatten_ops = flatten_hash_keys(opts)
561-
562-
raise Error::NoCapabilityError unless opts.member?(:caps) || opts.member?(:capabilities)
563-
564-
if !opts.member?(:appium_lib) && flatten_ops.member?(:appium_lib)
565-
raise Error::CapabilityStructureError, 'Please check the value of appium_lib in the capability'
566-
end
567-
568-
true
569-
end
570-
571-
# @private
572-
def flatten_hash_keys(hash, flatten_keys_result = [])
573-
hash.each do |key, value|
574-
flatten_keys_result << key
575-
flatten_hash_keys(value, flatten_keys_result) if value.is_a?(Hash)
576-
end
577-
578-
flatten_keys_result
579-
end
580-
581555
# @private
582556
def get_caps(opts)
583-
Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:capabilities] || {})
557+
Core::Base::Capabilities.new(opts[:caps] || opts[:capabilities] || {})
584558
end
585559

586560
# @private

test/unit/appium_lib_core_test.rb

-18
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,6 @@ def test_version
2020
assert !::Appium::Core::VERSION.nil?
2121
end
2222

23-
def test_symbolize_keys
24-
result = ::Appium.symbolize_keys({ 'a' => 1, b: 2 })
25-
assert_equal({ a: 1, b: 2 }, result)
26-
end
27-
28-
def test_symbolize_keys_nested
29-
result = ::Appium.symbolize_keys({ 'a' => 1, b: { 'c' => 2, d: 3 } })
30-
assert_equal({ a: 1, b: { c: 2, d: 3 } }, result)
31-
end
32-
33-
def test_symbolize_keys_raise_argument_error
34-
e = assert_raises ::Appium::Core::Error::ArgumentError do
35-
::Appium.symbolize_keys('no hash value')
36-
end
37-
38-
assert_equal 'symbolize_keys requires a hash', e.message
39-
end
40-
4123
def test_url_param
4224
opts = {
4325
url: 'http://custom-host:8080/wd/hub.com',

test/unit/common_test.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,11 @@ def test_add_appium_prefix_already_have_appium_prefix
133133
someCapability2: 'someCapability2',
134134
'some_capability3' => 'string_shold_keep',
135135
'some_capability4' => {
136-
'nested_key1': 1,
136+
'nested_key1' => 1,
137137
nested_key2: 2
138138
}
139139
}
140-
base_caps = Appium::Core::Base::Capabilities.create_capabilities(cap)
140+
base_caps = Appium::Core::Base::Capabilities.new cap
141141

142142
expected = {
143143
'platformName' => :ios,
@@ -149,7 +149,7 @@ def test_add_appium_prefix_already_have_appium_prefix
149149
'someCapability1' => 'some_capability1',
150150
'someCapability2' => 'someCapability2',
151151
'some_capability3' => 'string_shold_keep',
152-
'some_capability4' => { 'nestedKey1' => 1, 'nestedKey2' => 2 }
152+
'some_capability4' => { 'nested_key1' => 1, 'nestedKey2' => 2 }
153153
}
154154
assert_equal expected, base_caps.as_json
155155

@@ -166,7 +166,7 @@ def test_add_appium_prefix_already_have_appium_prefix
166166
'appium:someCapability2' => 'someCapability2',
167167
'appium:some_capability3' => 'string_shold_keep',
168168
'appium:some_capability4' => {
169-
'nested_key1': 1,
169+
'nested_key1' => 1,
170170
nested_key2: 2
171171
}
172172
}
@@ -183,7 +183,7 @@ def test_add_appium_prefix_already_have_appium_prefix
183183
'appium:someCapability2' => 'someCapability2',
184184
'appium:some_capability3' => 'string_shold_keep',
185185
'appium:some_capability4' => {
186-
'nestedKey1' => 1,
186+
'nested_key1' => 1,
187187
'nestedKey2' => 2
188188
}
189189
}
@@ -192,7 +192,7 @@ def test_add_appium_prefix_already_have_appium_prefix
192192

193193
def test_add_appium_prefix_has_no_parameter
194194
cap = {}
195-
base_caps = Appium::Core::Base::Capabilities.create_capabilities(cap)
195+
base_caps = Appium::Core::Base::Capabilities.new cap
196196
expected = {}
197197

198198
assert_equal expected, @bridge.add_appium_prefix(base_caps).__send__(:capabilities)

test/unit/driver_test.rb

+7-22
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ def initialize(opts)
3131
end
3232
end
3333

34-
def test_no_caps
35-
opts = { no: { caps: {} }, appium_lib: {} }
36-
37-
assert_raises ::Appium::Core::Error::NoCapabilityError do
38-
ExampleDriver.new(opts)
39-
end
40-
end
41-
4234
def test_with_caps
4335
opts = { caps: { automationName: 'xcuitest' } }
4436
driver = ExampleDriver.new(opts)
@@ -60,25 +52,18 @@ def test_with_caps_and_appium_lib
6052
assert_equal driver.core.caps[:automationName], 'xcuitest'
6153
end
6254

63-
def test_with_caps_and_wrong_appium_lib
64-
opts = { caps: { appium_lib: {} } }
65-
assert_raises ::Appium::Core::Error::CapabilityStructureError do
66-
ExampleDriver.new(opts)
67-
end
68-
end
69-
7055
def test_verify_session_id_in_the_export_session_path
7156
@core.wait { assert File.size?(@core.export_session_path) }
7257
end
7358

7459
def test_verify_appium_core_base_capabilities_create_capabilities
75-
caps = ::Appium::Core::Base::Capabilities.create_capabilities(platformName: 'ios',
76-
platformVersion: '11.4',
77-
automationName: 'XCUITest',
78-
deviceName: 'iPhone Simulator',
79-
app: 'test/functional/app/UICatalog.app.zip',
80-
some_capability1: 'some_capability1',
81-
someCapability2: 'someCapability2')
60+
caps = ::Appium::Core::Base::Capabilities.new(platformName: 'ios',
61+
platformVersion: '11.4',
62+
automationName: 'XCUITest',
63+
deviceName: 'iPhone Simulator',
64+
app: 'test/functional/app/UICatalog.app.zip',
65+
some_capability1: 'some_capability1',
66+
someCapability2: 'someCapability2')
8267

8368
caps_with_json = JSON.parse(caps.to_json)
8469
assert_equal 'ios', caps_with_json['platformName']

0 commit comments

Comments
 (0)