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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbee900cd3702aacc958add560a4ac3ecd307021f08926babf1b6269d0b5bacf
4
- data.tar.gz: 9faadc80999564bfddae87dbb445239e9f8db6c9297f7eefc8e232e149aa00ba
3
+ metadata.gz: f93929f33d3e8aa38656484f5cda5c572289f4a7710ae041ac154da2ae5030e3
4
+ data.tar.gz: 01f2484ce2bb35a3e68d9833996bdf7d59fc7f244e2e688127283ce57d7c0b75
5
5
  SHA512:
6
- metadata.gz: 89996f378e3540d53126e2392d18158eff4deec019a9a18d3030e65abb67b9265a29d220057ac15f56589bd88c903a8bc6685bccd73909a04ac6d1db190c16d6
7
- data.tar.gz: 2513697371bdd3f4ee2dac36933b64cd7ae01730b28d1e7032f5a3c0e97a566279c01d731ce1891f82901685c6aa7a2dbfc269fa1a2345a205d6cf1fcec8a197
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
- url = node[:tokens].select { |t| t[:node] == :url }.first
36
- return url[:value] if url && !url.empty?
37
- url = node[:tokens].select { |t| t[:node] == :function && t[:value] == 'url' }.first
38
- url_index = node[:tokens].index(url)
39
- url_string_node = url_index && node[:tokens][url_index + 1]
40
- url_string_node &&
41
- url_string_node[:node] == :string && !url_string_node[:value].empty? && url_string_node[:value]
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
- .flatten
59
- .select { |n| n[:node] == :property && (n[:name] == 'background' || n[:name] == 'background-image') }
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(url)
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 script_hook(hook)
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
- return driver.title unless dont_get_title
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
- handle_css_block = proc do |urls_to_fetch, url|
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(key.dup, response, on_css_fetched: handle_css_block)
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.on_css_fetched(handle_css_block)
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, :handle_css_block
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.handle_css_block = options[:on_css_fetched] if options[:on_css_fetched].is_a? Proc
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 on_css_fetched(block)
37
- self.handle_css_block = block
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
- return unless %r{^text/css}i =~ content_type && handle_css_block
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
- handle_css_block.call(parser.imported_css + parser.fonts + parser.images, url)
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
- test_list.each do |t|
148
- t.check(tag, target_to_check, render_task)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '3.15.40'.freeze
4
+ VERSION = '3.15.41'.freeze
5
5
  end
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.40
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-03 00:00:00.000000000 Z
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.40
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.40
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