appium_lib_core 1.8.4 → 1.9.0
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/CHANGELOG.md +12 -0
- data/appium_lib_core.gemspec +1 -1
- data/lib/appium_lib_core/android.rb +0 -1
- data/lib/appium_lib_core/android/device.rb +5 -0
- data/lib/appium_lib_core/android/espresso/bridge.rb +0 -1
- data/lib/appium_lib_core/android/uiautomator1/bridge.rb +0 -1
- data/lib/appium_lib_core/android/uiautomator2/bridge.rb +0 -1
- data/lib/appium_lib_core/android_espresso.rb +0 -1
- data/lib/appium_lib_core/android_uiautomator2.rb +0 -1
- data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +0 -64
- data/lib/appium_lib_core/common/base/bridge/w3c.rb +13 -81
- data/lib/appium_lib_core/common/base/driver.rb +35 -49
- data/lib/appium_lib_core/common/base/search_context.rb +67 -11
- data/lib/appium_lib_core/common/command/w3c.rb +2 -4
- data/lib/appium_lib_core/device.rb +0 -4
- data/lib/appium_lib_core/ios.rb +0 -1
- data/lib/appium_lib_core/ios/uiautomation/bridge.rb +0 -1
- data/lib/appium_lib_core/ios/xcuitest/bridge.rb +0 -2
- data/lib/appium_lib_core/ios_xcuitest.rb +0 -2
- data/lib/appium_lib_core/version.rb +2 -2
- data/release_notes.md +10 -0
- metadata +2 -12
- data/lib/appium_lib_core/android/search_context.rb +0 -18
- data/lib/appium_lib_core/element/image.rb +0 -106
- data/lib/appium_lib_core/ios/search_context.rb +0 -27
- data/lib/appium_lib_core/ios/xcuitest/search_context.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e54e7cdd9d8e4b055e6163dc93a84773e7485fa1
|
4
|
+
data.tar.gz: dd1e4c1c37c7f16dabf8a9efd1bdf98b0382f20a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aec282e234f4055fac207057889bb7cfbcd2d3eb3852c50a5b7cb17ed0b8ed78764d28639620d6ff4683446bfe3597597394397e141b6ba5747806e5411bd9af
|
7
|
+
data.tar.gz: 63b10b77c865e4399e617c794f725edd23d559b8f03dfb9377057fef66543efcd83a21073a3951d61410d5f4178747f35f3cec816a58c1df48ffc0e366c2ff72
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,18 @@ All notable changes to this project will be documented in this file.
|
|
8
8
|
|
9
9
|
### Deprecations
|
10
10
|
|
11
|
+
## [1.9.0] - 2018-08-05
|
12
|
+
### Enhancements
|
13
|
+
- Update documentation about `start_recording_screen`
|
14
|
+
- Port `send_keys/type` for active element [#122](https://github.com/appium/ruby_lib_core/pull/122)
|
15
|
+
- Support `find_element/s :image, partial_image` [#119](https://github.com/appium/ruby_lib_core/pull/119)
|
16
|
+
- Requires `selenium-webdriver 3.14+` because of W3C actions [#115](https://github.com/appium/ruby_lib_core/pull/115)
|
17
|
+
|
18
|
+
### Bug fixes
|
19
|
+
|
20
|
+
### Deprecations
|
21
|
+
- [Internal] Deprecate experimental `ImageElement` in favor of `Element`
|
22
|
+
|
11
23
|
## [1.8.4] - 2018-07-28
|
12
24
|
### Enhancements
|
13
25
|
- silence warning for pointeractions [#113](https://github.com/appium/ruby_lib_core/pull/113)
|
data/appium_lib_core.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.add_runtime_dependency 'selenium-webdriver', '~> 3.
|
25
|
+
spec.add_runtime_dependency 'selenium-webdriver', '~> 3.14'
|
26
26
|
spec.add_runtime_dependency 'faye-websocket', '~> 0.10.0'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
@@ -202,6 +202,11 @@ module Appium
|
|
202
202
|
# use a size supported by your device's Advanced Video Coding (AVC) encoder.
|
203
203
|
# For example, "1280x720"
|
204
204
|
# @param [String] time_limit: Recording time. 180 seconds is by default.
|
205
|
+
# Since Appium 1.8.2 the time limit can be up to 1800 seconds (30 minutes).
|
206
|
+
# Appium will automatically try to merge the 3-minutes chunks recorded
|
207
|
+
# by the screenrecord utility, however, this requires FFMPEG utility
|
208
|
+
# to be installed and available in PATH on the server machine. If the utility is not
|
209
|
+
# present then the most recent screen recording chunk is going to be returned as the result.
|
205
210
|
# @param [String] bit_rate: The video bit rate for the video, in megabits per second.
|
206
211
|
# 4 Mbp/s(4000000) is by default for Android API level below 27. 20 Mb/s(20000000) for API level 27 and above.
|
207
212
|
# @param [Boolean] bug_report: Set it to `true` in order to display additional information on the video overlay,
|
@@ -22,70 +22,6 @@ module Appium
|
|
22
22
|
::Appium::Core::Commands::MJSONWP::COMMANDS[command]
|
23
23
|
end
|
24
24
|
|
25
|
-
#
|
26
|
-
# @return [::Appium::Core::ImageElement|nil]
|
27
|
-
# @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
|
28
|
-
#
|
29
|
-
def find_element_by_image(full_image:, partial_image:, match_threshold: nil, visualize: false)
|
30
|
-
options = {}
|
31
|
-
options[:threshold] = match_threshold unless match_threshold.nil?
|
32
|
-
options[:visualize] = visualize
|
33
|
-
|
34
|
-
params = {}
|
35
|
-
params[:mode] = :matchTemplate
|
36
|
-
params[:firstImage] = full_image
|
37
|
-
params[:secondImage] = partial_image
|
38
|
-
params[:options] = options if options
|
39
|
-
|
40
|
-
result = execute(:compare_images, {}, params)
|
41
|
-
rect = result['rect']
|
42
|
-
|
43
|
-
if rect
|
44
|
-
return ::Appium::Core::ImageElement.new(self,
|
45
|
-
rect['x'],
|
46
|
-
rect['y'],
|
47
|
-
rect['width'],
|
48
|
-
rect['height'],
|
49
|
-
result['visualization'])
|
50
|
-
end
|
51
|
-
nil
|
52
|
-
end
|
53
|
-
|
54
|
-
#
|
55
|
-
# @return [[]|[::Appium::Core::ImageElement]]
|
56
|
-
# @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
|
57
|
-
#
|
58
|
-
def find_elements_by_image(full_image:, partial_images:, match_threshold: nil, visualize: false)
|
59
|
-
options = {}
|
60
|
-
options[:threshold] = match_threshold unless match_threshold.nil?
|
61
|
-
options[:visualize] = visualize
|
62
|
-
|
63
|
-
params = {}
|
64
|
-
params[:mode] = :matchTemplate
|
65
|
-
params[:firstImage] = full_image
|
66
|
-
params[:options] = options if options
|
67
|
-
|
68
|
-
partial_images.each_with_object([]) do |partial_image, acc|
|
69
|
-
params[:secondImage] = partial_image
|
70
|
-
|
71
|
-
begin
|
72
|
-
result = execute(:compare_images, {}, params)
|
73
|
-
rect = result['rect']
|
74
|
-
|
75
|
-
if result['rect']
|
76
|
-
acc.push ::Appium::Core::ImageElement.new(self,
|
77
|
-
rect['x'],
|
78
|
-
rect['y'],
|
79
|
-
rect['width'],
|
80
|
-
rect['height'],
|
81
|
-
result['visualization'])
|
82
|
-
end
|
83
|
-
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
84
|
-
acc if e.message.include?('Cannot find any occurrences')
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
25
|
def take_element_screenshot(element)
|
90
26
|
execute :take_element_screenshot, id: element.ref
|
91
27
|
end
|
@@ -1,18 +1,8 @@
|
|
1
|
-
require 'base64'
|
2
|
-
|
3
1
|
module Appium
|
4
2
|
module Core
|
5
3
|
class Base
|
6
4
|
class Bridge
|
7
5
|
class W3C < ::Selenium::WebDriver::Remote::W3C::Bridge
|
8
|
-
def self.silence_warnings_redefining(&block)
|
9
|
-
warn_level = $VERBOSE
|
10
|
-
$VERBOSE = nil
|
11
|
-
result = block.call
|
12
|
-
$VERBOSE = warn_level
|
13
|
-
result
|
14
|
-
end
|
15
|
-
|
16
6
|
include Device::DeviceLock
|
17
7
|
include Device::Keyboard
|
18
8
|
include Device::ImeActions
|
@@ -28,10 +18,6 @@ module Appium
|
|
28
18
|
include Device::Device
|
29
19
|
include Device::TouchActions
|
30
20
|
|
31
|
-
# Used for default duration of each touch actions
|
32
|
-
# Override from 250 milliseconds to 50 milliseconds
|
33
|
-
W3C.silence_warnings_redefining { ::Selenium::WebDriver::PointerActions::DEFAULT_MOVE_DURATION = 0.05 }
|
34
|
-
|
35
21
|
def commands(command)
|
36
22
|
::Appium::Core::Commands::W3C::COMMANDS[command]
|
37
23
|
end
|
@@ -50,9 +36,13 @@ module Appium
|
|
50
36
|
# element = @driver.find_element(:id, "some id")
|
51
37
|
# @driver.action.click(element).perform # The `click` is a part of `PointerActions`
|
52
38
|
#
|
53
|
-
|
54
|
-
|
55
|
-
|
39
|
+
def action(async = false)
|
40
|
+
# Used for default duration of each touch actions
|
41
|
+
# Override from 250 milliseconds to 50 milliseconds
|
42
|
+
action_builder = super
|
43
|
+
action_builder.default_move_duration = 0.05
|
44
|
+
action_builder
|
45
|
+
end
|
56
46
|
|
57
47
|
# Port from MJSONWP
|
58
48
|
def get_timeouts
|
@@ -64,6 +54,12 @@ module Appium
|
|
64
54
|
::Selenium::WebDriver::Remote::W3C::Capabilities.json_create execute(:get_capabilities)
|
65
55
|
end
|
66
56
|
|
57
|
+
# Port from MJSONWP
|
58
|
+
def send_keys_to_active_element(key)
|
59
|
+
text = ::Selenium::WebDriver::Keys.encode(key).join('')
|
60
|
+
execute :send_keys_to_active_element, {}, { value: text.split(//) }
|
61
|
+
end
|
62
|
+
|
67
63
|
# For Appium
|
68
64
|
# override
|
69
65
|
def page_source
|
@@ -109,70 +105,6 @@ module Appium
|
|
109
105
|
ids.map { |id| ::Selenium::WebDriver::Element.new self, element_id_from(id) }
|
110
106
|
end
|
111
107
|
|
112
|
-
#
|
113
|
-
# @return [::Appium::Core::ImageElement|nil]
|
114
|
-
# @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
|
115
|
-
#
|
116
|
-
def find_element_by_image(full_image:, partial_image:, match_threshold: nil, visualize: false)
|
117
|
-
options = {}
|
118
|
-
options[:threshold] = match_threshold unless match_threshold.nil?
|
119
|
-
options[:visualize] = visualize
|
120
|
-
|
121
|
-
params = {}
|
122
|
-
params[:mode] = :matchTemplate
|
123
|
-
params[:firstImage] = full_image
|
124
|
-
params[:secondImage] = partial_image
|
125
|
-
params[:options] = options if options
|
126
|
-
|
127
|
-
result = execute(:compare_images, {}, params)
|
128
|
-
rect = result['rect']
|
129
|
-
|
130
|
-
if rect
|
131
|
-
return ::Appium::Core::ImageElement.new(self,
|
132
|
-
rect['x'],
|
133
|
-
rect['y'],
|
134
|
-
rect['width'],
|
135
|
-
rect['height'],
|
136
|
-
result['visualization'])
|
137
|
-
end
|
138
|
-
nil
|
139
|
-
end
|
140
|
-
|
141
|
-
#
|
142
|
-
# @return [[]|[::Appium::Core::ImageElement]]
|
143
|
-
# @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
|
144
|
-
#
|
145
|
-
def find_elements_by_image(full_image:, partial_images:, match_threshold: nil, visualize: false)
|
146
|
-
options = {}
|
147
|
-
options[:threshold] = match_threshold unless match_threshold.nil?
|
148
|
-
options[:visualize] = visualize
|
149
|
-
|
150
|
-
params = {}
|
151
|
-
params[:mode] = :matchTemplate
|
152
|
-
params[:firstImage] = full_image
|
153
|
-
params[:options] = options if options
|
154
|
-
|
155
|
-
partial_images.each_with_object([]) do |partial_image, acc|
|
156
|
-
params[:secondImage] = partial_image
|
157
|
-
|
158
|
-
begin
|
159
|
-
result = execute(:compare_images, {}, params)
|
160
|
-
rect = result['rect']
|
161
|
-
|
162
|
-
if result['rect']
|
163
|
-
acc.push ::Appium::Core::ImageElement.new(self,
|
164
|
-
rect['x'],
|
165
|
-
rect['y'],
|
166
|
-
rect['width'],
|
167
|
-
rect['height'],
|
168
|
-
result['visualization'])
|
169
|
-
end
|
170
|
-
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
171
|
-
acc if e.message.include?('Cannot find any occurrences')
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
108
|
# For Appium
|
177
109
|
# override
|
178
110
|
# called in `extend DriverExtensions::HasNetworkConnection`
|
@@ -99,6 +99,18 @@ module Appium
|
|
99
99
|
@bridge.is_keyboard_shown
|
100
100
|
end
|
101
101
|
|
102
|
+
# Send keys for a current active element
|
103
|
+
# @param [String] key Input text
|
104
|
+
#
|
105
|
+
# @example
|
106
|
+
#
|
107
|
+
# @driver.send_keys 'happy testing!'
|
108
|
+
#
|
109
|
+
def send_keys(*key)
|
110
|
+
@bridge.send_keys_to_active_element(key)
|
111
|
+
end
|
112
|
+
alias type send_keys
|
113
|
+
|
102
114
|
# Get appium Settings for current test session
|
103
115
|
#
|
104
116
|
# @example
|
@@ -786,73 +798,47 @@ module Appium
|
|
786
798
|
@bridge.compare_images(mode: mode, first_image: first_image, second_image: second_image, options: options)
|
787
799
|
end
|
788
800
|
|
789
|
-
#
|
801
|
+
# @since Appium 1.8.2
|
802
|
+
# Return an element if current view has a partial image. The logic depends on template matching by OpenCV.
|
803
|
+
# @see https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md
|
804
|
+
# You can handle settings for the comparision following below.
|
805
|
+
# @see https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6
|
790
806
|
#
|
791
807
|
# @param [String] png_img_path A path to a partial image you'd like to find
|
792
|
-
# @param [Flood] match_threshold At what normalized threshold to reject
|
793
|
-
# @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
|
794
|
-
# the corresponding picture matching operation. This option is disabled by default.
|
795
808
|
#
|
796
|
-
# @return [::
|
797
|
-
# @raise [::Appium::Core::Error::NoSuchElementError|::Appium::Core::Error::CoreError] No such element
|
809
|
+
# @return [::Selenium::WebDriver::Element]
|
798
810
|
#
|
799
811
|
# @example
|
800
812
|
#
|
813
|
+
# @@driver.update_settings({ fixImageFindScreenshotDims: false, fixImageTemplateSize: true,
|
814
|
+
# autoUpdateImageElementPosition: true })
|
801
815
|
# e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
|
802
816
|
#
|
803
|
-
def find_element_by_image(png_img_path
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
element = begin
|
808
|
-
@bridge.find_element_by_image(full_image: full_image,
|
809
|
-
partial_image: partial_image,
|
810
|
-
match_threshold: match_threshold,
|
811
|
-
visualize: visualize)
|
812
|
-
rescue Selenium::WebDriver::Error::TimeOutError
|
813
|
-
raise ::Appium::Core::Error::NoSuchElementError
|
814
|
-
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
815
|
-
raise ::Appium::Core::Error::NoSuchElementError if e.message.include?('Cannot find any occurrences')
|
816
|
-
raise ::Appium::Core::Error::CoreError, e.message
|
817
|
-
end
|
818
|
-
raise ::Appium::Core::Error::NoSuchElementError if element.nil?
|
819
|
-
|
820
|
-
element
|
817
|
+
def find_element_by_image(png_img_path)
|
818
|
+
template = Base64.encode64 File.read png_img_path
|
819
|
+
find_element :image, template
|
821
820
|
end
|
822
821
|
|
823
|
-
#
|
822
|
+
# @since Appium 1.8.2
|
823
|
+
# Return elements if current view has a partial image. The logic depends on template matching by OpenCV.
|
824
|
+
# @see https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md
|
825
|
+
# You can handle settings for the comparision following below.
|
826
|
+
# @see https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6
|
824
827
|
#
|
825
|
-
# @param [
|
826
|
-
# @param [Flood] match_threshold At what normalized threshold to reject
|
827
|
-
# @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
|
828
|
-
# the corresponding picture matching operation. This option is disabled by default.
|
828
|
+
# @param [String] png_img_path A path to a partial image you'd like to find
|
829
829
|
#
|
830
|
-
# @return [
|
831
|
-
# @return [::Appium::Core::Error::CoreError]
|
830
|
+
# @return [::Selenium::WebDriver::Element]
|
832
831
|
#
|
833
832
|
# @example
|
834
833
|
#
|
834
|
+
# @@driver.update_settings({ fixImageFindScreenshotDims: false, fixImageTemplateSize: true,
|
835
|
+
# autoUpdateImageElementPosition: true })
|
835
836
|
# e = @@driver.find_elements_by_image ['./test/functional/data/test_element_image.png']
|
836
837
|
# e == [] # if the `e` is empty
|
837
838
|
#
|
838
|
-
def find_elements_by_image(
|
839
|
-
|
840
|
-
|
841
|
-
partial_images = png_img_paths.map do |png_img_path|
|
842
|
-
Base64.encode64 File.read(png_img_path)
|
843
|
-
end
|
844
|
-
|
845
|
-
begin
|
846
|
-
@bridge.find_elements_by_image(full_image: full_image,
|
847
|
-
partial_images: partial_images,
|
848
|
-
match_threshold: match_threshold,
|
849
|
-
visualize: visualize)
|
850
|
-
rescue Selenium::WebDriver::Error::TimeOutError
|
851
|
-
[]
|
852
|
-
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
853
|
-
return [] if e.message.include?('Cannot find any occurrences')
|
854
|
-
raise ::Appium::Core::Error::CoreError, e.message
|
855
|
-
end
|
839
|
+
def find_elements_by_image(png_img_path)
|
840
|
+
template = Base64.encode64 File.read png_img_path
|
841
|
+
find_elements :image, template
|
856
842
|
end
|
857
843
|
end # class Driver
|
858
844
|
end # class Base
|
@@ -4,28 +4,85 @@ module Appium
|
|
4
4
|
module SearchContext
|
5
5
|
# referenced: ::Selenium::WebDriver::SearchContext
|
6
6
|
|
7
|
-
FINDERS = ::Selenium::WebDriver::SearchContext::FINDERS.merge(
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
FINDERS = ::Selenium::WebDriver::SearchContext::FINDERS.merge(
|
8
|
+
accessibility_id: 'accessibility id',
|
9
|
+
image: '-image',
|
10
|
+
# Android
|
11
|
+
uiautomator: '-android uiautomator',
|
12
|
+
# iOS
|
13
|
+
uiautomation: '-ios uiautomation',
|
14
|
+
predicate: '-ios predicate string',
|
15
|
+
class_chain: '-ios class chain',
|
16
|
+
# Windows
|
17
|
+
windows_uiautomation: '-windows uiautomation',
|
18
|
+
# Tizen
|
19
|
+
tizen_uiautomation: '-tizen uiautomation'
|
20
|
+
)
|
12
21
|
|
13
22
|
#
|
14
23
|
# Find the first element matching the given arguments
|
15
24
|
#
|
25
|
+
# Android can find with uiautomator like a [UISelector](http://developer.android.com/tools/help/uiautomator/UiSelector.html).
|
26
|
+
# iOS can find with a [UIAutomation command](https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAWindowClassReference/UIAWindow/UIAWindow.html#//apple_ref/doc/uid/TP40009930).
|
27
|
+
# iOS, only for XCUITest(WebDriverAgent), can find with a [class chain]( https://github.com/facebook/WebDriverAgent/wiki/Queries)
|
28
|
+
#
|
29
|
+
# Find with image.
|
30
|
+
# Return an element if current view has a partial image. The logic depends on template matching by OpenCV.
|
31
|
+
# @see https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md
|
32
|
+
# You can handle settings for the comparision following below.
|
33
|
+
# @see https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6
|
34
|
+
#
|
16
35
|
# @overload find_element(how, what)
|
17
36
|
# @param [Symbol, String] how The method to find the element by
|
18
37
|
# @param [String] what The locator to use
|
38
|
+
#
|
19
39
|
# @overload find_element(opts)
|
20
40
|
# @param [Hash] opts Find options
|
21
41
|
# @option opts [Symbol] :how Key named after the method to find the element by, containing the locator
|
22
42
|
# @return [Element]
|
23
|
-
#
|
24
43
|
# @raise [Error::NoSuchElementError] if the element doesn't exist
|
25
44
|
#
|
26
|
-
# @example Find element with
|
27
|
-
#
|
28
|
-
#
|
45
|
+
# @example Find element with each keys
|
46
|
+
#
|
47
|
+
# # with accessibility id. All platforms.
|
48
|
+
# find_elements :accessibility_id, 'Animation'
|
49
|
+
# find_elements :accessibility_id, 'Animation'
|
50
|
+
#
|
51
|
+
# # with base64 encoded template image. All platforms.
|
52
|
+
# find_elements :image, Base64.encode64(File.read(file_path))
|
53
|
+
#
|
54
|
+
# # For Android
|
55
|
+
# ## With uiautomator
|
56
|
+
# find_elements :uiautomator, 'new UiSelector().clickable(true)'
|
57
|
+
#
|
58
|
+
# # For iOS
|
59
|
+
# ## With :predicate
|
60
|
+
# find_elements :predicate, "isWDVisible == 1"
|
61
|
+
# find_elements :predicate, 'wdName == "Buttons"'
|
62
|
+
# find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'
|
63
|
+
#
|
64
|
+
# ## With Class Chain
|
65
|
+
# ### select the third child button of the first child window element
|
66
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
|
67
|
+
# ### select all the children windows
|
68
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow'
|
69
|
+
# ### select the second last child of the second child window
|
70
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
|
71
|
+
# ### matching predicate. <code>`</code> is the mark.
|
72
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[`visible = 1][`name = "bla"`]'
|
73
|
+
# ### containing predicate. `$` is the mark.
|
74
|
+
# ### Require appium-xcuitest-driver 2.54.0+. PR: https://github.com/facebook/WebDriverAgent/pull/707/files
|
75
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
|
76
|
+
# e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
|
77
|
+
# e.tag_name #=> "XCUIElementTypeWindow"
|
78
|
+
# e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
|
79
|
+
# e.tag_name #=> "XCUIElementTypeStaticText"
|
80
|
+
#
|
81
|
+
# # For Windows
|
82
|
+
# find_elements :windows_uiautomation, '....'
|
83
|
+
#
|
84
|
+
# # For Tizen
|
85
|
+
# find_elements :tizen_uiautomation, '....'
|
29
86
|
#
|
30
87
|
def find_element(*args)
|
31
88
|
how, what = extract_args(args)
|
@@ -55,8 +112,7 @@ module Appium
|
|
55
112
|
private
|
56
113
|
|
57
114
|
def _set_by_from_finders(how)
|
58
|
-
|
59
|
-
by = finders[how.to_sym]
|
115
|
+
by = FINDERS[how.to_sym]
|
60
116
|
raise ArgumentError, "cannot find element by #{how.inspect}" unless by
|
61
117
|
by
|
62
118
|
end
|
@@ -9,10 +9,6 @@ module Appium
|
|
9
9
|
status: [:get, 'status'.freeze],
|
10
10
|
is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'.freeze],
|
11
11
|
|
12
|
-
# FIXME: remove after apply https://github.com/SeleniumHQ/selenium/pull/5249
|
13
|
-
# The fix will be included in selenium-3.8.2
|
14
|
-
get_page_source: [:get, 'session/:session_id/source'.freeze],
|
15
|
-
|
16
12
|
get_timeouts: [:get, 'session/:session_id/timeouts'.freeze],
|
17
13
|
|
18
14
|
## Add OSS commands to W3C commands. We can remove them if we would like to remove them from W3C module.
|
@@ -33,6 +29,8 @@ module Appium
|
|
33
29
|
ime_deactivate: [:post, 'session/:session_id/ime/deactivate'.freeze],
|
34
30
|
ime_activate_engine: [:post, 'session/:session_id/ime/activate'.freeze],
|
35
31
|
|
32
|
+
send_keys_to_active_element: [:post, 'session/:session_id/keys'.freeze],
|
33
|
+
|
36
34
|
### Logs
|
37
35
|
get_available_log_types: [:get, 'session/:session_id/log/types'.freeze],
|
38
36
|
get_log: [:post, 'session/:session_id/log'.freeze]
|
data/lib/appium_lib_core/ios.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Appium
|
2
2
|
module Core
|
3
|
-
VERSION = '1.
|
4
|
-
DATE = '2018-
|
3
|
+
VERSION = '1.9.0'.freeze unless defined? ::Appium::Core::VERSION
|
4
|
+
DATE = '2018-08-05'.freeze unless defined? ::Appium::Core::DATE
|
5
5
|
end
|
6
6
|
end
|
data/release_notes.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
#### v1.9.0 2018-08-05
|
2
|
+
|
3
|
+
- [cc9e378](https://github.com/appium/ruby_lib_core/commit/cc9e378eba22eb448feec764d6227aff1647aaba) Release 1.9.0
|
4
|
+
- [7b44bf7](https://github.com/appium/ruby_lib_core/commit/7b44bf70bba97532daabb9b496bbe36618d77593) use default_move_duration (#115)
|
5
|
+
- [590e798](https://github.com/appium/ruby_lib_core/commit/590e7981f924524ba40b9d918b41af22cf14cc59) Add image strategy (#119)
|
6
|
+
- [24d2a62](https://github.com/appium/ruby_lib_core/commit/24d2a6265bc351e6e2ca3d410c597ad9b744c072) port send keys for an active element (#122)
|
7
|
+
- [283059f](https://github.com/appium/ruby_lib_core/commit/283059f971b4a4aeda707de0542c3991accac128) update (#121)
|
8
|
+
- [c188829](https://github.com/appium/ruby_lib_core/commit/c1888292bb28fead792824d8bb7b3a0df94ee891) gather search contexts (#118)
|
9
|
+
|
10
|
+
|
1
11
|
#### v1.8.4 2018-07-28
|
2
12
|
|
3
13
|
- [1775354](https://github.com/appium/ruby_lib_core/commit/1775354f201658243737a0a455fe4123ce2e87a7) Release 1.8.4
|
metadata
CHANGED
@@ -1,23 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuaki MATSUO
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '3.5'
|
20
|
-
- - "<"
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '3.14'
|
23
20
|
type: :runtime
|
@@ -25,9 +22,6 @@ dependencies:
|
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '3.5'
|
30
|
-
- - "<"
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: '3.14'
|
33
27
|
- !ruby/object:Gem::Dependency
|
@@ -235,7 +229,6 @@ files:
|
|
235
229
|
- lib/appium_lib_core/android/device/performance.rb
|
236
230
|
- lib/appium_lib_core/android/device/screen.rb
|
237
231
|
- lib/appium_lib_core/android/espresso/bridge.rb
|
238
|
-
- lib/appium_lib_core/android/search_context.rb
|
239
232
|
- lib/appium_lib_core/android/uiautomator1/bridge.rb
|
240
233
|
- lib/appium_lib_core/android/uiautomator2/bridge.rb
|
241
234
|
- lib/appium_lib_core/android/uiautomator2/device.rb
|
@@ -283,11 +276,9 @@ files:
|
|
283
276
|
- lib/appium_lib_core/common/ws/websocket.rb
|
284
277
|
- lib/appium_lib_core/device.rb
|
285
278
|
- lib/appium_lib_core/driver.rb
|
286
|
-
- lib/appium_lib_core/element/image.rb
|
287
279
|
- lib/appium_lib_core/ios.rb
|
288
280
|
- lib/appium_lib_core/ios/device.rb
|
289
281
|
- lib/appium_lib_core/ios/device/clipboard.rb
|
290
|
-
- lib/appium_lib_core/ios/search_context.rb
|
291
282
|
- lib/appium_lib_core/ios/uiautomation/bridge.rb
|
292
283
|
- lib/appium_lib_core/ios/uiautomation/patch.rb
|
293
284
|
- lib/appium_lib_core/ios/xcuitest/bridge.rb
|
@@ -295,7 +286,6 @@ files:
|
|
295
286
|
- lib/appium_lib_core/ios/xcuitest/device/battery.rb
|
296
287
|
- lib/appium_lib_core/ios/xcuitest/device/performance.rb
|
297
288
|
- lib/appium_lib_core/ios/xcuitest/device/screen.rb
|
298
|
-
- lib/appium_lib_core/ios/xcuitest/search_context.rb
|
299
289
|
- lib/appium_lib_core/ios_xcuitest.rb
|
300
290
|
- lib/appium_lib_core/patch.rb
|
301
291
|
- lib/appium_lib_core/version.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
module Android
|
4
|
-
module SearchContext
|
5
|
-
# @!method uiautomator_find
|
6
|
-
# find_element/s can be used with a [UISelector](http://developer.android.com/tools/help/uiautomator/UiSelector.html).
|
7
|
-
#
|
8
|
-
# @example
|
9
|
-
#
|
10
|
-
# @driver.find_elements :uiautomator, 'new UiSelector().clickable(true)'
|
11
|
-
#
|
12
|
-
def self.extend
|
13
|
-
::Appium::Core::Base::SearchContext.add_finders(uiautomator: '-android uiautomator')
|
14
|
-
end
|
15
|
-
end # class << self
|
16
|
-
end # module Ios
|
17
|
-
end # module Core
|
18
|
-
end # module Appium
|
@@ -1,106 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
#
|
4
|
-
# ImageElement is an element for images by `find_element/s_by_image`
|
5
|
-
# Experimental feature
|
6
|
-
#
|
7
|
-
class ImageElement
|
8
|
-
Point = Struct.new(:x, :y)
|
9
|
-
Dimension = Struct.new(:width, :height)
|
10
|
-
Rectangle = Struct.new(:x, :y, :width, :height)
|
11
|
-
|
12
|
-
# Base64ed format
|
13
|
-
# @example
|
14
|
-
#
|
15
|
-
# File.write 'result.png', Base64.decode64(e.visual)
|
16
|
-
#
|
17
|
-
attr_reader :visual
|
18
|
-
|
19
|
-
def initialize(bridge, x, y, width, height, visual = nil)
|
20
|
-
@bridge = bridge
|
21
|
-
@visual = visual
|
22
|
-
|
23
|
-
@center_x = x + width / 2
|
24
|
-
@center_y = y + height / 2
|
25
|
-
@x = x
|
26
|
-
@y = y
|
27
|
-
@width = width
|
28
|
-
@height = height
|
29
|
-
end
|
30
|
-
|
31
|
-
#
|
32
|
-
# Click this element.
|
33
|
-
#
|
34
|
-
# @example
|
35
|
-
#
|
36
|
-
# e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
|
37
|
-
# e.click
|
38
|
-
#
|
39
|
-
def click
|
40
|
-
@bridge.action.move_to_location(@center_x, @center_y).click.perform
|
41
|
-
end
|
42
|
-
|
43
|
-
#
|
44
|
-
# Get the location of this element.
|
45
|
-
#
|
46
|
-
# @return [Point]
|
47
|
-
#
|
48
|
-
# @example
|
49
|
-
#
|
50
|
-
# e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
|
51
|
-
# assert_equal [39, 1014], [e.location.x, e.location.y]
|
52
|
-
#
|
53
|
-
def location
|
54
|
-
Point.new @x, @y
|
55
|
-
end
|
56
|
-
|
57
|
-
#
|
58
|
-
# Get the size of this element
|
59
|
-
#
|
60
|
-
# @return [Dimension]
|
61
|
-
#
|
62
|
-
# @example
|
63
|
-
#
|
64
|
-
# e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
|
65
|
-
# assert_equal [326, 62], [e.size.width, e.size.height]
|
66
|
-
#
|
67
|
-
def size
|
68
|
-
Dimension.new @width, @height
|
69
|
-
end
|
70
|
-
|
71
|
-
#
|
72
|
-
# Get the dimensions and coordinates of this element.
|
73
|
-
#
|
74
|
-
# @return [Rectangle]
|
75
|
-
#
|
76
|
-
# @example
|
77
|
-
#
|
78
|
-
# e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
|
79
|
-
# assert_equal([39, 1014, 326, 62], [e.rect.x, e.rect.y, e.rect.width, e.rect.height])
|
80
|
-
#
|
81
|
-
def rect
|
82
|
-
Rectangle.new @x, @y, @width, @height
|
83
|
-
end
|
84
|
-
|
85
|
-
def displayed?
|
86
|
-
true
|
87
|
-
end
|
88
|
-
|
89
|
-
#-------------------------------- sugar --------------------------------
|
90
|
-
|
91
|
-
def first(full_image:, partial_image:, match_threshold: nil, visualize: false)
|
92
|
-
@bridge.find_element_by_image(full_image: full_image,
|
93
|
-
partial_image: partial_image,
|
94
|
-
match_threshold: match_threshold,
|
95
|
-
visualize: visualize)
|
96
|
-
end
|
97
|
-
|
98
|
-
def all(full_image:, partial_image:, match_threshold: nil, visualize: false)
|
99
|
-
@bridge.find_elements_by_image(full_image: full_image,
|
100
|
-
partial_image: partial_image,
|
101
|
-
match_threshold: match_threshold,
|
102
|
-
visualize: visualize)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
module Ios
|
4
|
-
module SearchContext
|
5
|
-
# @!method uiautomation_find
|
6
|
-
# find_element/s can be used with a [UIAutomation command](https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAWindowClassReference/UIAWindow/UIAWindow.html#//apple_ref/doc/uid/TP40009930).
|
7
|
-
#
|
8
|
-
# @example
|
9
|
-
# find_elements :uiautomation, 'elements()
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# @!method ios_predicate_string_find
|
13
|
-
# find_element/s can be used with a [Predicates](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/AdditionalChapters/Introduction.html)
|
14
|
-
#
|
15
|
-
# @example
|
16
|
-
# find_elements :predicate, "isWDVisible == 1"
|
17
|
-
# find_elements :predicate, 'wdName == "Buttons"'
|
18
|
-
# find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'
|
19
|
-
#
|
20
|
-
def self.extend
|
21
|
-
::Appium::Core::Base::SearchContext.add_finders(uiautomation: '-ios uiautomation')
|
22
|
-
::Appium::Core::Base::SearchContext.add_finders(predicate: '-ios predicate string')
|
23
|
-
end
|
24
|
-
end # class << self
|
25
|
-
end # module Ios
|
26
|
-
end # module Core
|
27
|
-
end # module Appium
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Appium
|
2
|
-
module Core
|
3
|
-
module Ios
|
4
|
-
module Xcuitest
|
5
|
-
module SearchContext
|
6
|
-
# @!method ios_class_chain_find
|
7
|
-
# Only for XCUITest(WebDriverAgent)
|
8
|
-
# find_element/s can be used with a [class chain]( https://github.com/facebook/WebDriverAgent/wiki/Queries)
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
#
|
12
|
-
# # select the third child button of the first child window element
|
13
|
-
# find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
|
14
|
-
#
|
15
|
-
# # select all the children windows
|
16
|
-
# find_elements :class_chain, 'XCUIElementTypeWindow'
|
17
|
-
#
|
18
|
-
# # select the second last child of the second child window
|
19
|
-
# find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
|
20
|
-
#
|
21
|
-
# # matching predicate. <code>`</code> is the mark.
|
22
|
-
# find_elements :class_chain, 'XCUIElementTypeWindow[`visible = 1][`name = "bla"`]'
|
23
|
-
#
|
24
|
-
# # containing predicate. `$` is the mark.
|
25
|
-
# # Require appium-xcuitest-driver 2.54.0+
|
26
|
-
# # PR: https://github.com/facebook/WebDriverAgent/pull/707/files
|
27
|
-
# find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
|
28
|
-
# e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
|
29
|
-
# e.tag_name #=> "XCUIElementTypeWindow"
|
30
|
-
# e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
|
31
|
-
# e.tag_name #=> "XCUIElementTypeStaticText"
|
32
|
-
#
|
33
|
-
def self.extend
|
34
|
-
::Appium::Core::Base::SearchContext.add_finders(class_chain: '-ios class chain')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end # class << self
|
38
|
-
end # module Ios
|
39
|
-
end # module Core
|
40
|
-
end # module Appium
|