Skip to content

Commit db6aa69

Browse files
authored
Switchable w3c format caps from capabilities (#41)
* define create_session to keep the process in appium side * add a description in changelog * be able to switch request format * remove pry * add tests for caps * add create session tests for android * fix rubocop * add example for API doc to enable w3c * add some comments * arrange soem documentation * add {} * change w3c to force_mjsonwp * update changelog * remove unused default param * rename force_mjsonwp to forceMjsonwp and remove the attribute in capability to the server * delete param from capability * fix tests for create session * fix rubocop * update changelog
1 parent dac4ff1 commit db6aa69

File tree

4 files changed

+170
-10
lines changed

4 files changed

+170
-10
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
## [Unreleased]
55
### Enhancements
66
- Refactor `create_session` in `Appium::Core::Base::Bridge`
7+
- Be able to communicate with Appium by `W3C` based webdriver protocol if the Appium supports W3C protocol.
8+
- If `forceMjsonwp: true` exists in the capability, the client try to communicate `mjsonwp` based protocol
9+
- By default, it depends on the response from the server
10+
- Read API doc for `Appium::Core::Base::Bridge#create_session` to read the example of `forceMjsonwp`
711

812
### Bug fixes
913

lib/appium_lib_core/common/base/bridge.rb

+74-10
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,57 @@ def self.handshake(**opts)
4242
# Creates session handling both OSS and W3C dialects.
4343
# Copy from Selenium::WebDriver::Remote::Bridge to keep using `merged_capabilities` for Appium
4444
#
45+
# If `desired_capabilities` has `forceMjsonwp: true` in the capability, this bridge works with mjsonwp protocol.
46+
# If `forceMjsonwp: false` or no the capability, it depends on server side whether this bridge works as w3c or mjsonwp.
47+
#
4548
# @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] capabilities A capability
4649
# @return [::Selenium::WebDriver::Remote::Capabilities, ::Selenium::WebDriver::Remote::W3C::Capabilities]
4750
#
51+
# @example
52+
#
53+
# opts = {
54+
# caps: {
55+
# platformName: :ios,
56+
# automationName: 'XCUITest',
57+
# app: 'test/functional/app/UICatalog.app',
58+
# platformVersion: '10.3',
59+
# deviceName: 'iPhone Simulator',
60+
# useNewWDA: true,
61+
# forceMjsonwp: true
62+
# },
63+
# appium_lib: {
64+
# wait: 30
65+
# }
66+
# }
67+
# core = ::Appium::Core.for(self, caps)
68+
# driver = core.start_driver #=> driver.dialect == :oss
69+
#
70+
# @example
71+
#
72+
# opts = {
73+
# caps: {
74+
# platformName: :ios,
75+
# automationName: 'XCUITest',
76+
# app: 'test/functional/app/UICatalog.app',
77+
# platformVersion: '10.3',
78+
# deviceName: 'iPhone Simulator',
79+
# useNewWDA: true,
80+
# },
81+
# appium_lib: {
82+
# wait: 30
83+
# }
84+
# }
85+
# core = ::Appium::Core.for(self, caps)
86+
# driver = core.start_driver #=> driver.dialect == :w3c if the Appium server support W3C.
87+
#
4888
def create_session(desired_capabilities)
4989
response = execute(:new_session, {}, merged_capabilities(desired_capabilities))
5090

5191
@session_id = response['sessionId']
52-
oss_status = response['status']
92+
oss_status = response['status'] # for compatibility with Appium 1.7.1-
5393
value = response['value']
5494

55-
if value.is_a?(Hash)
95+
if value.is_a?(Hash) # include for W3C format
5696
@session_id = value['sessionId'] if value.key?('sessionId')
5797

5898
if value.key?('capabilities')
@@ -114,17 +154,41 @@ def json_create(oss_status, value)
114154
end
115155
end
116156

117-
# Called in bridge.create_session(desired_capabilities) from Parent class
157+
def delete_force_mjsonwp(capabilities)
158+
w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.new
159+
160+
capabilities = capabilities.__send__(:capabilities) unless capabilities.is_a?(Hash)
161+
capabilities.each do |name, value|
162+
next if value.nil?
163+
next if value.is_a?(String) && value.empty?
164+
next if name == :forceMjsonwp
165+
166+
w3c_capabilities[name] = value
167+
end
168+
169+
w3c_capabilities
170+
end
171+
118172
def merged_capabilities(desired_capabilities)
119-
new_caps = add_appium_prefix(desired_capabilities)
120-
w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.from_oss(new_caps)
173+
force_mjsonwp = desired_capabilities[:forceMjsonwp]
174+
desired_capabilities = delete_force_mjsonwp(desired_capabilities) unless force_mjsonwp.nil?
121175

122-
{
123-
desiredCapabilities: desired_capabilities,
124-
capabilities: {
125-
firstMatch: [w3c_capabilities]
176+
if force_mjsonwp
177+
{
178+
desiredCapabilities: desired_capabilities
126179
}
127-
}
180+
else
181+
new_caps = add_appium_prefix(desired_capabilities)
182+
w3c_capabilities = ::Selenium::WebDriver::Remote::W3C::Capabilities.from_oss(new_caps)
183+
184+
{
185+
desiredCapabilities: desired_capabilities,
186+
capabilities: {
187+
alwaysMatch: w3c_capabilities,
188+
firstMatch: [{}]
189+
}
190+
}
191+
end
128192
end
129193
end # class Bridge
130194
end # class Base
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
require 'test_helper'
2+
3+
# $ rake test:func:android TEST=test/functional/android/webdriver/create_session_test.rb
4+
class AppiumLibCoreTest
5+
module WebDriver
6+
class CreateSessionTestTest < AppiumLibCoreTest::Function::TestCase
7+
def test_mjsonwp
8+
caps = Caps::ANDROID_OPS[:caps].merge({ forceMjsonwp: true })
9+
new_caps = Caps::ANDROID_OPS.merge({ caps: caps })
10+
core = ::Appium::Core.for(self, new_caps)
11+
12+
driver = core.start_driver
13+
14+
assert_equal :oss, driver.dialect
15+
assert driver.capabilities[:forceMjsonwp].nil?
16+
assert driver.capabilities['forceMjsonwp'].nil?
17+
end
18+
19+
# Require Appium 1.7.2+
20+
def test_w3c
21+
caps = Caps::ANDROID_OPS[:caps].merge({ forceMjsonwp: false })
22+
new_caps = Caps::ANDROID_OPS.merge({ caps: caps })
23+
core = ::Appium::Core.for(self, new_caps)
24+
25+
driver = core.start_driver
26+
27+
assert_equal :w3c, driver.dialect
28+
assert driver.capabilities[:forceMjsonwp].nil?
29+
assert driver.capabilities['forceMjsonwp'].nil?
30+
end
31+
32+
# Require Appium 1.7.2+
33+
def test_w3c_default
34+
caps = Caps::ANDROID_OPS
35+
core = ::Appium::Core.for(self, caps)
36+
37+
driver = core.start_driver
38+
39+
assert_equal :w3c, driver.dialect
40+
assert driver.capabilities[:forceMjsonwp].nil?
41+
assert driver.capabilities['forceMjsonwp'].nil?
42+
43+
driver.quit
44+
end
45+
end
46+
end
47+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
require 'test_helper'
2+
3+
# $ rake test:func:ios TEST=test/functional/ios/webdriver/create_session_test.rb
4+
class AppiumLibCoreTest
5+
module WebDriver
6+
class CreateSessionTestTest < AppiumLibCoreTest::Function::TestCase
7+
def test_mjsonwp
8+
caps = Caps::IOS_OPS[:caps].merge({ forceMjsonwp: true })
9+
new_caps = Caps::IOS_OPS.merge({ caps: caps })
10+
core = ::Appium::Core.for(self, new_caps)
11+
12+
driver = core.start_driver
13+
14+
assert_equal :oss, driver.dialect
15+
assert driver.capabilities[:forceMjsonwp].nil?
16+
assert driver.capabilities['forceMjsonwp'].nil?
17+
end
18+
19+
# Require Appium 1.7.2+
20+
def test_w3c
21+
caps = Caps::IOS_OPS[:caps].merge({ forceMjsonwp: false })
22+
new_caps = Caps::IOS_OPS.merge({ caps: caps })
23+
core = ::Appium::Core.for(self, new_caps)
24+
25+
driver = core.start_driver
26+
27+
assert_equal :w3c, driver.dialect
28+
assert driver.capabilities[:forceMjsonwp].nil?
29+
assert driver.capabilities['forceMjsonwp'].nil?
30+
end
31+
32+
# Require Appium 1.7.2+
33+
def test_w3c_default
34+
caps = Caps::IOS_OPS
35+
core = ::Appium::Core.for(self, caps)
36+
37+
driver = core.start_driver
38+
39+
assert_equal :w3c, driver.dialect
40+
assert driver.capabilities[:forceMjsonwp].nil?
41+
assert driver.capabilities['forceMjsonwp'].nil?
42+
end
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)