appium_lib_core 1.7.1 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 186c66ad7d2bd85ada277634f906739683741bca
4
- data.tar.gz: 20c05598f4aa22bdbeccfd9ba57c032383a34b53
3
+ metadata.gz: e4396bf8502f02909fc45492b5f205554cd367f2
4
+ data.tar.gz: ece56ca4022cef888da977917121a403df721b47
5
5
  SHA512:
6
- metadata.gz: 81483bed8fb09ad7e9cb5177593270de7eea8593ff83beee3c94e2d69bb9ca09805d9ce312751ac95fef2cb42f07910b6add32d07af896e35d501d2d44b2675f
7
- data.tar.gz: 9f26c27dcb556240802069c9728f12c07d119fee0f4e46b5332074faa6946b330412ed5071e8b65a6f0b41273ff36c5654df855c5eea3b8746ed75e5df03737c
6
+ metadata.gz: 261082f3a1f085f18d549ad837d0b93dac630886ddcd24e4c40420744efac7f9ef0490ab94c32d171ba58816cb2607bd476988513a558435723eb7448ed212cc
7
+ data.tar.gz: f46ec6897d884275faa9260ef48c550c479e5173986e9464035e03d7af50e29ea576b97d2e33560e55ef0422c27990e5cb8b61dfe9d5761674ce3fd99cfbba51
data/CHANGELOG.md CHANGED
@@ -8,6 +8,16 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  ### Deprecations
10
10
 
11
+ ## [1.7.2] - 2018-06-23
12
+ ### Enhancements
13
+ - Add a `ImageElement` to handle images as elements by `matchTemplate`
14
+ - Experimental feature
15
+ - [Internal] Define screenshot methods in appium_lib_core instead of Selenium's one
16
+
17
+ ### Bug fixes
18
+
19
+ ### Deprecations
20
+
11
21
  ## [1.7.1] - 2018-06-15
12
22
  ### Enhancements
13
23
  - Add a `format` argument for `device_time` [#94](https://github.com/appium/ruby_lib_core/pull/94)
@@ -6,6 +6,74 @@ module Appium
6
6
  def commands(command)
7
7
  ::Appium::Core::Commands::MJSONWP::COMMANDS[command]
8
8
  end
9
+
10
+ #
11
+ # @return [::Appium::Core::ImageElement|nil]
12
+ # @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
13
+ #
14
+ def find_element_by_image(full_image:, partial_image:, match_threshold: nil, visualize: false)
15
+ options = {}
16
+ options[:threshold] = match_threshold unless match_threshold.nil?
17
+ options[:visualize] = visualize
18
+
19
+ params = {}
20
+ params[:mode] = :matchTemplate
21
+ params[:firstImage] = full_image
22
+ params[:secondImage] = partial_image
23
+ params[:options] = options if options
24
+
25
+ result = execute(:compare_images, {}, params)
26
+ rect = result['rect']
27
+
28
+ if rect
29
+ return ::Appium::Core::ImageElement.new(self,
30
+ rect['x'],
31
+ rect['y'],
32
+ rect['width'],
33
+ rect['height'],
34
+ result['visualization'])
35
+ end
36
+ nil
37
+ end
38
+
39
+ #
40
+ # @return [[]|[::Appium::Core::ImageElement]]
41
+ # @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
42
+ #
43
+ def find_elements_by_image(full_image:, partial_images:, match_threshold: nil, visualize: false)
44
+ options = {}
45
+ options[:threshold] = match_threshold unless match_threshold.nil?
46
+ options[:visualize] = visualize
47
+
48
+ params = {}
49
+ params[:mode] = :matchTemplate
50
+ params[:firstImage] = full_image
51
+ params[:options] = options if options
52
+
53
+ partial_images.each_with_object([]) do |partial_image, acc|
54
+ params[:secondImage] = partial_image
55
+
56
+ begin
57
+ result = execute(:compare_images, {}, params)
58
+ rect = result['rect']
59
+
60
+ if result['rect']
61
+ acc.push ::Appium::Core::ImageElement.new(self,
62
+ rect['x'],
63
+ rect['y'],
64
+ rect['width'],
65
+ rect['height'],
66
+ result['visualization'])
67
+ end
68
+ rescue ::Selenium::WebDriver::Error::WebDriverError => e
69
+ acc if e.message.include?('Cannot find any occurrences')
70
+ end
71
+ end
72
+ end
73
+
74
+ def take_element_screenshot(element)
75
+ execute :take_element_screenshot, id: element.ref
76
+ end
9
77
  end # class MJSONWP
10
78
  end # class Bridge
11
79
  end # class Base
@@ -1,3 +1,5 @@
1
+ require 'base64'
2
+
1
3
  module Appium
2
4
  module Core
3
5
  class Base
@@ -84,6 +86,70 @@ module Appium
84
86
  ids.map { |id| ::Selenium::WebDriver::Element.new self, element_id_from(id) }
85
87
  end
86
88
 
89
+ #
90
+ # @return [::Appium::Core::ImageElement|nil]
91
+ # @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
92
+ #
93
+ def find_element_by_image(full_image:, partial_image:, match_threshold: nil, visualize: false)
94
+ options = {}
95
+ options[:threshold] = match_threshold unless match_threshold.nil?
96
+ options[:visualize] = visualize
97
+
98
+ params = {}
99
+ params[:mode] = :matchTemplate
100
+ params[:firstImage] = full_image
101
+ params[:secondImage] = partial_image
102
+ params[:options] = options if options
103
+
104
+ result = execute(:compare_images, {}, params)
105
+ rect = result['rect']
106
+
107
+ if rect
108
+ return ::Appium::Core::ImageElement.new(self,
109
+ rect['x'],
110
+ rect['y'],
111
+ rect['width'],
112
+ rect['height'],
113
+ result['visualization'])
114
+ end
115
+ nil
116
+ end
117
+
118
+ #
119
+ # @return [[]|[::Appium::Core::ImageElement]]
120
+ # @raise [::Selenium::WebDriver::Error::TimeOutError|::Selenium::WebDriver::Error::WebDriverError]
121
+ #
122
+ def find_elements_by_image(full_image:, partial_images:, match_threshold: nil, visualize: false)
123
+ options = {}
124
+ options[:threshold] = match_threshold unless match_threshold.nil?
125
+ options[:visualize] = visualize
126
+
127
+ params = {}
128
+ params[:mode] = :matchTemplate
129
+ params[:firstImage] = full_image
130
+ params[:options] = options if options
131
+
132
+ partial_images.each_with_object([]) do |partial_image, acc|
133
+ params[:secondImage] = partial_image
134
+
135
+ begin
136
+ result = execute(:compare_images, {}, params)
137
+ rect = result['rect']
138
+
139
+ if result['rect']
140
+ acc.push ::Appium::Core::ImageElement.new(self,
141
+ rect['x'],
142
+ rect['y'],
143
+ rect['width'],
144
+ rect['height'],
145
+ result['visualization'])
146
+ end
147
+ rescue ::Selenium::WebDriver::Error::WebDriverError => e
148
+ acc if e.message.include?('Cannot find any occurrences')
149
+ end
150
+ end
151
+ end
152
+
87
153
  # For Appium
88
154
  # override
89
155
  # called in `extend DriverExtensions::HasNetworkConnection`
@@ -138,6 +204,10 @@ module Appium
138
204
  end
139
205
  end
140
206
 
207
+ def take_element_screenshot(element)
208
+ execute :take_element_screenshot, id: element.ref
209
+ end
210
+
141
211
  private
142
212
 
143
213
  # Don't convert locators for Appium Client
@@ -1,17 +1,19 @@
1
+ require 'base64'
1
2
  require_relative 'search_context'
3
+ require_relative 'screenshot'
2
4
 
3
5
  module Appium
4
6
  module Core
5
7
  class Base
6
8
  class Driver < ::Selenium::WebDriver::Driver
7
9
  include ::Selenium::WebDriver::DriverExtensions::UploadsFiles
8
- include ::Selenium::WebDriver::DriverExtensions::TakesScreenshot
9
10
  include ::Selenium::WebDriver::DriverExtensions::HasSessionId
10
11
  include ::Selenium::WebDriver::DriverExtensions::Rotatable
11
12
  include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
12
13
  include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
13
14
 
14
15
  include ::Appium::Core::Base::SearchContext
16
+ include ::Appium::Core::Base::TakeScreenshot
15
17
 
16
18
  def initialize(opts = {})
17
19
  listener = opts.delete(:listener)
@@ -183,6 +185,77 @@ module Appium
183
185
  def session_capabilities
184
186
  @bridge.session_capabilities
185
187
  end
188
+
189
+ DEFAULT_MATCH_THRESHOLD = 0.5
190
+
191
+ # Return ImageElement if current view has a partial image
192
+ #
193
+ # @param [String] png_img_path A path to a partial image you'd like to find
194
+ # @param [Flood] match_threshold At what normalized threshold to reject
195
+ # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
196
+ # the corresponding picture matching operation. This option is disabled by default.
197
+ #
198
+ # @return [::Appium::Core::ImageElement]
199
+ # @raise [::Appium::Core::Error::NoSuchElementError|::Appium::Core::Error::CoreError] No such element
200
+ #
201
+ # @example
202
+ #
203
+ # e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'
204
+ #
205
+ def find_element_by_image(png_img_path, match_threshold: DEFAULT_MATCH_THRESHOLD, visualize: false)
206
+ full_image = @bridge.screenshot
207
+ partial_image = Base64.encode64 File.read(png_img_path)
208
+
209
+ element = begin
210
+ @bridge.find_element_by_image(full_image: full_image,
211
+ partial_image: partial_image,
212
+ match_threshold: match_threshold,
213
+ visualize: visualize)
214
+ rescue Selenium::WebDriver::Error::TimeOutError
215
+ raise ::Appium::Core::Error::NoSuchElementError
216
+ rescue ::Selenium::WebDriver::Error::WebDriverError => e
217
+ raise ::Appium::Core::Error::NoSuchElementError if e.message.include?('Cannot find any occurrences')
218
+ raise ::Appium::Core::Error::CoreError, e.message
219
+ end
220
+ raise ::Appium::Core::Error::NoSuchElementError if element.nil?
221
+
222
+ element
223
+ end
224
+
225
+ # Return ImageElement if current view has partial images
226
+ #
227
+ # @param [[String]] png_img_paths Paths to a partial image you'd like to find
228
+ # @param [Flood] match_threshold At what normalized threshold to reject
229
+ # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
230
+ # the corresponding picture matching operation. This option is disabled by default.
231
+ #
232
+ # @return [[::Appium::Core::ImageElement]]
233
+ # @return [::Appium::Core::Error::CoreError]
234
+ #
235
+ # @example
236
+ #
237
+ # e = @@driver.find_elements_by_image './test/functional/data/test_element_image.png'
238
+ # e == [] # if the `e` is empty
239
+ #
240
+ def find_elements_by_image(png_img_paths, match_threshold: DEFAULT_MATCH_THRESHOLD, visualize: false)
241
+ full_image = @bridge.screenshot
242
+
243
+ partial_images = png_img_paths.map do |png_img_path|
244
+ Base64.encode64 File.read(png_img_path)
245
+ end
246
+
247
+ begin
248
+ @bridge.find_elements_by_image(full_image: full_image,
249
+ partial_images: partial_images,
250
+ match_threshold: match_threshold,
251
+ visualize: visualize)
252
+ rescue Selenium::WebDriver::Error::TimeOutError
253
+ []
254
+ rescue ::Selenium::WebDriver::Error::WebDriverError => e
255
+ return [] if e.message.include?('Cannot find any occurrences')
256
+ raise ::Appium::Core::Error::CoreError, e.message
257
+ end
258
+ end
186
259
  end # class Driver
187
260
  end # class Base
188
261
  end # module Core
@@ -0,0 +1,83 @@
1
+ module Appium
2
+ module Core
3
+ class Base
4
+ module TakeScreenshot
5
+ #
6
+ # Save a PNG screenshot to the given path
7
+ #
8
+ # @api public
9
+ #
10
+ def save_screenshot(png_path)
11
+ extension = File.extname(png_path).downcase
12
+ if extension != '.png'
13
+ ::Appium::Logger.warn 'name used for saved screenshot does not match file type. '\
14
+ 'It should end with .png extension'
15
+ end
16
+ File.open(png_path, 'wb') { |f| f << screenshot_as(:png) }
17
+ end
18
+
19
+ #
20
+ # Return a PNG screenshot in the given format as a string
21
+ #
22
+ # @param [:base64, :png] format
23
+ # @return String screenshot
24
+ #
25
+ # @example
26
+ #
27
+ # @@driver.screenshot_as :base64 #=> "iVBORw0KGgoAAAANSUhEUgAABDgAAAB+CAIAAABOPDa6AAAAAX"
28
+ #
29
+ # @api public
30
+ def screenshot_as(format)
31
+ case format
32
+ when :base64
33
+ bridge.screenshot
34
+ when :png
35
+ bridge.screenshot.unpack('m')[0]
36
+ else
37
+ raise Core::Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
38
+ end
39
+ end
40
+
41
+ # @param [Selenium::WebDriver::Element] element A element you'd like to take screenshot.
42
+ # @param [String] png_path A path to save the screenshot
43
+ # @return [File] Path to the screenshot.
44
+ #
45
+ # @example
46
+ #
47
+ # @driver.save_element_screenshot(element, "fine_name.png")
48
+ #
49
+ def save_element_screenshot(element, png_path)
50
+ extension = File.extname(png_path).downcase
51
+ if extension != '.png'
52
+ ::Appium::Logger.warn 'name used for saved screenshot does not match file type. '\
53
+ 'It should end with .png extension'
54
+ end
55
+ File.open(png_path, 'wb') { |f| f << element_screenshot_as(element, :png) }
56
+ end
57
+ # backward compatibility
58
+ alias take_element_screenshot save_element_screenshot
59
+
60
+ #
61
+ # Return a PNG screenshot in the given format as a string
62
+ #
63
+ # @param [:base64, :png] format
64
+ # @return String screenshot
65
+ #
66
+ # @example
67
+ #
68
+ # @@driver.element_screenshot_as element, :base64 #=> "iVBORw0KGgoAAAANSUhEUgAABDgAAAB+CAIAAABOPDa6AAAAAX"
69
+ #
70
+ def element_screenshot_as(element, format)
71
+ case format
72
+ when :base64
73
+ bridge.take_element_screenshot(element)
74
+ when :png
75
+ bridge.take_element_screenshot(element).unpack('m')[0]
76
+ else
77
+ raise Core::Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -11,6 +11,8 @@ module Appium
11
11
  class NotSupportedAppiumServer < CoreError; end
12
12
  class NoSuchElementError < CoreError; end
13
13
 
14
+ class UnsupportedOperationError < CoreError; end
15
+
14
16
  # Server side error
15
17
  class ServerError; end
16
18
  end
@@ -1,6 +1,8 @@
1
1
  require_relative 'common/touch_action/touch_actions'
2
2
  require_relative 'common/touch_action/multi_touch'
3
3
 
4
+ require_relative 'element/image'
5
+
4
6
  require_relative 'device/screen_record'
5
7
  require_relative 'device/app_state'
6
8
  require_relative 'device/clipboard_content_type'
@@ -475,16 +477,6 @@ module Appium
475
477
  # @driver.switch_to_default_context
476
478
  #
477
479
 
478
- # @!method take_element_screenshot(element, png_path)
479
- # @param [Selenium::WebDriver::Element] element A element you'd like to take screenshot.
480
- # @param [String] png_path A path to save the screenshot
481
- # @return [File] Path to the screenshot.
482
- #
483
- # @example
484
- #
485
- # @driver.take_element_screenshot(element, "fine_name.png")
486
- #
487
-
488
480
  # @!method stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT')
489
481
  # @param [String] remote_path: The path to the remote location, where the resulting video should be uploaded.
490
482
  # The following protocols are supported: http/https, ftp.
@@ -534,19 +526,6 @@ module Appium
534
526
  end
535
527
  end
536
528
 
537
- add_endpoint_method(:take_element_screenshot) do
538
- def take_element_screenshot(element, png_path)
539
- result = execute :take_element_screenshot, id: element.ref
540
-
541
- extension = File.extname(png_path).downcase
542
- if extension != '.png'
543
- ::Appium::Logger.warn 'name used for saved screenshot does not match file type. '\
544
- 'It should end with .png extension'
545
- end
546
- File.open(png_path, 'wb') { |f| f << result.unpack('m')[0] }
547
- end
548
- end
549
-
550
529
  add_endpoint_method(:save_viewport_screenshot) do
551
530
  def save_viewport_screenshot(png_path)
552
531
  extension = File.extname(png_path).downcase
@@ -572,6 +551,10 @@ module Appium
572
551
  ScreenRecord.add_methods
573
552
  ImageComparison.add_methods
574
553
  AppState.add_methods
554
+
555
+ # Compatibility for appium_lib
556
+ # TODO: Will remove
557
+ delegate_from_appium_driver :take_element_screenshot
575
558
  end
576
559
 
577
560
  # def extended
@@ -45,7 +45,7 @@ module Appium
45
45
  # File.write 'match_images_visual.png', Base64.decode64(visual['visualization']) # if the image is PNG
46
46
  #
47
47
 
48
- # @!method find_image_occurrence(full_image:, partial_image:, detector_name: 'ORB', visualize: false)
48
+ # @!method find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
49
49
  # Performs images matching by template to find possible occurrence of the partial image
50
50
  # in the full image with default options. Read https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
51
51
  # for more details on this topic.
@@ -55,6 +55,7 @@ module Appium
55
55
  # are supported.
56
56
  # @param [Bool] visualise: Makes the endpoint to return an image, which contains the visualized result of
57
57
  # the corresponding picture matching operation. This option is disabled by default.
58
+ # @param [Float] threshold: [0.5] At what normalized threshold to reject
58
59
  #
59
60
  # @example
60
61
  # @driver.find_image_occurrence full_image: "image data 1", partial_image: "image data 2"
@@ -129,13 +130,14 @@ module Appium
129
130
  end
130
131
 
131
132
  ::Appium::Core::Device.add_endpoint_method(:find_image_occurrence) do
132
- def find_image_occurrence(full_image:, partial_image:, visualize: false)
133
+ def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
133
134
  unless ::Appium::Core::Device::ImageComparison::MATCH_TEMPLATE[:visualize].member?(visualize)
134
135
  raise "visualize should be #{::Appium::Core::Device::ImageComparison::MATCH_TEMPLATE[:visualize]}"
135
136
  end
136
137
 
137
138
  options = {}
138
139
  options[:visualize] = visualize
140
+ options[:threshold] = threshold unless threshold.nil?
139
141
 
140
142
  compare_images(mode: :matchTemplate, first_image: full_image, second_image: partial_image, options: options)
141
143
  end
@@ -0,0 +1,106 @@
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) # rubocop:disable Metrics/ParameterLists
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,6 +1,6 @@
1
1
  module Appium
2
2
  module Core
3
- VERSION = '1.7.1'.freeze unless defined? ::Appium::Core::VERSION
4
- DATE = '2018-06-15'.freeze unless defined? ::Appium::Core::DATE
3
+ VERSION = '1.7.2'.freeze unless defined? ::Appium::Core::VERSION
4
+ DATE = '2018-06-23'.freeze unless defined? ::Appium::Core::DATE
5
5
  end
6
6
  end
data/release_notes.md CHANGED
@@ -1,3 +1,11 @@
1
+ #### v1.7.2 2018-06-23
2
+
3
+ - [72bbc01](https://github.com/appium/ruby_lib_core/commit/72bbc01dc69579c5b7dea43b6ec01fee37299ebe) Release 1.7.2
4
+ - [5438246](https://github.com/appium/ruby_lib_core/commit/54382468e226d38f16d651b7b9f6da952d766d22) Define screenshot methods in this lib (#98)
5
+ - [9bd9e11](https://github.com/appium/ruby_lib_core/commit/9bd9e11c20ce37a9e8e0384c09c663913aca0d15) Use bridge for imageelement(#96)
6
+ - [7e7fba3](https://github.com/appium/ruby_lib_core/commit/7e7fba32a89ce547e81d68eb6659db464be7a60f) add image element/s (#95)
7
+
8
+
1
9
  #### v1.7.1 2018-06-15
2
10
 
3
11
  - [84febaf](https://github.com/appium/ruby_lib_core/commit/84febaf3a5b4dff0084455556d3ffe1293b64471) Release 1.7.1
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.7.1
4
+ version: 1.7.2
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-06-14 00:00:00.000000000 Z
11
+ date: 2018-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
@@ -245,6 +245,7 @@ files:
245
245
  - lib/appium_lib_core/common/base/command.rb
246
246
  - lib/appium_lib_core/common/base/driver.rb
247
247
  - lib/appium_lib_core/common/base/http_default.rb
248
+ - lib/appium_lib_core/common/base/screenshot.rb
248
249
  - lib/appium_lib_core/common/base/search_context.rb
249
250
  - lib/appium_lib_core/common/command.rb
250
251
  - lib/appium_lib_core/common/command/common.rb
@@ -275,6 +276,7 @@ files:
275
276
  - lib/appium_lib_core/device/touch_actions.rb
276
277
  - lib/appium_lib_core/device/value.rb
277
278
  - lib/appium_lib_core/driver.rb
279
+ - lib/appium_lib_core/element/image.rb
278
280
  - lib/appium_lib_core/ios.rb
279
281
  - lib/appium_lib_core/ios/device.rb
280
282
  - lib/appium_lib_core/ios/device/clipboard.rb