appium_lib_core 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -1
- data/CHANGELOG.md +15 -1
- data/appium_lib_core.gemspec +1 -1
- data/lib/appium_lib_core/android/device.rb +1 -0
- data/lib/appium_lib_core/common/base.rb +2 -2
- data/lib/appium_lib_core/common/base/bridge.rb +123 -15
- data/lib/appium_lib_core/common/base/bridge/msjsonwp.rb +13 -0
- data/lib/appium_lib_core/common/base/bridge/w3c.rb +160 -0
- data/lib/appium_lib_core/common/base/driver.rb +12 -0
- data/lib/appium_lib_core/common/command.rb +10 -9
- data/lib/appium_lib_core/common/device.rb +8 -2
- data/lib/appium_lib_core/common/log.rb +7 -5
- data/lib/appium_lib_core/version.rb +2 -2
- data/release_notes.md +10 -0
- metadata +6 -6
- data/lib/appium_lib_core/common/base/msjsonwp_bridge.rb +0 -11
- data/lib/appium_lib_core/common/base/w3c_bridge.rb +0 -129
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44fc100d5d5e9bd6eca0c7710db01c24e6f80c2e
|
4
|
+
data.tar.gz: cdba41bed57c4d4f509e39460a273f697f1d19d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ffd78624d5ffec1e6835dbf3f17c6664addc16e6d16ff4b1d58befaa96f0b1b6b0b6a5625cc7be98946858a69c2126e7b264668de458da94df48a03b71219fe
|
7
|
+
data.tar.gz: 83e202a1d228ae437a1ae20daecbf94b1a460994e3f6a829374872558a61cdaa1fe0221517945ad331168607f0e71e25aa1ce31863efba945f0037a8dcfb1d24
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,7 +5,21 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
### Enhancements
|
6
6
|
|
7
7
|
### Bug fixes
|
8
|
-
|
8
|
+
|
9
|
+
### Deprecations
|
10
|
+
|
11
|
+
## [1.2.4] - 2018-01-03
|
12
|
+
### Enhancements
|
13
|
+
- Refactor `create_session` in `Appium::Core::Base::Bridge`
|
14
|
+
- Be able to communicate with Appium by `W3C` based webdriver protocol if the Appium supports W3C protocol.
|
15
|
+
- If `forceMjsonwp: true` exists in the capability, the client try to communicate `mjsonwp` based protocol
|
16
|
+
- By default, it depends on the response from the server
|
17
|
+
- Read API doc for `Appium::Core::Base::Bridge#create_session` to read the example of `forceMjsonwp`
|
18
|
+
- Backport some commands from OSS module to W3C module
|
19
|
+
- Read `lib/appium_lib_core/common/base/w3c_bridge.rb` for more details
|
20
|
+
- Can get logs like `driver.logs.available_types` and `driver.logs.get`
|
21
|
+
|
22
|
+
### Bug fixes
|
9
23
|
|
10
24
|
### Deprecations
|
11
25
|
|
data/appium_lib_core.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency 'json', '>= 1.8'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
29
|
-
spec.add_development_dependency 'rake', '~>
|
29
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
30
30
|
spec.add_development_dependency 'yard', '~> 0.9.11'
|
31
31
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
32
32
|
spec.add_development_dependency 'minitest-reporters', '~> 1.1'
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# The following files have selenium-webdriver related stuff.
|
2
2
|
require_relative 'base/driver'
|
3
3
|
require_relative 'base/bridge'
|
4
|
-
require_relative 'base/
|
5
|
-
require_relative 'base/
|
4
|
+
require_relative 'base/bridge/msjsonwp'
|
5
|
+
require_relative 'base/bridge/w3c'
|
6
6
|
require_relative 'base/capabilities'
|
7
7
|
require_relative 'base/http_default'
|
8
8
|
require_relative 'base/search_context'
|
@@ -2,6 +2,9 @@ module Appium
|
|
2
2
|
module Core
|
3
3
|
class Base
|
4
4
|
class Bridge < ::Selenium::WebDriver::Remote::Bridge
|
5
|
+
# Prefix for extra capability defined by W3C
|
6
|
+
APPIUM_PREFIX = 'appium:'.freeze
|
7
|
+
|
5
8
|
# Almost same as self.handshake in ::Selenium::WebDriver::Remote::Bridge
|
6
9
|
#
|
7
10
|
# Implements protocol handshake which:
|
@@ -10,13 +13,13 @@ module Appium
|
|
10
13
|
# 2. Sniffs response.
|
11
14
|
# 3. Based on the response, understands which dialect we should use.
|
12
15
|
#
|
13
|
-
# @return [
|
16
|
+
# @return [Bridge::MJSONWP, Bridge::W3C]
|
14
17
|
#
|
15
18
|
def self.handshake(**opts)
|
16
19
|
desired_capabilities = opts.delete(:desired_capabilities)
|
17
20
|
|
18
21
|
if desired_capabilities.is_a?(Symbol)
|
19
|
-
unless Remote::Capabilities.respond_to?(desired_capabilities)
|
22
|
+
unless ::Selenium::WebDriver::Remote::Capabilities.respond_to?(desired_capabilities)
|
20
23
|
raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
|
21
24
|
end
|
22
25
|
desired_capabilities = Remote::Capabilities.__send__(desired_capabilities)
|
@@ -27,14 +30,85 @@ module Appium
|
|
27
30
|
|
28
31
|
case bridge.dialect
|
29
32
|
when :oss # for MJSONWP
|
30
|
-
|
33
|
+
Bridge::MJSONWP.new(capabilities, bridge.session_id, opts)
|
31
34
|
when :w3c
|
32
|
-
|
35
|
+
Bridge::W3C.new(capabilities, bridge.session_id, opts)
|
33
36
|
else
|
34
37
|
raise CoreError, 'cannot understand dialect'
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
41
|
+
# Override
|
42
|
+
# Creates session handling both OSS and W3C dialects.
|
43
|
+
# Copy from Selenium::WebDriver::Remote::Bridge to keep using `merged_capabilities` for Appium
|
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
|
+
#
|
48
|
+
# @param [::Selenium::WebDriver::Remote::W3C::Capabilities, Hash] capabilities A capability
|
49
|
+
# @return [::Selenium::WebDriver::Remote::Capabilities, ::Selenium::WebDriver::Remote::W3C::Capabilities]
|
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
|
+
#
|
88
|
+
def create_session(desired_capabilities)
|
89
|
+
response = execute(:new_session, {}, merged_capabilities(desired_capabilities))
|
90
|
+
|
91
|
+
@session_id = response['sessionId']
|
92
|
+
oss_status = response['status'] # for compatibility with Appium 1.7.1-
|
93
|
+
value = response['value']
|
94
|
+
|
95
|
+
if value.is_a?(Hash) # include for W3C format
|
96
|
+
@session_id = value['sessionId'] if value.key?('sessionId')
|
97
|
+
|
98
|
+
if value.key?('capabilities')
|
99
|
+
value = value['capabilities']
|
100
|
+
elsif value.key?('value')
|
101
|
+
value = value['value']
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
unless @session_id
|
106
|
+
raise Error::WebDriverError, 'no sessionId in returned payload'
|
107
|
+
end
|
108
|
+
|
109
|
+
json_create(oss_status, value)
|
110
|
+
end
|
111
|
+
|
38
112
|
# Append `appium:` prefix for Appium following W3C spec
|
39
113
|
# https://www.w3.org/TR/webdriver/#dfn-validate-capabilities
|
40
114
|
#
|
@@ -49,7 +123,7 @@ module Appium
|
|
49
123
|
next if value.is_a?(String) && value.empty?
|
50
124
|
|
51
125
|
capability_name = name.to_s
|
52
|
-
w3c_name = appium_prefix?(capability_name, w3c_capabilities) ? name : "
|
126
|
+
w3c_name = appium_prefix?(capability_name, w3c_capabilities) ? name : "#{APPIUM_PREFIX}#{capability_name}"
|
53
127
|
|
54
128
|
w3c_capabilities[w3c_name] = value
|
55
129
|
end
|
@@ -59,7 +133,6 @@ module Appium
|
|
59
133
|
|
60
134
|
private
|
61
135
|
|
62
|
-
APPIUM_PREFIX = 'appium:'.freeze
|
63
136
|
def appium_prefix?(capability_name, w3c_capabilities)
|
64
137
|
snake_cased_capability_names = ::Selenium::WebDriver::Remote::W3C::Capabilities::KNOWN.map(&:to_s)
|
65
138
|
camel_cased_capability_names = snake_cased_capability_names.map(&w3c_capabilities.method(:camel_case))
|
@@ -69,18 +142,53 @@ module Appium
|
|
69
142
|
capability_name.start_with?(APPIUM_PREFIX)
|
70
143
|
end
|
71
144
|
|
72
|
-
|
73
|
-
|
145
|
+
def json_create(oss_status, value)
|
146
|
+
if oss_status
|
147
|
+
::Selenium::WebDriver.logger.info 'Detected OSS dialect.'
|
148
|
+
@dialect = :oss
|
149
|
+
::Selenium::WebDriver::Remote::Capabilities.json_create(value)
|
150
|
+
else
|
151
|
+
::Selenium::WebDriver.logger.info 'Detected W3C dialect.'
|
152
|
+
@dialect = :w3c
|
153
|
+
::Selenium::WebDriver::Remote::W3C::Capabilities.json_create(value)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
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
|
+
|
74
172
|
def merged_capabilities(desired_capabilities)
|
75
|
-
|
76
|
-
|
173
|
+
force_mjsonwp = desired_capabilities[:forceMjsonwp]
|
174
|
+
desired_capabilities = delete_force_mjsonwp(desired_capabilities) unless force_mjsonwp.nil?
|
77
175
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
firstMatch: [w3c_capabilities]
|
176
|
+
if force_mjsonwp
|
177
|
+
{
|
178
|
+
desiredCapabilities: desired_capabilities
|
82
179
|
}
|
83
|
-
|
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
|
84
192
|
end
|
85
193
|
end # class Bridge
|
86
194
|
end # class Base
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Appium
|
2
|
+
module Core
|
3
|
+
class Base
|
4
|
+
class Bridge
|
5
|
+
class MJSONWP < ::Selenium::WebDriver::Remote::OSS::Bridge
|
6
|
+
def commands(command)
|
7
|
+
::Appium::Core::Commands::COMMANDS_EXTEND_MJSONWP[command]
|
8
|
+
end
|
9
|
+
end # class MJSONWP
|
10
|
+
end # class Bridge
|
11
|
+
end # class Base
|
12
|
+
end # module Core
|
13
|
+
end # module Appium
|
@@ -0,0 +1,160 @@
|
|
1
|
+
module Appium
|
2
|
+
module Core
|
3
|
+
class Base
|
4
|
+
class Bridge
|
5
|
+
class W3C < ::Selenium::WebDriver::Remote::W3C::Bridge
|
6
|
+
# Used for default duration of each touch actions
|
7
|
+
# Override from 250 milliseconds to 50 milliseconds
|
8
|
+
::Selenium::WebDriver::PointerActions::DEFAULT_MOVE_DURATION = 0.05
|
9
|
+
|
10
|
+
def commands(command)
|
11
|
+
::Appium::Core::Commands::COMMANDS_EXTEND_W3C[command]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Perform touch actions for W3C module.
|
15
|
+
# Generate `touch` pointer action here and users can use this via `driver.action`
|
16
|
+
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
|
17
|
+
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/PointerActions.html
|
18
|
+
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/KeyActions.html
|
19
|
+
#
|
20
|
+
# @private
|
21
|
+
# For Appium
|
22
|
+
# override
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# element = @driver.find_element(:id, "some id")
|
27
|
+
# @driver.action.click(element).perform # The `click` is a part of `PointerActions`
|
28
|
+
#
|
29
|
+
def action(async = false)
|
30
|
+
::Selenium::WebDriver::W3CActionBuilder.new self,
|
31
|
+
::Selenium::WebDriver::Interactions.pointer(:touch, name: 'touch'),
|
32
|
+
::Selenium::WebDriver::Interactions.key('keyboard'),
|
33
|
+
async
|
34
|
+
end
|
35
|
+
alias actions action
|
36
|
+
|
37
|
+
# For Appium
|
38
|
+
# override
|
39
|
+
def page_source
|
40
|
+
# For W3C
|
41
|
+
# execute_script('var source = document.documentElement.outerHTML;' \
|
42
|
+
# 'if (!source) { source = new XMLSerializer().serializeToString(document); }' \
|
43
|
+
# 'return source;')
|
44
|
+
execute :get_page_source
|
45
|
+
end
|
46
|
+
|
47
|
+
# For Appium
|
48
|
+
# override
|
49
|
+
def element_attribute(element, name)
|
50
|
+
# For W3C
|
51
|
+
# execute_atom :getAttribute, element, name
|
52
|
+
execute :get_element_attribute, id: element.ref, name: name
|
53
|
+
end
|
54
|
+
|
55
|
+
# For Appium
|
56
|
+
# override
|
57
|
+
def find_element_by(how, what, parent = nil)
|
58
|
+
how, what = convert_locators(how, what)
|
59
|
+
|
60
|
+
id = if parent
|
61
|
+
execute :find_child_element, { id: parent }, { using: how, value: what }
|
62
|
+
else
|
63
|
+
execute :find_element, {}, { using: how, value: what }
|
64
|
+
end
|
65
|
+
::Selenium::WebDriver::Element.new self, element_id_from(id)
|
66
|
+
end
|
67
|
+
|
68
|
+
# For Appium
|
69
|
+
# override
|
70
|
+
def find_elements_by(how, what, parent = nil)
|
71
|
+
how, what = convert_locators(how, what)
|
72
|
+
|
73
|
+
ids = if parent
|
74
|
+
execute :find_child_elements, { id: parent }, { using: how, value: what }
|
75
|
+
else
|
76
|
+
execute :find_elements, {}, { using: how, value: what }
|
77
|
+
end
|
78
|
+
|
79
|
+
ids.map { |id| ::Selenium::WebDriver::Element.new self, element_id_from(id) }
|
80
|
+
end
|
81
|
+
|
82
|
+
# For Appium
|
83
|
+
# override
|
84
|
+
# called in `extend DriverExtensions::HasNetworkConnection`
|
85
|
+
def network_connection
|
86
|
+
execute :get_network_connection
|
87
|
+
end
|
88
|
+
|
89
|
+
# For Appium
|
90
|
+
# override
|
91
|
+
# called in `extend DriverExtensions::HasNetworkConnection`
|
92
|
+
def network_connection=(type)
|
93
|
+
execute :set_network_connection, {}, { parameters: { type: type } }
|
94
|
+
end
|
95
|
+
|
96
|
+
# For Appium
|
97
|
+
# No implementation for W3C webdriver module
|
98
|
+
# called in `extend DriverExtensions::HasLocation`
|
99
|
+
def location
|
100
|
+
obj = execute(:get_location) || {}
|
101
|
+
::Selenium::WebDriver::Location.new obj['latitude'], obj['longitude'], obj['altitude']
|
102
|
+
end
|
103
|
+
|
104
|
+
# For Appium
|
105
|
+
# No implementation for W3C webdriver module
|
106
|
+
# called in `extend DriverExtensions::HasLocation`
|
107
|
+
def set_location(lat, lon, alt)
|
108
|
+
loc = { latitude: lat, longitude: lon, altitude: alt }
|
109
|
+
execute :set_location, {}, { location: loc }
|
110
|
+
end
|
111
|
+
|
112
|
+
#
|
113
|
+
# logs
|
114
|
+
#
|
115
|
+
# For Appium
|
116
|
+
# No implementation for W3C webdriver module
|
117
|
+
def available_log_types
|
118
|
+
types = execute :get_available_log_types
|
119
|
+
Array(types).map(&:to_sym)
|
120
|
+
end
|
121
|
+
|
122
|
+
# For Appium
|
123
|
+
# No implementation for W3C webdriver module
|
124
|
+
def log(type)
|
125
|
+
data = execute :get_log, {}, { type: type.to_s }
|
126
|
+
|
127
|
+
Array(data).map do |l|
|
128
|
+
begin
|
129
|
+
::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
|
130
|
+
rescue KeyError
|
131
|
+
next
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
# Don't convert locators for Appium Client
|
139
|
+
# TODO: Only for Appium. Ideally, we'd like to keep the selenium-webdriver
|
140
|
+
def convert_locators(how, what)
|
141
|
+
# case how
|
142
|
+
# when 'class name'
|
143
|
+
# how = 'css selector'
|
144
|
+
# what = ".#{escape_css(what)}"
|
145
|
+
# when 'id'
|
146
|
+
# how = 'css selector'
|
147
|
+
# what = "##{escape_css(what)}"
|
148
|
+
# when 'name'
|
149
|
+
# how = 'css selector'
|
150
|
+
# what = "*[name='#{escape_css(what)}']"
|
151
|
+
# when 'tag name'
|
152
|
+
# how = 'css selector'
|
153
|
+
# end
|
154
|
+
[how, what]
|
155
|
+
end
|
156
|
+
end # class W3C
|
157
|
+
end # class Bridge
|
158
|
+
end # class Base
|
159
|
+
end # module Core
|
160
|
+
end # module Appium
|
@@ -56,6 +56,18 @@ module Appium
|
|
56
56
|
def back
|
57
57
|
navigate.back
|
58
58
|
end
|
59
|
+
|
60
|
+
# Get the device window's logs.
|
61
|
+
# @return [String]
|
62
|
+
#
|
63
|
+
# @example
|
64
|
+
#
|
65
|
+
# @driver.logs.available_types # [:syslog, :crashlog, :performance]
|
66
|
+
# @driver.logs.get :syslog # []
|
67
|
+
#
|
68
|
+
def logs
|
69
|
+
@logs ||= Logs.new(@bridge)
|
70
|
+
end
|
59
71
|
end # class Driver
|
60
72
|
end # class Base
|
61
73
|
end # module Core
|
@@ -23,7 +23,7 @@ module Appium
|
|
23
23
|
get_system_bars: [:get, 'session/:session_id/appium/device/system_bars'.freeze],
|
24
24
|
get_display_density: [:get, 'session/:session_id/appium/device/display_density'.freeze],
|
25
25
|
is_keyboard_shown: [:get, 'session/:session_id/appium/device/is_keyboard_shown'.freeze],
|
26
|
-
get_network_connection: [:get, 'session/:session_id/network_connection'.freeze],
|
26
|
+
get_network_connection: [:get, 'session/:session_id/network_connection'.freeze], # defined also in OSS
|
27
27
|
get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'.freeze],
|
28
28
|
stop_recording_screen: [:post, 'session/:session_id/appium/stop_recording_screen'.freeze]
|
29
29
|
# iOS
|
@@ -59,7 +59,7 @@ module Appium
|
|
59
59
|
COMMAND_ANDROID = {
|
60
60
|
start_activity: [:post, 'session/:session_id/appium/device/start_activity'.freeze],
|
61
61
|
end_coverage: [:post, 'session/:session_id/appium/app/end_test_coverage'.freeze],
|
62
|
-
set_network_connection: [:post, 'session/:session_id/network_connection'.freeze],
|
62
|
+
set_network_connection: [:post, 'session/:session_id/network_connection'.freeze], # defined also in OSS
|
63
63
|
get_performance_data: [:post, 'session/:session_id/appium/getPerformanceData'.freeze],
|
64
64
|
start_recording_screen: [:post, 'session/:session_id/appium/start_recording_screen'.freeze]
|
65
65
|
}.freeze
|
@@ -89,23 +89,24 @@ module Appium
|
|
89
89
|
# The fix will be included in selenium-3.8.2
|
90
90
|
get_page_source: [:get, 'session/:session_id/source'.freeze],
|
91
91
|
|
92
|
-
## Add to W3C commands
|
93
|
-
|
92
|
+
## Add OSS commands to W3C commands
|
93
|
+
### rotatable
|
94
94
|
get_screen_orientation: [:get, 'session/:session_id/orientation'.freeze],
|
95
95
|
set_screen_orientation: [:post, 'session/:session_id/orientation'.freeze],
|
96
96
|
|
97
97
|
get_location: [:get, 'session/:session_id/location'.freeze],
|
98
98
|
set_location: [:post, 'session/:session_id/location'.freeze],
|
99
99
|
|
100
|
-
|
101
|
-
set_network_connection: [:post, 'session/:session_id/network_connection'.freeze],
|
102
|
-
|
103
|
-
# For IME
|
100
|
+
### For IME
|
104
101
|
ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'.freeze],
|
105
102
|
ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'.freeze],
|
106
103
|
ime_is_activated: [:get, 'session/:session_id/ime/activated'.freeze],
|
107
104
|
ime_deactivate: [:post, 'session/:session_id/ime/deactivate'.freeze],
|
108
|
-
ime_activate_engine: [:post, 'session/:session_id/ime/activate'.freeze]
|
105
|
+
ime_activate_engine: [:post, 'session/:session_id/ime/activate'.freeze],
|
106
|
+
|
107
|
+
### Logs
|
108
|
+
get_available_log_types: [:get, 'session/:session_id/log/types'.freeze],
|
109
|
+
get_log: [:post, 'session/:session_id/log'.freeze]
|
109
110
|
}
|
110
111
|
).freeze
|
111
112
|
end
|
@@ -112,6 +112,12 @@ module Appium
|
|
112
112
|
# @!method get_network_connection
|
113
113
|
# Get the device network connection current status
|
114
114
|
# See set_network_connection method for return value
|
115
|
+
#
|
116
|
+
# @example
|
117
|
+
#
|
118
|
+
# @driver.network_connection_type #=> 6
|
119
|
+
# @driver.get_network_connection #=> 6
|
120
|
+
#
|
115
121
|
|
116
122
|
# @!method open_notifications
|
117
123
|
# Open Android notifications
|
@@ -561,10 +567,10 @@ module Appium
|
|
561
567
|
|
562
568
|
# @private
|
563
569
|
def create_bridge_command(method)
|
564
|
-
::Appium::Core::Base::
|
570
|
+
::Appium::Core::Base::Bridge::MJSONWP.class_eval do
|
565
571
|
block_given? ? class_eval(&Proc.new) : define_method(method) { execute method }
|
566
572
|
end
|
567
|
-
::Appium::Core::Base::
|
573
|
+
::Appium::Core::Base::Bridge::W3C.class_eval do
|
568
574
|
block_given? ? class_eval(&Proc.new) : define_method(method) { execute method }
|
569
575
|
end
|
570
576
|
end
|
@@ -9,21 +9,23 @@ module Appium
|
|
9
9
|
# @return [[Selenium::WebDriver::LogEntry]] A list of logs data.
|
10
10
|
#
|
11
11
|
# @example
|
12
|
-
#
|
13
|
-
#
|
12
|
+
#
|
13
|
+
# @driver.logs.get "syslog" # []
|
14
|
+
# @driver.logs.get :syslog # []
|
14
15
|
#
|
15
16
|
def get(type)
|
16
|
-
@bridge.
|
17
|
+
@bridge.log type
|
17
18
|
end
|
18
19
|
|
19
20
|
# Get a list of available log types
|
20
21
|
#
|
21
22
|
# @return [[Hash]] A list of available log types.
|
22
23
|
# @example
|
23
|
-
#
|
24
|
+
#
|
25
|
+
# @driver.logs.available_types # [:syslog, :crashlog, :performance]
|
24
26
|
#
|
25
27
|
def available_types
|
26
|
-
@bridge.
|
28
|
+
@bridge.available_log_types
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end # module Core
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Appium
|
2
2
|
module Core
|
3
|
-
VERSION = '1.2.
|
4
|
-
DATE = '
|
3
|
+
VERSION = '1.2.4'.freeze unless defined? ::Appium::Core::VERSION
|
4
|
+
DATE = '2018-01-03'.freeze unless defined? ::Appium::Core::DATE
|
5
5
|
end
|
6
6
|
end
|
data/release_notes.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
#### v1.2.4 2018-01-03
|
2
|
+
|
3
|
+
- [7032bc0](https://github.com/appium/ruby_lib_core/commit/7032bc02acc44640542eb545067a4125a7f1811f) Release 1.2.4
|
4
|
+
- [2396b08](https://github.com/appium/ruby_lib_core/commit/2396b08f99a9630827f6805dde2716b0bd0b14f7) Add some missing commands for w3c (#42)
|
5
|
+
- [db6aa69](https://github.com/appium/ruby_lib_core/commit/db6aa6954566f601bb038aa7a7aa6884612e19fe) Switchable w3c format caps from capabilities (#41)
|
6
|
+
- [dac4ff1](https://github.com/appium/ruby_lib_core/commit/dac4ff16271361ceaecf1f613f85cff0bb6c4be2) Add capability for create session following w3c (#40)
|
7
|
+
- [f2c25ce](https://github.com/appium/ruby_lib_core/commit/f2c25ce9e551790beb4cf6abb170a02a70955eb4) update travis (#39)
|
8
|
+
- [2ea7908](https://github.com/appium/ruby_lib_core/commit/2ea7908a5e77f4f7275a3e51c1abae7966cf2d94) remove bug fixes part in unreleased
|
9
|
+
|
10
|
+
|
1
11
|
#### v1.2.3 2017-12-27
|
2
12
|
|
3
13
|
- [26b8392](https://github.com/appium/ruby_lib_core/commit/26b83923a50257922030c7ccb83e110aff55eee5) Release 1.2.3
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuaki MATSUO
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '12.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '12.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: yard
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,13 +204,13 @@ files:
|
|
204
204
|
- lib/appium_lib_core/common.rb
|
205
205
|
- lib/appium_lib_core/common/base.rb
|
206
206
|
- lib/appium_lib_core/common/base/bridge.rb
|
207
|
+
- lib/appium_lib_core/common/base/bridge/msjsonwp.rb
|
208
|
+
- lib/appium_lib_core/common/base/bridge/w3c.rb
|
207
209
|
- lib/appium_lib_core/common/base/capabilities.rb
|
208
210
|
- lib/appium_lib_core/common/base/command.rb
|
209
211
|
- lib/appium_lib_core/common/base/driver.rb
|
210
212
|
- lib/appium_lib_core/common/base/http_default.rb
|
211
|
-
- lib/appium_lib_core/common/base/msjsonwp_bridge.rb
|
212
213
|
- lib/appium_lib_core/common/base/search_context.rb
|
213
|
-
- lib/appium_lib_core/common/base/w3c_bridge.rb
|
214
214
|
- lib/appium_lib_core/common/base/wait.rb
|
215
215
|
- lib/appium_lib_core/common/command.rb
|
216
216
|
- lib/appium_lib_core/common/device.rb
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
class Base
|
4
|
-
class CoreBridgeMJSONWP < ::Selenium::WebDriver::Remote::OSS::Bridge
|
5
|
-
def commands(command)
|
6
|
-
::Appium::Core::Commands::COMMANDS_EXTEND_MJSONWP[command]
|
7
|
-
end
|
8
|
-
end # class CoreBridgeMJSONWP
|
9
|
-
end # class Base
|
10
|
-
end # module Core
|
11
|
-
end # module Appium
|
@@ -1,129 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
class Base
|
4
|
-
class CoreBridgeW3C < ::Selenium::WebDriver::Remote::W3C::Bridge
|
5
|
-
# Used for default duration of each touch actions
|
6
|
-
# Override from 250 milliseconds to 50 milliseconds
|
7
|
-
::Selenium::WebDriver::PointerActions::DEFAULT_MOVE_DURATION = 0.05
|
8
|
-
|
9
|
-
def commands(command)
|
10
|
-
::Appium::Core::Commands::COMMANDS_EXTEND_W3C[command]
|
11
|
-
end
|
12
|
-
|
13
|
-
# Perform touch actions for W3C module. Generate `touch` pointer action here and users can use this via `driver.action`
|
14
|
-
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
|
15
|
-
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/PointerActions.html
|
16
|
-
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/KeyActions.html
|
17
|
-
#
|
18
|
-
# @private
|
19
|
-
# For Appium
|
20
|
-
# override
|
21
|
-
#
|
22
|
-
# @example
|
23
|
-
#
|
24
|
-
# element = @driver.find_element(:id, "some id")
|
25
|
-
# @driver.action.click(element).perform # The `click` is a part of `PointerActions`
|
26
|
-
#
|
27
|
-
def action(async = false)
|
28
|
-
::Selenium::WebDriver::W3CActionBuilder.new self,
|
29
|
-
::Selenium::WebDriver::Interactions.pointer(:touch, name: 'touch'),
|
30
|
-
::Selenium::WebDriver::Interactions.key('keyboard'),
|
31
|
-
async
|
32
|
-
end
|
33
|
-
alias actions action
|
34
|
-
|
35
|
-
# For Appium
|
36
|
-
# override
|
37
|
-
def page_source
|
38
|
-
# For W3C
|
39
|
-
# execute_script('var source = document.documentElement.outerHTML;' \
|
40
|
-
# 'if (!source) { source = new XMLSerializer().serializeToString(document); }' \
|
41
|
-
# 'return source;')
|
42
|
-
execute :get_page_source
|
43
|
-
end
|
44
|
-
|
45
|
-
# For Appium
|
46
|
-
# override
|
47
|
-
def element_attribute(element, name)
|
48
|
-
# For W3C
|
49
|
-
# execute_atom :getAttribute, element, name
|
50
|
-
execute :get_element_attribute, id: element.ref, name: name
|
51
|
-
end
|
52
|
-
|
53
|
-
# For Appium
|
54
|
-
# override
|
55
|
-
def find_element_by(how, what, parent = nil)
|
56
|
-
how, what = convert_locators(how, what)
|
57
|
-
|
58
|
-
id = if parent
|
59
|
-
execute :find_child_element, { id: parent }, { using: how, value: what }
|
60
|
-
else
|
61
|
-
execute :find_element, {}, { using: how, value: what }
|
62
|
-
end
|
63
|
-
::Selenium::WebDriver::Element.new self, element_id_from(id)
|
64
|
-
end
|
65
|
-
|
66
|
-
# For Appium
|
67
|
-
# override
|
68
|
-
def find_elements_by(how, what, parent = nil)
|
69
|
-
how, what = convert_locators(how, what)
|
70
|
-
|
71
|
-
ids = if parent
|
72
|
-
execute :find_child_elements, { id: parent }, { using: how, value: what }
|
73
|
-
else
|
74
|
-
execute :find_elements, {}, { using: how, value: what }
|
75
|
-
end
|
76
|
-
|
77
|
-
ids.map { |id| ::Selenium::WebDriver::Element.new self, element_id_from(id) }
|
78
|
-
end
|
79
|
-
|
80
|
-
# For Appium
|
81
|
-
# override
|
82
|
-
def location
|
83
|
-
obj = execute(:get_location) || {}
|
84
|
-
Location.new obj['latitude'], obj['longitude'], obj['altitude']
|
85
|
-
end
|
86
|
-
|
87
|
-
# For Appium
|
88
|
-
# override
|
89
|
-
def set_location(lat, lon, alt)
|
90
|
-
loc = { latitude: lat, longitude: lon, altitude: alt }
|
91
|
-
execute :set_location, {}, { location: loc }
|
92
|
-
end
|
93
|
-
|
94
|
-
# For Appium
|
95
|
-
# override
|
96
|
-
def network_connection
|
97
|
-
execute :get_network_connection
|
98
|
-
end
|
99
|
-
|
100
|
-
# For Appium
|
101
|
-
# override
|
102
|
-
def network_connection=(type)
|
103
|
-
execute :set_network_connection, {}, { parameters: { type: type } }
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
# Don't convert locators for Appium Client
|
109
|
-
# TODO: Only for Appium. Ideally, we'd like to keep the selenium-webdriver
|
110
|
-
def convert_locators(how, what)
|
111
|
-
# case how
|
112
|
-
# when 'class name'
|
113
|
-
# how = 'css selector'
|
114
|
-
# what = ".#{escape_css(what)}"
|
115
|
-
# when 'id'
|
116
|
-
# how = 'css selector'
|
117
|
-
# what = "##{escape_css(what)}"
|
118
|
-
# when 'name'
|
119
|
-
# how = 'css selector'
|
120
|
-
# what = "*[name='#{escape_css(what)}']"
|
121
|
-
# when 'tag name'
|
122
|
-
# how = 'css selector'
|
123
|
-
# end
|
124
|
-
[how, what]
|
125
|
-
end
|
126
|
-
end # class CoreBridgeW3C
|
127
|
-
end # class Base
|
128
|
-
end # module Core
|
129
|
-
end # module Appium
|