Class: Applitools::Selenium::VisualGridEyes
- Inherits:
-
Object
- Object
- Applitools::Selenium::VisualGridEyes
- Extended by:
- Forwardable
- Defined in:
- lib/applitools/selenium/visual_grid/visual_grid_eyes.rb
Instance Attribute Summary collapse
-
#api_key ⇒ Object
Returns the value of attribute api_key.
-
#config ⇒ Object
Returns the value of attribute config.
-
#current_config ⇒ Object
Returns the value of attribute current_config.
-
#current_url ⇒ Object
Returns the value of attribute current_url.
-
#driver ⇒ Object
Returns the value of attribute driver.
-
#fetched_cache_map ⇒ Object
Returns the value of attribute fetched_cache_map.
-
#opened ⇒ Object
Returns the value of attribute opened.
-
#proxy ⇒ Object
Returns the value of attribute proxy.
-
#server_url ⇒ Object
Returns the value of attribute server_url.
-
#test_list ⇒ Object
Returns the value of attribute test_list.
-
#visual_grid_manager ⇒ Object
Returns the value of attribute visual_grid_manager.
Instance Method Summary collapse
- #abort_if_not_closed ⇒ Object
- #check(tag, target) ⇒ Object
-
#check_frame(options = {}) ⇒ Applitools::MatchResult
Validates the contents of an iframe and matches it with the expected output.
-
#check_region(element, how = nil, what = nil, options = {}) ⇒ Object
Takes a snapshot of the application under test and matches a region of a specific element with the expected region output.
-
#check_region_in_frame(options = {}) ⇒ Applitools::MatchResult
Validates the contents of a region in an iframe and matches it with the expected output.
-
#check_window(tag = nil, match_timeout = USE_DEFAULT_MATCH_TIMEOUT) ⇒ Object
Takes a snapshot of the application under test and matches it with the expected output.
- #close(throw_exception = true) ⇒ Object
- #collect_selenium_regions(target) ⇒ Object
- #configure {|config| ... } ⇒ Object
- #element_or_region(target_element) ⇒ Object
- #ensure_config ⇒ Object
- #eyes_connector ⇒ Object
- #get_all_test_results ⇒ Object
- #get_regions_x_paths(target) ⇒ Object
- #get_viewport_size(web_driver = driver) ⇒ Object
-
#initialize(visual_grid_manager, server_url = nil) ⇒ VisualGridEyes
constructor
A new instance of VisualGridEyes.
- #open(*args) ⇒ Object
- #open? ⇒ Boolean
- #set_viewport_size(value) ⇒ Object
- #setup_size_mode(target_element) ⇒ Object
-
#test(options = {}) {|driver| ... } ⇒ Object
Use this method to perform seamless testing with selenium through eyes driver.
Constructor Details
#initialize(visual_grid_manager, server_url = nil) ⇒ VisualGridEyes
Returns a new instance of VisualGridEyes.
20 21 22 23 24 25 26 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 20 def initialize(visual_grid_manager, server_url = nil) ensure_config self.server_url = server_url if server_url self.visual_grid_manager = visual_grid_manager self.test_list = Applitools::Selenium::TestList.new self.opened = false end |
Instance Attribute Details
#api_key ⇒ Object
Returns the value of attribute api_key.
12 13 14 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 12 def api_key @api_key end |
#config ⇒ Object
Returns the value of attribute config.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def config @config end |
#current_config ⇒ Object
Returns the value of attribute current_config.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def current_config @current_config end |
#current_url ⇒ Object
Returns the value of attribute current_url.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def current_url @current_url end |
#driver ⇒ Object
Returns the value of attribute driver.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def driver @driver end |
#fetched_cache_map ⇒ Object
Returns the value of attribute fetched_cache_map.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def fetched_cache_map @fetched_cache_map end |
#opened ⇒ Object
Returns the value of attribute opened.
12 13 14 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 12 def opened @opened end |
#proxy ⇒ Object
Returns the value of attribute proxy.
12 13 14 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 12 def proxy @proxy end |
#server_url ⇒ Object
Returns the value of attribute server_url.
12 13 14 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 12 def server_url @server_url end |
#test_list ⇒ Object
Returns the value of attribute test_list.
10 11 12 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 10 def test_list @test_list end |
#visual_grid_manager ⇒ Object
Returns the value of attribute visual_grid_manager.
9 10 11 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 9 def visual_grid_manager @visual_grid_manager end |
Instance Method Details
#abort_if_not_closed ⇒ Object
200 201 202 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 200 def abort_if_not_closed test_list.each(&:abort_if_not_closed) end |
#check(tag, target) ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 80 def check(tag, target) script = <<-END var callback = arguments[arguments.length - 1]; return (#{Applitools::Selenium::Scripts::PROCESS_RESOURCES})().then(JSON.stringify).then(callback, function(err) {callback(err.stack || err.toString())}); END begin sleep wait_before_screenshots script_result = driver.execute_async_script(script).freeze mod = Digest::SHA2.hexdigest(script_result) region_x_paths = get_regions_x_paths(target) test_list.each do |t| t.check(tag, target, script_result.dup, visual_grid_manager, region_x_paths, size_mod, region_to_check, mod) end test_list.each { |t| t.becomes_not_rendered} rescue StandardError => e Applitools::EyesLogger.error e. test_list.each { |t| t.becomes_tested} end end |
#check_frame(options = {}) ⇒ Applitools::MatchResult
Validates the contents of an iframe and matches it with the expected output.
291 292 293 294 295 296 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 291 def check_frame( = {}) = { timeout: USE_DEFAULT_MATCH_TIMEOUT, tag: nil }.merge!() frame = [:frame] || [:frame_element] || [:name_or_id] target = Applitools::Selenium::Target.frame(frame).timeout([:timeout]).fully check([:tag], target) end |
#check_region(element, how = nil, what = nil, options = {}) ⇒ Object
Takes a snapshot of the application under test and matches a region of a specific element with the expected region output.
274 275 276 277 278 279 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 274 def check_region(*args) = { timeout: USE_DEFAULT_MATCH_TIMEOUT, tag: nil }.merge! Applitools::Utils.(args) target = Applitools::Selenium::Target.new.region(*args).timeout([:match_timeout]) target.fully if [:stitch_content] check([:tag], target) end |
#check_region_in_frame(options = {}) ⇒ Applitools::MatchResult
Validates the contents of a region in an iframe and matches it with the expected output.
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 309 def check_region_in_frame( = {}) = { timeout: USE_DEFAULT_MATCH_TIMEOUT, tag: nil, stitch_content: false }.merge!() Applitools::ArgumentGuard.not_nil [:by], 'options[:by]' Applitools::ArgumentGuard.is_a? [:by], 'options[:by]', Array how_what = .delete(:by) frame = [:frame] || [:frame_element] || [:name_or_id] target = Applitools::Selenium::Target.new.timeout([:timeout]) target.frame(frame) if frame target.fully if [:stitch_content] target.region(*how_what) check([:tag], target) end |
#check_window(tag = nil, match_timeout = USE_DEFAULT_MATCH_TIMEOUT) ⇒ Object
Takes a snapshot of the application under test and matches it with the expected output.
247 248 249 250 251 252 253 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 247 def check_window(tag = nil, match_timeout = USE_DEFAULT_MATCH_TIMEOUT) target = Applitools::Selenium::Target.window.tap do |t| t.timeout(match_timeout) t.fully if force_full_page_screenshot end check(tag, target) end |
#close(throw_exception = true) ⇒ Object
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 174 def close(throw_exception = true) return false if test_list.empty? test_list.each(&:close) while (!((states = test_list.map(&:state_name).uniq).count == 1 && states.first == :completed)) do sleep 0.5 end self.opened = false test_list.select { |t| t.pending_exceptions && !t.pending_exceptions.empty? }.each do |t| t.pending_exceptions.each do |e| raise e end end if throw_exception test_list.map(&:test_result).compact.each do |r| raise Applitools::NewTestError.new (r), r if r.new? raise Applitools::DiffsFoundError.new (r), r if r.unresolved? && !r.new? raise Applitools::TestFailedError.new (r), r if r.failed? end end failed_results = test_list.map(&:test_result).compact.select { |r| !r.as_expected? } failed_results.empty? ? test_list.map(&:test_result).compact.first : failed_results end |
#collect_selenium_regions(target) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 126 def collect_selenium_regions(target) selenium_regions = {} # ignore_regions = target.ignored_regions # floating_regions = target.floating_regions target_element = target.region_to_check setup_size_mode(target_element) # selenium_regions.map do |r| # element_or_region(r) # end target.ignored_regions.each do |r| selenium_regions[element_or_region(r)] = :ignore end target.floating_regions.each do |r| selenium_regions[element_or_region(r)] = :floating end selenium_regions[region_to_check] = :target if size_mod == 'selector' # selenium_regions[:ignore] += [target.ignored_regions.map { |r| element_or_region(r) }].flatten.compact # selenium_regions[:target] << region_to_check if size_mod == 'selector' selenium_regions end |
#configure {|config| ... } ⇒ Object
32 33 34 35 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 32 def configure return unless block_given? yield(config) end |
#element_or_region(target_element) ⇒ Object
165 166 167 168 169 170 171 172 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 165 def element_or_region(target_element) if target_element.respond_to?(:call) region, _padding_proc = target_element.call(driver, true) region else target_element end end |
#ensure_config ⇒ Object
28 29 30 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 28 def ensure_config self.config = Applitools::Selenium::Configuration.new end |
#eyes_connector ⇒ Object
72 73 74 75 76 77 78 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 72 def eyes_connector logger.info("creating VisualGridEyes server connector") ::Applitools::Selenium::EyesConnector.new(server_url).tap do |connector| connector.batch = batch connector.config = config.deep_clone end end |
#get_all_test_results ⇒ Object
208 209 210 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 208 def get_all_test_results test_list.map(&:test_result) end |
#get_regions_x_paths(target) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 102 def get_regions_x_paths(target) # regions_hash = collect_selenium_regions(target).each do |k,v| # v.map! do |el| # if [::Selenium::WebDriver::Element, Applitools::Selenium::Element].include?(el.class) # xpath = driver.execute_script(Applitools::Selenium::Scripts::GET_ELEMENT_XPATH_JS, el) # web_element_region = Applitools::Selenium::WebElementRegion.new(xpath, k) # self.region_to_check = web_element_region if k ==:target && size_mod == 'selector' # web_element_region # end # end.compact! # end result = [] regions_hash = collect_selenium_regions(target).each do |el, v| if [::Selenium::WebDriver::Element, Applitools::Selenium::Element].include?(el.class) xpath = driver.execute_script(Applitools::Selenium::Scripts::GET_ELEMENT_XPATH_JS, el) web_element_region = Applitools::Selenium::WebElementRegion.new(xpath, v) self.region_to_check = web_element_region if v == :target && size_mod == 'selector' result << web_element_region target.regions[el] = result.size - 1 end end result end |
#get_viewport_size(web_driver = driver) ⇒ Object
67 68 69 70 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 67 def (web_driver = driver) Applitools::ArgumentGuard.not_nil 'web_driver', web_driver Applitools::Utils::EyesSeleniumUtils.(driver) end |
#open(*args) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 37 def open(*args) self.test_list = Applitools::Selenium::TestList.new = Applitools::Utils.(args) Applitools::ArgumentGuard.hash(, 'options', [:driver]) config.app_name = [:app_name] if config.app_name.nil? || config.app_name && config.app_name.empty? config.test_name = [:test_name] if config.test_name.nil? || config.test_name && config.test_name.empty? self.driver = .delete(:driver) self.current_url = driver.current_url if () else self. = end visual_grid_manager.open(self) logger.info("getting all browsers info...") browsers_info_list = config.browsers_info logger.info("creating test descriptors for each browser info...") browsers_info_list.each() do |bi| test_list.push Applitools::Selenium::RunningTest.new(eyes_connector, bi, driver) end self.opened = true driver end |
#open? ⇒ Boolean
204 205 206 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 204 def open? opened end |
#set_viewport_size(value) ⇒ Object
212 213 214 215 216 217 218 219 220 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 212 def (value) begin Applitools::Utils::EyesSeleniumUtils. driver, value rescue => e logger.error e.class.to_s logger.error e. raise Applitools::TestFailedError.new "#{e.class} - #{e.}" end end |
#setup_size_mode(target_element) ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 148 def setup_size_mode(target_element) self.size_mod = 'full-page' element_or_region = element_or_region(target_element) case element_or_region when ::Selenium::WebDriver::Element, Applitools::Selenium::Element self.size_mod = 'selector' when Applitools::Region self.size_mod = 'region' unless element_or_region == Applitools::Region::EMPTY else self.size_mod = 'full-page' end self.region_to_check = element_or_region end |
#test(options = {}) {|driver| ... } ⇒ Object
Use this method to perform seamless testing with selenium through eyes driver. It yields a block and passes to it an Applitools::Selenium::Driver instance, which wraps standard driver. Using Selenium methods inside the ‘test’ block will send the messages to Selenium after creating the Eyes triggers for them. Options are similar to #open
336 337 338 339 340 341 342 |
# File 'lib/applitools/selenium/visual_grid/visual_grid_eyes.rb', line 336 def test( = {}, &_block) open() yield(driver) close ensure abort_if_not_closed end |