@@ -2,6 +2,16 @@ module Appium
2
2
module Core
3
3
class Base
4
4
class Bridge < ::Selenium ::WebDriver ::Remote ::Bridge
5
+ # Almost same as self.handshake in ::Selenium::WebDriver::Remote::Bridge
6
+ #
7
+ # Implements protocol handshake which:
8
+ #
9
+ # 1. Creates session with driver.
10
+ # 2. Sniffs response.
11
+ # 3. Based on the response, understands which dialect we should use.
12
+ #
13
+ # @return [CoreBridgeMJSONWP, CoreBridgeW3C]
14
+ #
5
15
def self . handshake ( **opts )
6
16
desired_capabilities = opts . delete ( :desired_capabilities )
7
17
@@ -25,15 +35,50 @@ def self.handshake(**opts)
25
35
end
26
36
end
27
37
38
+ # Append `appium:` prefix for Appium following W3C spec
39
+ # https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
40
+ #
41
+ # @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] capabilities A capability
42
+ # @return [::Selenium::WebDriver::Remote::W3C::Capabilities]
43
+ def add_appium_prefix ( capabilities )
44
+ w3c_capabilities = ::Selenium ::WebDriver ::Remote ::W3C ::Capabilities . new
45
+
46
+ capabilities = capabilities . __send__ ( :capabilities ) unless capabilities . is_a? ( Hash )
47
+ capabilities . each do |name , value |
48
+ next if value . nil?
49
+ next if value . is_a? ( String ) && value . empty?
50
+
51
+ capability_name = name . to_s
52
+ w3c_name = appium_prefix? ( capability_name , w3c_capabilities ) ? name : "appium:#{ capability_name } "
53
+
54
+ w3c_capabilities [ w3c_name ] = value
55
+ end
56
+
57
+ w3c_capabilities
58
+ end
59
+
28
60
private
29
61
62
+ APPIUM_PREFIX = 'appium:' . freeze
63
+ def appium_prefix? ( capability_name , w3c_capabilities )
64
+ snake_cased_capability_names = ::Selenium ::WebDriver ::Remote ::W3C ::Capabilities ::KNOWN . map ( &:to_s )
65
+ camel_cased_capability_names = snake_cased_capability_names . map ( &w3c_capabilities . method ( :camel_case ) )
66
+
67
+ snake_cased_capability_names . include? ( capability_name ) ||
68
+ camel_cased_capability_names . include? ( capability_name ) ||
69
+ capability_name . start_with? ( APPIUM_PREFIX )
70
+ end
71
+
30
72
# Use capabilities directory because Appium's capability is based on W3C one.
31
- # Called in bridge.create_session(desired_capabilities)
73
+ # Called in bridge.create_session(desired_capabilities) from Parent class
32
74
def merged_capabilities ( desired_capabilities )
75
+ new_caps = add_appium_prefix ( desired_capabilities )
76
+ w3c_capabilities = ::Selenium ::WebDriver ::Remote ::W3C ::Capabilities . from_oss ( new_caps )
77
+
33
78
{
34
79
desiredCapabilities : desired_capabilities ,
35
80
capabilities : {
36
- firstMatch : [ desired_capabilities ]
81
+ firstMatch : [ w3c_capabilities ]
37
82
}
38
83
}
39
84
end
0 commit comments