@@ -42,17 +42,57 @@ def self.handshake(**opts)
42
42
# Creates session handling both OSS and W3C dialects.
43
43
# Copy from Selenium::WebDriver::Remote::Bridge to keep using `merged_capabilities` for Appium
44
44
#
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
+ #
45
48
# @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] capabilities A capability
46
49
# @return [::Selenium::WebDriver::Remote::Capabilities, ::Selenium::WebDriver::Remote::W3C::Capabilities]
47
50
#
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
+ #
48
88
def create_session ( desired_capabilities )
49
89
response = execute ( :new_session , { } , merged_capabilities ( desired_capabilities ) )
50
90
51
91
@session_id = response [ 'sessionId' ]
52
- oss_status = response [ 'status' ]
92
+ oss_status = response [ 'status' ] # for compatibility with Appium 1.7.1-
53
93
value = response [ 'value' ]
54
94
55
- if value . is_a? ( Hash )
95
+ if value . is_a? ( Hash ) # include for W3C format
56
96
@session_id = value [ 'sessionId' ] if value . key? ( 'sessionId' )
57
97
58
98
if value . key? ( 'capabilities' )
@@ -114,17 +154,41 @@ def json_create(oss_status, value)
114
154
end
115
155
end
116
156
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
+
118
172
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?
121
175
122
- {
123
- desiredCapabilities : desired_capabilities ,
124
- capabilities : {
125
- firstMatch : [ w3c_capabilities ]
176
+ if force_mjsonwp
177
+ {
178
+ desiredCapabilities : desired_capabilities
126
179
}
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
128
192
end
129
193
end # class Bridge
130
194
end # class Base
0 commit comments