appium_lib_core 1.8.4 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|