eyes_selenium 3.15.40 → 3.15.41
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/lib/applitools/selenium/configuration.rb +3 -1
- data/lib/applitools/selenium/css_parser/find_embedded_resources.rb +38 -13
- data/lib/applitools/selenium/dom_capture/dom_capture.rb +4 -1
- data/lib/applitools/selenium/target.rb +3 -1
- data/lib/applitools/selenium/visual_grid/eyes_connector.rb +3 -2
- data/lib/applitools/selenium/visual_grid/render_request.rb +2 -1
- data/lib/applitools/selenium/visual_grid/render_task.rb +28 -8
- data/lib/applitools/selenium/visual_grid/running_test.rb +3 -2
- data/lib/applitools/selenium/visual_grid/vg_resource.rb +25 -6
- data/lib/applitools/selenium/visual_grid/visual_grid_eyes.rb +18 -5
- data/lib/applitools/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f93929f33d3e8aa38656484f5cda5c572289f4a7710ae041ac154da2ae5030e3
|
4
|
+
data.tar.gz: 01f2484ce2bb35a3e68d9833996bdf7d59fc7f244e2e688127283ce57d7c0b75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e9110c797b43fb30b969b96c05c5f96033da7f6365b290376d6dbd96d70edeef018fa6bfa899cb3cf844552d3a5a93bec880bd634f4c9765b4348d61e9f7461
|
7
|
+
data.tar.gz: '0698188d685f8950b35ab1c80a26b96a3b402f03dc207ab09afde8f022192f23bfd8b0304c19440f34f18811f058178b5bacb97a5111a1d2e7fdb6de6d3e90f5'
|
@@ -14,7 +14,8 @@ module Applitools
|
|
14
14
|
hide_scrollbars: false,
|
15
15
|
hide_caret: false,
|
16
16
|
browsers_info: Applitools::Selenium::BrowsersInfo.new,
|
17
|
-
accessibility_validation: Applitools::AccessibilityLevel::NONE
|
17
|
+
accessibility_validation: Applitools::AccessibilityLevel::NONE,
|
18
|
+
rendering_grid_force_put: (ENV['APPLITOOLS_RENDERING_GRID_FORCE_PUT'] || 'false').casecmp('true') == 0
|
18
19
|
}
|
19
20
|
end
|
20
21
|
class << self
|
@@ -33,6 +34,7 @@ module Applitools
|
|
33
34
|
object_field :browsers_info, Applitools::Selenium::BrowsersInfo
|
34
35
|
int_field :concurrent_sessions
|
35
36
|
enum_field :accessibility_validation, Applitools::AccessibilityLevel.enum_values
|
37
|
+
boolean_field :rendering_grid_force_put
|
36
38
|
|
37
39
|
def match_level_keys
|
38
40
|
super << :accessibility_validation
|
@@ -15,6 +15,7 @@ module Applitools
|
|
15
15
|
|
16
16
|
def initialize(css)
|
17
17
|
self.css = css
|
18
|
+
@nodes_by_type = {}
|
18
19
|
end
|
19
20
|
|
20
21
|
def imported_css
|
@@ -32,37 +33,61 @@ module Applitools
|
|
32
33
|
private
|
33
34
|
|
34
35
|
def url(node)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
url_string_node
|
36
|
+
result = []
|
37
|
+
node[:tokens].select { |t| t[:node] == :url }.uniq.each do |nd|
|
38
|
+
result << nd[:value] if nd && !nd.empty?
|
39
|
+
end
|
40
|
+
node[:tokens].select { |t| t[:node] == :function && t[:value] == 'url' }.uniq do |nd|
|
41
|
+
url_index = node[:tokens].index(nd)
|
42
|
+
url_string_node = url_index && node[:tokens][url_index + 1]
|
43
|
+
result << url_string_node &&
|
44
|
+
url_string_node[:node] == :string && !url_string_node[:value].empty? && url_string_node[:value]
|
45
|
+
end
|
46
|
+
result.compact
|
42
47
|
end
|
43
48
|
|
44
49
|
def fetch_urls(nodes)
|
45
|
-
nodes.map { |n| url(n) }.compact
|
50
|
+
nodes.map { |n| url(n) }.flatten.compact
|
46
51
|
end
|
47
52
|
|
48
53
|
def import_rules
|
49
|
-
css_nodes.select { |n| n[:node] == :at_rule && n[:name] == 'import' }
|
54
|
+
# css_nodes.select { |n| n[:node] == :at_rule && n[:name] == 'import' }
|
55
|
+
nodes_by_type[:import_rules]
|
50
56
|
end
|
51
57
|
|
52
58
|
def font_face_rules
|
53
|
-
css_nodes.select { |n| n[:node] == :at_rule && n[:name] == 'font-face' }
|
59
|
+
# css_nodes.select { |n| n[:node] == :at_rule && n[:name] == 'font-face' }
|
60
|
+
nodes_by_type[:font_face_rules]
|
54
61
|
end
|
55
62
|
|
56
63
|
def images_rules
|
57
|
-
css_nodes.select { |n| n[:node] == :style_rule }.map { |n| n[:children] }
|
58
|
-
|
59
|
-
|
64
|
+
# css_nodes.select { |n| n[:node] == :style_rule }.map { |n| n[:children] }
|
65
|
+
# .flatten
|
66
|
+
# .select { |n| n[:node] == :property && (n[:name] == 'background' || n[:name] == 'background-image') }
|
67
|
+
nodes_by_type[:images_rules]
|
60
68
|
end
|
61
69
|
|
62
70
|
def css_nodes
|
63
71
|
@css_nodes ||= parse_nodes
|
64
72
|
end
|
65
73
|
|
74
|
+
def nodes_by_type
|
75
|
+
return @nodes_by_type unless @nodes_by_type.empty?
|
76
|
+
css_nodes.each do |n|
|
77
|
+
@nodes_by_type[:import_rules] ||= []
|
78
|
+
@nodes_by_type[:font_face_rules] ||= []
|
79
|
+
@nodes_by_type[:images_rules] ||= []
|
80
|
+
@nodes_by_type[:import_rules] << n if n[:node] == :at_rule && n[:name] == 'import'
|
81
|
+
@nodes_by_type[:font_face_rules] << n if n[:node] == :at_rule && n[:name] == 'font-face'
|
82
|
+
@nodes_by_type[:images_rules] << n if n[:node] == :style_rule
|
83
|
+
end
|
84
|
+
@nodes_by_type[:images_rules].map! { |n| n[:children] }.flatten!
|
85
|
+
@nodes_by_type[:images_rules] = @nodes_by_type[:images_rules].select do |n|
|
86
|
+
n[:node] == :property && (n[:name] == 'background' || n[:name] == 'background-image')
|
87
|
+
end
|
88
|
+
@nodes_by_type
|
89
|
+
end
|
90
|
+
|
66
91
|
def parse_nodes
|
67
92
|
Crass.parse css
|
68
93
|
end
|
@@ -72,7 +72,10 @@ module Applitools
|
|
72
72
|
next if /^blob:/ =~ url
|
73
73
|
|
74
74
|
begin
|
75
|
-
missing_css_response = server_connector.download_resource(
|
75
|
+
missing_css_response = server_connector.download_resource(
|
76
|
+
url,
|
77
|
+
Applitools::Utils::EyesSeleniumUtils.user_agent(driver)
|
78
|
+
)
|
76
79
|
response_headers = missing_css_response.headers
|
77
80
|
raise Applitools::EyesError, "Wrong response header: #{response_headers['content-type']}" unless
|
78
81
|
%r{^text/css.*}i =~ response_headers['content-type']
|
@@ -303,11 +303,13 @@ module Applitools
|
|
303
303
|
self
|
304
304
|
end
|
305
305
|
|
306
|
-
def
|
306
|
+
def before_render_screenshot_hook(hook)
|
307
307
|
options[:script_hooks][:beforeCaptureScreenshot] = hook
|
308
308
|
self
|
309
309
|
end
|
310
310
|
|
311
|
+
alias script_hook before_render_screenshot_hook
|
312
|
+
|
311
313
|
def finalize
|
312
314
|
return self unless frame_or_element
|
313
315
|
region = frame_or_element
|
@@ -5,7 +5,7 @@ module Applitools
|
|
5
5
|
USE_DEFAULT_MATCH_TIMEOUT = -1
|
6
6
|
|
7
7
|
attr_accessor :browser_info, :test_result, :driver, :dummy_region_provider, :dont_get_title,
|
8
|
-
:current_uuid, :render_statuses, :device_name, :driver_lock
|
8
|
+
:current_uuid, :render_statuses, :device_name, :driver_lock, :title
|
9
9
|
public :server_connector
|
10
10
|
|
11
11
|
class RegionProvider
|
@@ -33,6 +33,7 @@ module Applitools
|
|
33
33
|
self.device_name = browser_info && browser_info.emulation_info && browser_info.emulation_info.device_name
|
34
34
|
logger.info "opening EyesConnector for #{config.short_description} with viewport size: #{browser_info}"
|
35
35
|
config.viewport_size = browser_info.viewport_size
|
36
|
+
title
|
36
37
|
open_base
|
37
38
|
# ensure_running_session
|
38
39
|
end
|
@@ -138,7 +139,7 @@ module Applitools
|
|
138
139
|
end
|
139
140
|
|
140
141
|
def title
|
141
|
-
|
142
|
+
@title ||= driver.title unless dont_get_title
|
142
143
|
rescue StandardError => e
|
143
144
|
logger.warn "failed (#{e.message})"
|
144
145
|
self.dont_get_title = false
|
@@ -6,12 +6,13 @@ module Applitools
|
|
6
6
|
class RenderRequest
|
7
7
|
include Applitools::Jsonable
|
8
8
|
json_fields :renderId, :webhook, :url, :dom, :resources, :scriptHooks,
|
9
|
-
:selectorsToFindRegionsFor, :sendDom
|
9
|
+
:selectorsToFindRegionsFor, :sendDom, :agentId
|
10
10
|
|
11
11
|
json_fields :renderInfo, :browser
|
12
12
|
|
13
13
|
def initialize(*args)
|
14
14
|
options = Applitools::Utils.extract_options! args
|
15
|
+
self.agent_id = "eyes.selenium.visualgrid.ruby/#{Applitools::VERSION}"
|
15
16
|
self.script_hooks = {}
|
16
17
|
self.selectors_to_find_regions_for = []
|
17
18
|
options.keys.each do |k|
|
@@ -21,10 +21,10 @@ module Applitools
|
|
21
21
|
|
22
22
|
attr_accessor :script, :running_tests, :resource_cache, :put_cache, :server_connector,
|
23
23
|
:rendering_info, :request_resources, :dom_url_mod, :result, :region_selectors, :size_mode,
|
24
|
-
:region_to_check, :script_hooks, :visual_grid_manager, :discovered_resources
|
24
|
+
:region_to_check, :script_hooks, :visual_grid_manager, :discovered_resources, :ua_string, :force_put
|
25
25
|
|
26
26
|
def initialize(name, script_result, visual_grid_manager, server_connector, region_selectors, size_mode,
|
27
|
-
region, script_hooks, mod = nil)
|
27
|
+
region, script_hooks, force_put, ua_string, mod = nil)
|
28
28
|
|
29
29
|
self.result = nil
|
30
30
|
self.script = script_result
|
@@ -37,9 +37,10 @@ module Applitools
|
|
37
37
|
self.size_mode = size_mode
|
38
38
|
self.region_to_check = region
|
39
39
|
self.script_hooks = script_hooks if script_hooks.is_a?(Hash)
|
40
|
-
|
40
|
+
self.ua_string = ua_string
|
41
41
|
self.dom_url_mod = mod
|
42
42
|
self.running_tests = []
|
43
|
+
self.force_put = force_put
|
43
44
|
@discovered_resources_lock = Mutex.new
|
44
45
|
super(name) do
|
45
46
|
perform
|
@@ -72,6 +73,22 @@ module Applitools
|
|
72
73
|
cache_key = URI(dom_resource.url)
|
73
74
|
cache_key.query = "modifier=#{dom_url_mod}" if dom_url_mod
|
74
75
|
|
76
|
+
if force_put
|
77
|
+
request_resources.each do |r, _v|
|
78
|
+
put_cache.fetch_and_store(URI(r)) do |_s|
|
79
|
+
server_connector.render_put_resource(
|
80
|
+
rendering_info['serviceUrl'],
|
81
|
+
rendering_info['accessToken'],
|
82
|
+
request_resources[r],
|
83
|
+
running_render
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
request_resources.each do |r, _v|
|
88
|
+
put_cache[r]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
75
92
|
if need_more_resources
|
76
93
|
running_render['needMoreResources'].each do |resource_url|
|
77
94
|
put_cache.fetch_and_store(URI(resource_url)) do |_s|
|
@@ -148,7 +165,6 @@ module Applitools
|
|
148
165
|
def prepare_data_for_rg(data)
|
149
166
|
self.request_resources = Applitools::Selenium::RenderResources.new
|
150
167
|
dom = parse_frame_dom_resources(data)
|
151
|
-
|
152
168
|
prepare_rg_requests(running_tests, dom)
|
153
169
|
end
|
154
170
|
|
@@ -159,7 +175,7 @@ module Applitools
|
|
159
175
|
|
160
176
|
fetch_block = proc {}
|
161
177
|
|
162
|
-
|
178
|
+
handle_resources_block = proc do |urls_to_fetch, url|
|
163
179
|
urls_to_fetch.each do |discovered_url|
|
164
180
|
target_url = self.class.apply_base_url(URI.parse(discovered_url), url)
|
165
181
|
next unless /^http/i =~ target_url.scheme
|
@@ -171,7 +187,7 @@ module Applitools
|
|
171
187
|
end
|
172
188
|
|
173
189
|
fetch_block = proc do |_s, key|
|
174
|
-
resp_proc = proc { |u| server_connector.download_resource(u) }
|
190
|
+
resp_proc = proc { |u| server_connector.download_resource(u, ua_string) }
|
175
191
|
retry_count = 3
|
176
192
|
response = nil
|
177
193
|
loop do
|
@@ -179,7 +195,11 @@ module Applitools
|
|
179
195
|
response = resp_proc.call(key.dup)
|
180
196
|
break unless response.status != 200 && retry_count > 0
|
181
197
|
end
|
182
|
-
Applitools::Selenium::VGResource.parse_response(
|
198
|
+
Applitools::Selenium::VGResource.parse_response(
|
199
|
+
key.dup,
|
200
|
+
response,
|
201
|
+
on_resources_fetched: handle_resources_block
|
202
|
+
)
|
183
203
|
end
|
184
204
|
|
185
205
|
data['frames'].each do |f|
|
@@ -192,7 +212,7 @@ module Applitools
|
|
192
212
|
end
|
193
213
|
|
194
214
|
blobs.each do |blob|
|
195
|
-
blob.
|
215
|
+
blob.on_resources_fetched(handle_resources_block)
|
196
216
|
blob.lookup_for_resources
|
197
217
|
end
|
198
218
|
|
@@ -133,7 +133,7 @@ module Applitools
|
|
133
133
|
attr_accessor :open_queue, :task_queue, :render_queue, :close_queue, :watch_open, :watch_task,
|
134
134
|
:watch_render, :watch_close
|
135
135
|
|
136
|
-
attr_accessor :eyes, :browser_info, :test_result, :pending_exceptions, :driver, :task_lock
|
136
|
+
attr_accessor :eyes, :browser_info, :test_result, :pending_exceptions, :driver, :task_lock, :test_uuid
|
137
137
|
|
138
138
|
def initialize(eyes, browser_info, driver)
|
139
139
|
Applitools::ArgumentGuard.is_a? eyes, 'eyes', Applitools::Selenium::EyesConnector
|
@@ -185,7 +185,8 @@ module Applitools
|
|
185
185
|
watch_open[open_task] = false
|
186
186
|
end
|
187
187
|
|
188
|
-
def check(tag, target, render_task)
|
188
|
+
def check(tag, target, render_task, title)
|
189
|
+
eyes.title = title
|
189
190
|
result_index = render_task.add_running_test(self)
|
190
191
|
|
191
192
|
check_task = VGTask.new("perform check #{tag} #{target}") do
|
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'base64'
|
4
4
|
require 'digest'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
5
7
|
module Applitools
|
6
8
|
module Selenium
|
7
9
|
class VGResource
|
8
10
|
include Applitools::Jsonable
|
9
11
|
json_fields :contentType, :hash, :hashFormat
|
10
|
-
attr_accessor :url, :content, :
|
12
|
+
attr_accessor :url, :content, :handle_discovered_resources_block
|
11
13
|
alias content_type contentType
|
12
14
|
alias content_type= contentType=
|
13
15
|
|
@@ -24,7 +26,8 @@ module Applitools
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def initialize(url, content_type, content, options = {})
|
27
|
-
self.
|
29
|
+
self.handle_discovered_resources_block = options[:on_resources_fetched] if
|
30
|
+
options[:on_resources_fetched].is_a? Proc
|
28
31
|
self.url = URI(url)
|
29
32
|
self.content_type = content_type
|
30
33
|
self.content = content
|
@@ -33,19 +36,35 @@ module Applitools
|
|
33
36
|
lookup_for_resources
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
37
|
-
self.
|
39
|
+
def on_resources_fetched(block)
|
40
|
+
self.handle_discovered_resources_block = block
|
38
41
|
end
|
39
42
|
|
40
43
|
def lookup_for_resources
|
41
|
-
|
44
|
+
lookup_for_css_resources
|
45
|
+
lookup_for_svg_resources
|
46
|
+
end
|
47
|
+
|
48
|
+
def lookup_for_css_resources
|
49
|
+
return unless %r{^text/css}i =~ content_type && handle_discovered_resources_block
|
42
50
|
parser = Applitools::Selenium::CssParser::FindEmbeddedResources.new(content)
|
43
|
-
|
51
|
+
handle_discovered_resources_block.call(parser.imported_css + parser.fonts + parser.images, url)
|
52
|
+
end
|
53
|
+
|
54
|
+
def lookup_for_svg_resources
|
55
|
+
return unless %r{^image/svg\+xml} =~ content_type && handle_discovered_resources_block
|
56
|
+
attrs = Nokogiri::XML(content)
|
57
|
+
.xpath("//@*[namespace-uri(.) = 'http://www.w3.org/1999/xlink'] | //@href")
|
58
|
+
.select { |a| a.name == 'href' }
|
59
|
+
.map(&:value)
|
60
|
+
handle_discovered_resources_block.call(attrs, url)
|
44
61
|
end
|
45
62
|
|
46
63
|
def stringify
|
47
64
|
url.to_s + content_type.to_s + hash
|
48
65
|
end
|
66
|
+
|
67
|
+
private :lookup_for_svg_resources, :lookup_for_css_resources
|
49
68
|
end
|
50
69
|
end
|
51
70
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'applitools/selenium/configuration'
|
4
4
|
require 'timeout'
|
5
|
+
require 'securerandom'
|
5
6
|
|
6
7
|
module Applitools
|
7
8
|
module Selenium
|
@@ -14,13 +15,13 @@ module Applitools
|
|
14
15
|
def_delegators 'Applitools::EyesLogger', :logger, :log_handler, :log_handler=
|
15
16
|
|
16
17
|
attr_accessor :visual_grid_manager, :driver, :current_url, :current_config, :fetched_cache_map,
|
17
|
-
:config, :driver_lock
|
18
|
+
:config, :driver_lock, :test_uuid, :dont_get_title
|
18
19
|
attr_accessor :test_list
|
19
20
|
|
20
21
|
attr_accessor :api_key, :server_url, :proxy, :opened
|
21
22
|
|
22
23
|
attr_accessor :size_mod, :region_to_check
|
23
|
-
private :size_mod, :size_mod=, :region_to_check, :region_to_check=
|
24
|
+
private :size_mod, :size_mod=, :region_to_check, :region_to_check=, :test_uuid, :test_uuid=
|
24
25
|
|
25
26
|
def_delegators 'config', *Applitools::Selenium::Configuration.methods_to_delegate
|
26
27
|
def_delegators 'config', *Applitools::EyesBaseConfiguration.methods_to_delegate
|
@@ -46,6 +47,7 @@ module Applitools
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def open(*args)
|
50
|
+
self.test_uuid = SecureRandom.uuid
|
49
51
|
options = Applitools::Utils.extract_options!(args)
|
50
52
|
Applitools::ArgumentGuard.hash(options, 'options', [:driver])
|
51
53
|
|
@@ -78,6 +80,7 @@ module Applitools
|
|
78
80
|
t.on_results_received do |results|
|
79
81
|
visual_grid_manager.aggregate_result(results)
|
80
82
|
end
|
83
|
+
t.test_uuid = test_uuid
|
81
84
|
end
|
82
85
|
test_list.push test
|
83
86
|
end
|
@@ -125,7 +128,6 @@ module Applitools
|
|
125
128
|
end
|
126
129
|
sleep 0.5
|
127
130
|
script_thread_result = script_thread.join(DOM_EXTRACTION_TIMEOUT)
|
128
|
-
|
129
131
|
raise ::Applitools::EyesError.new 'Timeout error while getting dom snapshot!' unless script_thread_result
|
130
132
|
Applitools::EyesLogger.info 'Done!'
|
131
133
|
|
@@ -141,11 +143,22 @@ module Applitools
|
|
141
143
|
size_mod,
|
142
144
|
region_to_check,
|
143
145
|
target_to_check.options[:script_hooks],
|
146
|
+
config.rendering_grid_force_put,
|
147
|
+
Applitools::Utils::EyesSeleniumUtils.user_agent(driver),
|
144
148
|
mod
|
145
149
|
)
|
146
150
|
end
|
147
|
-
|
148
|
-
|
151
|
+
|
152
|
+
title = begin
|
153
|
+
driver.title
|
154
|
+
rescue StandardError => e
|
155
|
+
logger.warn "failed (#{e.message})"
|
156
|
+
''
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
test_list.select { |t| t.test_uuid == test_uuid }.each do |t|
|
161
|
+
t.check(tag, target_to_check, render_task, title)
|
149
162
|
end
|
150
163
|
test_list.each(&:becomes_not_rendered)
|
151
164
|
visual_grid_manager.enqueue_render_task render_task
|
data/lib/applitools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_selenium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.15.
|
4
|
+
version: 3.15.41
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-12-
|
11
|
+
date: 2019-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eyes_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.15.
|
19
|
+
version: 3.15.41
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.15.
|
26
|
+
version: 3.15.41
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: selenium-webdriver
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: nokogiri
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: Provides SDK for writing Applitools Selenium-based tests
|
84
98
|
email:
|
85
99
|
- team@applitools.com
|