eyes_selenium 2.16.0 → 2.17.0
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/.rubocop.yml +54 -0
 - data/.travis.yml +2 -0
 - data/Rakefile +3 -0
 - data/eyes_selenium.gemspec +3 -2
 - data/lib/applitools/base/image_position.rb +10 -0
 - data/lib/applitools/base/mouse_trigger.rb +1 -1
 - data/lib/applitools/base/point.rb +18 -5
 - data/lib/applitools/base/region.rb +44 -9
 - data/lib/applitools/base/server_connector.rb +7 -6
 - data/lib/applitools/base/test_results.rb +4 -5
 - data/lib/applitools/extensions.rb +17 -0
 - data/lib/applitools/eyes.rb +40 -32
 - data/lib/applitools/eyes_logger.rb +7 -7
 - data/lib/applitools/method_tracer.rb +2 -2
 - data/lib/applitools/selenium/browser.rb +220 -0
 - data/lib/applitools/selenium/driver.rb +61 -59
 - data/lib/applitools/selenium/element.rb +10 -5
 - data/lib/applitools/selenium/match_window_data.rb +1 -1
 - data/lib/applitools/selenium/match_window_task.rb +25 -18
 - data/lib/applitools/selenium/mouse.rb +3 -3
 - data/lib/applitools/selenium/viewport_size.rb +57 -48
 - data/lib/applitools/utils/image_delta_compressor.rb +148 -150
 - data/lib/applitools/utils/image_utils.rb +36 -3
 - data/lib/applitools/utils/utils.rb +3 -6
 - data/lib/applitools/version.rb +1 -1
 - data/lib/eyes_selenium.rb +2 -2
 - data/spec/driver_passthrough_spec.rb +1 -1
 - data/spec/spec_helper.rb +2 -5
 - data/test/appium_example_script.rb +15 -15
 - data/test/test_script.rb +1 -1
 - data/test/watir_test_script.rb +1 -1
 - metadata +23 -4
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 250fb34d1762517235653022b1912a310f725030
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: e72d68a5d5927ad9bf4deaef8375820cc5c8fe23
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9e86ee6df164195fd10b9b66032ca7132fd53deadca423ce904672e553b76e92f55c8f99f195d90bcf5217ebecf695a01aa86c5d62afa4cd6f9559e7cfa7b436
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 41c97cde1b72b9dee573fec079fc80f6a3823c1ea00e41e45778a48743c10fe7292222d2a4a77a761f5dbe9dcdcc659dcc3de3fedc857496a4f47bdfc0d7d6ce
         
     | 
    
        data/.rubocop.yml
    ADDED
    
    | 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Custom config for RuboCop static code analysis
         
     | 
| 
      
 2 
     | 
    
         
            +
            Metrics/LineLength:
         
     | 
| 
      
 3 
     | 
    
         
            +
              Max: 120
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Metrics/MethodLength:
         
     | 
| 
      
 6 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            Metrics/ClassLength:
         
     | 
| 
      
 9 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Metrics/ParameterLists:
         
     | 
| 
      
 12 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Metrics/CyclomaticComplexity:
         
     | 
| 
      
 15 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            Metrics/PerceivedComplexity:
         
     | 
| 
      
 18 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            Metrics/AbcSize:
         
     | 
| 
      
 21 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            Metrics/BlockNesting:
         
     | 
| 
      
 24 
     | 
    
         
            +
              Max: 4
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            Style/SignalException:
         
     | 
| 
      
 27 
     | 
    
         
            +
              EnforcedStyle: only_raise
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            Style/RaiseArgs:
         
     | 
| 
      
 30 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            Style/AlignParameters:
         
     | 
| 
      
 33 
     | 
    
         
            +
              EnforcedStyle: with_fixed_indentation
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            Style/HashSyntax:
         
     | 
| 
      
 36 
     | 
    
         
            +
              UseHashRocketsWithSymbolValues: true
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            Style/AlignHash:
         
     | 
| 
      
 39 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            Style/MultilineOperationIndentation:
         
     | 
| 
      
 42 
     | 
    
         
            +
              EnforcedStyle: indented
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            Style/IndentHash:
         
     | 
| 
      
 45 
     | 
    
         
            +
              EnforcedStyle: consistent
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            Style/ClassAndModuleChildren:
         
     | 
| 
      
 48 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            Style/Documentation:
         
     | 
| 
      
 51 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            Style/ModuleFunction:
         
     | 
| 
      
 54 
     | 
    
         
            +
              Enabled: false
         
     | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Rakefile
    CHANGED
    
    
    
        data/eyes_selenium.gemspec
    CHANGED
    
    | 
         @@ -13,13 +13,13 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       13 
13 
     | 
    
         
             
              spec.homepage      = 'https://www.applitools.com'
         
     | 
| 
       14 
14 
     | 
    
         
             
              spec.license       = 'Apache License, Version 2.0'
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
              spec.files         = `git ls-files`.split( 
     | 
| 
      
 16 
     | 
    
         
            +
              spec.files         = `git ls-files`.split($RS)
         
     | 
| 
       17 
17 
     | 
    
         
             
              spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
         
     | 
| 
       18 
18 
     | 
    
         
             
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         
     | 
| 
       19 
19 
     | 
    
         
             
              spec.require_paths = ['lib']
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
              spec.add_dependency 'selenium-webdriver', '>= 2.45.0'
         
     | 
| 
       22 
     | 
    
         
            -
              spec.add_dependency 'oily_png'
         
     | 
| 
      
 22 
     | 
    
         
            +
              spec.add_dependency 'oily_png', '>= 1.2'
         
     | 
| 
       23 
23 
     | 
    
         
             
              spec.add_dependency 'faraday'
         
     | 
| 
       24 
24 
     | 
    
         
             
              spec.add_dependency 'oj'
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
         @@ -28,6 +28,7 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       28 
28 
     | 
    
         
             
              spec.add_development_dependency 'rspec', '>= 3'
         
     | 
| 
       29 
29 
     | 
    
         
             
              spec.add_development_dependency 'watir-webdriver'
         
     | 
| 
       30 
30 
     | 
    
         
             
              spec.add_development_dependency 'appium_lib'
         
     | 
| 
      
 31 
     | 
    
         
            +
              spec.add_development_dependency 'rubocop'
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
33 
     | 
    
         
             
              # Exclude debugging support on Travis CI, due to its incompatibility with jruby and older rubies.
         
     | 
| 
       33 
34 
     | 
    
         
             
              unless ENV['TRAVIS']
         
     | 
| 
         @@ -2,16 +2,29 @@ module Applitools::Base 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class Point
         
     | 
| 
       3 
3 
     | 
    
         
             
                attr_accessor :x, :y
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
                alias_attribute :left, :x
         
     | 
| 
      
 6 
     | 
    
         
            +
                alias_attribute :top, :y
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       5 
8 
     | 
    
         
             
                def initialize(x, y)
         
     | 
| 
       6 
9 
     | 
    
         
             
                  @x = x
         
     | 
| 
       7 
10 
     | 
    
         
             
                  @y = y
         
     | 
| 
       8 
11 
     | 
    
         
             
                end
         
     | 
| 
       9 
12 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                 
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
      
 13 
     | 
    
         
            +
                TOP_LEFT = Point.new(0, 0)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def ==(other)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  return super.==(other) unless other.is_a?(Point)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @x == other.x && @y == other.y
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def hash
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @x.hash & @y.hash
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                alias_method :eql?, :==
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def to_hash(options = {})
         
     | 
| 
      
 27 
     | 
    
         
            +
                  options[:region] ? { left: left, top: top } : { x: x, y: y }
         
     | 
| 
       15 
28 
     | 
    
         
             
                end
         
     | 
| 
       16 
29 
     | 
    
         | 
| 
       17 
30 
     | 
    
         
             
                def values
         
     | 
| 
         @@ -9,7 +9,7 @@ module Applitools::Base 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  @height = height.round
         
     | 
| 
       10 
10 
     | 
    
         
             
                end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                EMPTY =  
     | 
| 
      
 12 
     | 
    
         
            +
                EMPTY = Region.new(0, 0, 0, 0)
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                def make_empty
         
     | 
| 
       15 
15 
     | 
    
         
             
                  @left = EMPTY.left
         
     | 
| 
         @@ -19,7 +19,7 @@ module Applitools::Base 
     | 
|
| 
       19 
19 
     | 
    
         
             
                end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                def empty?
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
                  @left == EMPTY.left && @top == EMPTY.top && @width == EMPTY.width && @height == EMPTY.height
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                def right
         
     | 
| 
         @@ -31,14 +31,17 @@ module Applitools::Base 
     | 
|
| 
       31 
31 
     | 
    
         
             
                end
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                def intersecting?(other)
         
     | 
| 
       34 
     | 
    
         
            -
                  ((left <= other.left && other.left <= right) || (other.left <= left && left <= other.right))  
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
                  ((left <= other.left && other.left <= right) || (other.left <= left && left <= other.right)) &&
         
     | 
| 
      
 35 
     | 
    
         
            +
                    ((top <= other.top && other.top <= bottom) || (other.top <= top && top <= other.bottom))
         
     | 
| 
       36 
36 
     | 
    
         
             
                end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
38 
     | 
    
         
             
                def intersect(other)
         
     | 
| 
       39 
     | 
    
         
            -
                   
     | 
| 
       40 
     | 
    
         
            -
                    make_empty 
     | 
| 
      
 39 
     | 
    
         
            +
                  unless intersecting?(other)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    make_empty
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    return
         
     | 
| 
       41 
43 
     | 
    
         
             
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       42 
45 
     | 
    
         
             
                  i_left = (left >= other.left) ? left : other.left
         
     | 
| 
       43 
46 
     | 
    
         
             
                  i_right = (right <= other.right) ? right : other.right
         
     | 
| 
       44 
47 
     | 
    
         
             
                  i_top = (top >= other.top) ? top : other.top
         
     | 
| 
         @@ -51,14 +54,46 @@ module Applitools::Base 
     | 
|
| 
       51 
54 
     | 
    
         
             
                end
         
     | 
| 
       52 
55 
     | 
    
         | 
| 
       53 
56 
     | 
    
         
             
                def contains?(other_left, other_top)
         
     | 
| 
       54 
     | 
    
         
            -
                  other_left >= left && other_left <= right &&  
     | 
| 
       55 
     | 
    
         
            -
                  other_top >= top && other_top <= bottom
         
     | 
| 
      
 57 
     | 
    
         
            +
                  other_left >= left && other_left <= right && other_top >= top && other_top <= bottom
         
     | 
| 
       56 
58 
     | 
    
         
             
                end
         
     | 
| 
       57 
59 
     | 
    
         | 
| 
       58 
60 
     | 
    
         
             
                def middle_offset
         
     | 
| 
       59 
61 
     | 
    
         
             
                  mid_x = width / 2
         
     | 
| 
       60 
62 
     | 
    
         
             
                  mid_y = height / 2
         
     | 
| 
       61 
     | 
    
         
            -
                   
     | 
| 
      
 63 
     | 
    
         
            +
                  Point.new(mid_x.round, mid_y.round)
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                def subregions(subregion_size)
         
     | 
| 
      
 67 
     | 
    
         
            +
                  [].tap do |subregions|
         
     | 
| 
      
 68 
     | 
    
         
            +
                    current_top = @top
         
     | 
| 
      
 69 
     | 
    
         
            +
                    bottom = @top + @height
         
     | 
| 
      
 70 
     | 
    
         
            +
                    right = @left + @width
         
     | 
| 
      
 71 
     | 
    
         
            +
                    subregion_width = [@width, subregion_size.width].min
         
     | 
| 
      
 72 
     | 
    
         
            +
                    subregion_height = [@height, subregion_size.height].min
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    while current_top < bottom
         
     | 
| 
      
 75 
     | 
    
         
            +
                      current_bottom = current_top + subregion_height
         
     | 
| 
      
 76 
     | 
    
         
            +
                      if current_bottom > bottom
         
     | 
| 
      
 77 
     | 
    
         
            +
                        current_bottom = bottom
         
     | 
| 
      
 78 
     | 
    
         
            +
                        current_top = current_bottom - subregion_height
         
     | 
| 
      
 79 
     | 
    
         
            +
                      end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                      current_left = @left
         
     | 
| 
      
 82 
     | 
    
         
            +
                      while current_left < right
         
     | 
| 
      
 83 
     | 
    
         
            +
                        current_right = current_left + subregion_width
         
     | 
| 
      
 84 
     | 
    
         
            +
                        if current_right > right
         
     | 
| 
      
 85 
     | 
    
         
            +
                          current_right = right
         
     | 
| 
      
 86 
     | 
    
         
            +
                          current_left = current_right - subregion_width
         
     | 
| 
      
 87 
     | 
    
         
            +
                        end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                        subregions << Region.new(current_left, current_top, subregion_width, subregion_height)
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                        current_left += subregion_width
         
     | 
| 
      
 92 
     | 
    
         
            +
                      end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                      current_top += subregion_height
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
       62 
97 
     | 
    
         
             
                end
         
     | 
| 
       63 
98 
     | 
    
         | 
| 
       64 
99 
     | 
    
         
             
                def to_hash
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'faraday'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require 'oj'
         
     | 
| 
       4 
     | 
    
         
            -
            Oj.default_options = {:mode => :compat }
         
     | 
| 
      
 4 
     | 
    
         
            +
            Oj.default_options = { :mode => :compat }
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            require 'uri'
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
         @@ -44,7 +44,8 @@ module Applitools::Base::ServerConnector 
     | 
|
| 
       44 
44 
     | 
    
         
             
              end
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
46 
     | 
    
         
             
              def start_session(session_start_info)
         
     | 
| 
       47 
     | 
    
         
            -
                res = post(endpoint_url, body: Oj.dump(startInfo: 
     | 
| 
      
 47 
     | 
    
         
            +
                res = post(endpoint_url, body: Oj.dump(startInfo:
         
     | 
| 
      
 48 
     | 
    
         
            +
                  Applitools::Utils.camelcase_hash_keys(session_start_info.to_hash)))
         
     | 
| 
       48 
49 
     | 
    
         
             
                raise Applitools::EyesError.new("Request failed: #{res.status}") unless res.success?
         
     | 
| 
       49 
50 
     | 
    
         | 
| 
       50 
51 
     | 
    
         
             
                response = Oj.load(res.body)
         
     | 
| 
         @@ -52,7 +53,7 @@ module Applitools::Base::ServerConnector 
     | 
|
| 
       52 
53 
     | 
    
         
             
              end
         
     | 
| 
       53 
54 
     | 
    
         | 
| 
       54 
55 
     | 
    
         
             
              def stop_session(session, aborted = nil, save = false)
         
     | 
| 
       55 
     | 
    
         
            -
                res = long_delete(URI.join(endpoint_url, session.id.to_s), query: {aborted: aborted, updateBaseline: save})
         
     | 
| 
      
 56 
     | 
    
         
            +
                res = long_delete(URI.join(endpoint_url, session.id.to_s), query: { aborted: aborted, updateBaseline: save })
         
     | 
| 
       56 
57 
     | 
    
         
             
                raise Applitools::EyesError.new("Request failed: #{res.status}") unless res.success?
         
     | 
| 
       57 
58 
     | 
    
         | 
| 
       58 
59 
     | 
    
         
             
                response = Oj.load(res.body)
         
     | 
| 
         @@ -82,11 +83,11 @@ module Applitools::Base::ServerConnector 
     | 
|
| 
       82 
83 
     | 
    
         
             
              end
         
     | 
| 
       83 
84 
     | 
    
         | 
| 
       84 
85 
     | 
    
         
             
              def request(url, method, options = {})
         
     | 
| 
       85 
     | 
    
         
            -
                Faraday::Connection.new(url, ssl: {ca_file: SSL_CERT}).send(method) do |req|
         
     | 
| 
      
 86 
     | 
    
         
            +
                Faraday::Connection.new(url, ssl: { ca_file: SSL_CERT }).send(method) do |req|
         
     | 
| 
       86 
87 
     | 
    
         
             
                  req.options.timeout  = DEFAULT_TIMEOUT
         
     | 
| 
       87 
88 
     | 
    
         
             
                  req.headers = DEFAULT_HEADERS.merge(options[:headers] || {})
         
     | 
| 
       88 
89 
     | 
    
         
             
                  req.headers['Content-Type'] = options[:content_type] if options.key?(:content_type)
         
     | 
| 
       89 
     | 
    
         
            -
                  req.params = {apiKey: api_key}.merge(options[:query] || {})
         
     | 
| 
      
 90 
     | 
    
         
            +
                  req.params = { apiKey: api_key }.merge(options[:query] || {})
         
     | 
| 
       90 
91 
     | 
    
         
             
                  req.body = options[:body]
         
     | 
| 
       91 
92 
     | 
    
         
             
                end
         
     | 
| 
       92 
93 
     | 
    
         
             
              end
         
     | 
| 
         @@ -95,7 +96,7 @@ module Applitools::Base::ServerConnector 
     | 
|
| 
       95 
96 
     | 
    
         
             
                delay = LONG_REQUEST_DELAY
         
     | 
| 
       96 
97 
     | 
    
         
             
                (options[:headers] ||= {})['Eyes-Expect'] = '202-accepted'
         
     | 
| 
       97 
98 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
                 
     | 
| 
      
 99 
     | 
    
         
            +
                loop do
         
     | 
| 
       99 
100 
     | 
    
         
             
                  # Date should be in RFC 1123 format.
         
     | 
| 
       100 
101 
     | 
    
         
             
                  options[:headers]['Eyes-Date'] = Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S GMT')
         
     | 
| 
       101 
102 
     | 
    
         | 
| 
         @@ -2,7 +2,7 @@ module Applitools::Base 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class TestResults
         
     | 
| 
       3 
3 
     | 
    
         
             
                attr_accessor :is_new, :url
         
     | 
| 
       4 
4 
     | 
    
         
             
                attr_reader :steps, :matches, :mismatches, :missing, :exact_matches, :strict_matches, :content_matches,
         
     | 
| 
       5 
     | 
    
         
            -
                  :layout_matches, :none_matches 
     | 
| 
      
 5 
     | 
    
         
            +
                  :layout_matches, :none_matches
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                def initialize(steps = 0, matches = 0, mismatches = 0, missing = 0, exact_matches = 0, strict_matches = 0,
         
     | 
| 
       8 
8 
     | 
    
         
             
                  content_matches = 0, layout_matches = 0, none_matches = 0)
         
     | 
| 
         @@ -19,15 +19,14 @@ module Applitools::Base 
     | 
|
| 
       19 
19 
     | 
    
         
             
                  @url = nil
         
     | 
| 
       20 
20 
     | 
    
         
             
                end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                def  
     | 
| 
      
 22 
     | 
    
         
            +
                def passed?
         
     | 
| 
       23 
23 
     | 
    
         
             
                  !is_new && mismatches == 0 && missing == 0
         
     | 
| 
       24 
24 
     | 
    
         
             
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
                alias_method :is_passed, :passed?
         
     | 
| 
       25 
26 
     | 
    
         | 
| 
       26 
27 
     | 
    
         
             
                def to_s
         
     | 
| 
       27 
28 
     | 
    
         
             
                  is_new_str = ''
         
     | 
| 
       28 
     | 
    
         
            -
                  unless is_new.nil?
         
     | 
| 
       29 
     | 
    
         
            -
                    is_new_str = is_new ? 'New test' : 'Existing test'
         
     | 
| 
       30 
     | 
    
         
            -
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  is_new_str = is_new ? 'New test' : 'Existing test' unless is_new.nil?
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
                  "#{is_new_str} [ steps: #{steps}, matches: #{matches}, mismatches: #{mismatches}, missing: #{missing} ], "\
         
     | 
| 
       33 
32 
     | 
    
         
             
                    "URL: #{url}"
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Module
         
     | 
| 
      
 2 
     | 
    
         
            +
              def alias_attribute(new_name, old_name)
         
     | 
| 
      
 3 
     | 
    
         
            +
                module_eval <<-STR, __FILE__, __LINE__ + 1
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def #{new_name}
         
     | 
| 
      
 5 
     | 
    
         
            +
                    self.#{old_name}
         
     | 
| 
      
 6 
     | 
    
         
            +
                  end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  def #{new_name}?
         
     | 
| 
      
 9 
     | 
    
         
            +
                    self.#{old_name}?
         
     | 
| 
      
 10 
     | 
    
         
            +
                  end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  def #{new_name}=(v)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    self.#{old_name}
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                STR
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/applitools/eyes.rb
    CHANGED
    
    | 
         @@ -23,7 +23,9 @@ class Applitools::Eyes 
     | 
|
| 
       23 
23 
     | 
    
         
             
              DEFAULT_MATCH_TIMEOUT = 2.0.freeze # Seconds
         
     | 
| 
       24 
24 
     | 
    
         
             
              BASE_AGENT_ID = ('eyes.selenium.ruby/' + Applitools::VERSION).freeze
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
               
     | 
| 
      
 26 
     | 
    
         
            +
              ANDROID = 'Android'.freeze
         
     | 
| 
      
 27 
     | 
    
         
            +
              IOS = 'iOS'.freeze
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       27 
29 
     | 
    
         
             
              # Attributes:
         
     | 
| 
       28 
30 
     | 
    
         
             
              #
         
     | 
| 
       29 
31 
     | 
    
         
             
              # +app_name+:: +String+ The application name which was provided as an argument to +open+.
         
     | 
| 
         @@ -31,7 +33,8 @@ class Applitools::Eyes 
     | 
|
| 
       31 
33 
     | 
    
         
             
              # +is_open+:: +boolean+ Is there an open session.
         
     | 
| 
       32 
34 
     | 
    
         
             
              # +viewport_size+:: +Hash+ The viewport size which was provided as an argument to +open+. Should include +width+
         
     | 
| 
       33 
35 
     | 
    
         
             
              #   and +height+.
         
     | 
| 
       34 
     | 
    
         
            -
              # +driver+:: +Applitools::Selenium::Driver+ The driver instance wrapping the driver which was provided as an argument 
     | 
| 
      
 36 
     | 
    
         
            +
              # +driver+:: +Applitools::Selenium::Driver+ The driver instance wrapping the driver which was provided as an argument
         
     | 
| 
      
 37 
     | 
    
         
            +
              #   to +open+.
         
     | 
| 
       35 
38 
     | 
    
         
             
              # +api_key+:: +String+ The user's API key.
         
     | 
| 
       36 
39 
     | 
    
         
             
              # +match_timeout+:: +Float+ The default timeout for check_XXXX operations. (Seconds)
         
     | 
| 
       37 
40 
     | 
    
         
             
              # +batch+:: +BatchInfo+ The current tests grouping, if any.
         
     | 
| 
         @@ -41,8 +44,8 @@ class Applitools::Eyes 
     | 
|
| 
       41 
44 
     | 
    
         
             
              #   you wish to override Eyes' automatic inference.
         
     | 
| 
       42 
45 
     | 
    
         
             
              # +branch_name+:: +String+ If set, names the branch in which the test should run.
         
     | 
| 
       43 
46 
     | 
    
         
             
              # +parent_branch_name+:: +String+ If set, names the parent branch of the branch in which the test should run.
         
     | 
| 
       44 
     | 
    
         
            -
              # +user_inputs+:: +Applitools::Base::MouseTrigger+/+Applitools::Selenium::KeyboardTrigger+ Mouse/Keyboard events which 
     | 
| 
       45 
     | 
    
         
            -
              #   the last visual validation.
         
     | 
| 
      
 47 
     | 
    
         
            +
              # +user_inputs+:: +Applitools::Base::MouseTrigger+/+Applitools::Selenium::KeyboardTrigger+ Mouse/Keyboard events which
         
     | 
| 
      
 48 
     | 
    
         
            +
              #   happened after the last visual validation.
         
     | 
| 
       46 
49 
     | 
    
         
             
              # +save_new_tests+:: +boolean+ Whether or not new tests should be automatically accepted as baseline.
         
     | 
| 
       47 
50 
     | 
    
         
             
              # +save_failed_tests+:: +boolean+ Whether or not failed tests should be automatically accepted as baseline.
         
     | 
| 
       48 
51 
     | 
    
         
             
              # +match_level+:: +String+ The default match level for the entire session. See +Applitools::Eyes::MATCH_LEVEL+.
         
     | 
| 
         @@ -58,10 +61,14 @@ class Applitools::Eyes 
     | 
|
| 
       58 
61 
     | 
    
         
             
              # +rotation+:: +Integer+|+nil+ The degrees by which to rotate the screenshots received from the driver. Set this to
         
     | 
| 
       59 
62 
     | 
    
         
             
              #   override Eyes' automatic rotation inference. Positive values = clockwise rotation, negative
         
     | 
| 
       60 
63 
     | 
    
         
             
              #   values = counter-clockwise, 0 = force no rotation, +nil+ = use Eyes' automatic rotation inference.
         
     | 
| 
      
 64 
     | 
    
         
            +
              # +force_fullpage_screenshot+:: +boolean+ Whether or not to force fullpage screenshot taking, if the browser doesn't
         
     | 
| 
      
 65 
     | 
    
         
            +
              #   support it explicitly.
         
     | 
| 
      
 66 
     | 
    
         
            +
              # +hide_scrollbars+:: +boolean+ Whether or not hide scrollbars.
         
     | 
| 
      
 67 
     | 
    
         
            +
              # +use_css_transition+:: +boolean+ Whether or not to perform CSS transition.
         
     | 
| 
       61 
68 
     | 
    
         
             
              attr_reader :app_name, :test_name, :is_open, :viewport_size, :driver
         
     | 
| 
       62 
69 
     | 
    
         
             
              attr_accessor :match_timeout, :batch, :host_os, :host_app, :branch_name, :parent_branch_name, :user_inputs,
         
     | 
| 
       63 
70 
     | 
    
         
             
                :save_new_tests, :save_failed_tests, :is_disabled, :server_url, :agent_id, :failure_reports, :match_level,
         
     | 
| 
       64 
     | 
    
         
            -
                :baseline_name, :rotation
         
     | 
| 
      
 71 
     | 
    
         
            +
                :baseline_name, :rotation, :force_fullpage_screenshot, :hide_scrollbars, :use_css_transition
         
     | 
| 
       65 
72 
     | 
    
         | 
| 
       66 
73 
     | 
    
         
             
              def_delegators 'Applitools::EyesLogger', :log_handler, :log_handler=
         
     | 
| 
       67 
74 
     | 
    
         
             
              def_delegators 'Applitools::Base::ServerConnector', :api_key, :api_key=, :server_url, :server_url=
         
     | 
| 
         @@ -98,6 +105,9 @@ class Applitools::Eyes 
     | 
|
| 
       98 
105 
     | 
    
         
             
                @save_new_tests = true
         
     | 
| 
       99 
106 
     | 
    
         
             
                @save_failed_tests = false
         
     | 
| 
       100 
107 
     | 
    
         
             
                @dont_get_title = false
         
     | 
| 
      
 108 
     | 
    
         
            +
                @force_fullpage_screenshot = false
         
     | 
| 
      
 109 
     | 
    
         
            +
                @hide_scrollbars = false
         
     | 
| 
      
 110 
     | 
    
         
            +
                @use_css_transition = false
         
     | 
| 
       101 
111 
     | 
    
         
             
              end
         
     | 
| 
       102 
112 
     | 
    
         | 
| 
       103 
113 
     | 
    
         
             
              def open(options = {})
         
     | 
| 
         @@ -105,7 +115,7 @@ class Applitools::Eyes 
     | 
|
| 
       105 
115 
     | 
    
         
             
                return driver if disabled?
         
     | 
| 
       106 
116 
     | 
    
         | 
| 
       107 
117 
     | 
    
         
             
                if api_key.nil?
         
     | 
| 
       108 
     | 
    
         
            -
                  raise Applitools::EyesError.new( 
     | 
| 
      
 118 
     | 
    
         
            +
                  raise Applitools::EyesError.new('API key not set! Log in to https://applitools.com to obtain your API Key and '\
         
     | 
| 
       109 
119 
     | 
    
         
             
                    "use 'api_key' to set it.")
         
     | 
| 
       110 
120 
     | 
    
         
             
                end
         
     | 
| 
       111 
121 
     | 
    
         | 
| 
         @@ -180,7 +190,7 @@ class Applitools::Eyes 
     | 
|
| 
       180 
190 
     | 
    
         
             
                check_region_(Applitools::Base::Region::EMPTY, tag, specific_timeout)
         
     | 
| 
       181 
191 
     | 
    
         
             
              end
         
     | 
| 
       182 
192 
     | 
    
         | 
| 
       183 
     | 
    
         
            -
              def close(raise_ex=true)
         
     | 
| 
      
 193 
     | 
    
         
            +
              def close(raise_ex = true)
         
     | 
| 
       184 
194 
     | 
    
         
             
                return if disabled?
         
     | 
| 
       185 
195 
     | 
    
         
             
                @is_open = false
         
     | 
| 
       186 
196 
     | 
    
         | 
| 
         @@ -217,7 +227,7 @@ class Applitools::Eyes 
     | 
|
| 
       217 
227 
     | 
    
         
             
                  return results
         
     | 
| 
       218 
228 
     | 
    
         
             
                end
         
     | 
| 
       219 
229 
     | 
    
         | 
| 
       220 
     | 
    
         
            -
                unless results. 
     | 
| 
      
 230 
     | 
    
         
            +
                unless results.passed?
         
     | 
| 
       221 
231 
     | 
    
         
             
                  # Test failed
         
     | 
| 
       222 
232 
     | 
    
         
             
                  Applitools::EyesLogger.info "--- Failed test ended. See details at #{session_results_url}"
         
     | 
| 
       223 
233 
     | 
    
         | 
| 
         @@ -246,15 +256,13 @@ class Applitools::Eyes 
     | 
|
| 
       246 
256 
     | 
    
         
             
              #      get "http://www.google.com"
         
     | 
| 
       247 
257 
     | 
    
         
             
              #      check_window("initial")
         
     | 
| 
       248 
258 
     | 
    
         
             
              #    end
         
     | 
| 
       249 
     | 
    
         
            -
              #noinspection RubyUnusedLocalVariable
         
     | 
| 
       250 
     | 
    
         
            -
              def test(options = {}, & 
     | 
| 
       251 
     | 
    
         
            -
                 
     | 
| 
       252 
     | 
    
         
            -
             
     | 
| 
       253 
     | 
    
         
            -
             
     | 
| 
       254 
     | 
    
         
            -
             
     | 
| 
       255 
     | 
    
         
            -
                 
     | 
| 
       256 
     | 
    
         
            -
                  abort_if_not_closed
         
     | 
| 
       257 
     | 
    
         
            -
                end
         
     | 
| 
      
 259 
     | 
    
         
            +
              # noinspection RubyUnusedLocalVariable
         
     | 
| 
      
 260 
     | 
    
         
            +
              def test(options = {}, &_block)
         
     | 
| 
      
 261 
     | 
    
         
            +
                open(options)
         
     | 
| 
      
 262 
     | 
    
         
            +
                yield(driver)
         
     | 
| 
      
 263 
     | 
    
         
            +
                close
         
     | 
| 
      
 264 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 265 
     | 
    
         
            +
                abort_if_not_closed
         
     | 
| 
       258 
266 
     | 
    
         
             
              end
         
     | 
| 
       259 
267 
     | 
    
         | 
| 
       260 
268 
     | 
    
         
             
              def abort_if_not_closed
         
     | 
| 
         @@ -266,7 +274,7 @@ class Applitools::Eyes 
     | 
|
| 
       266 
274 
     | 
    
         | 
| 
       267 
275 
     | 
    
         
             
                begin
         
     | 
| 
       268 
276 
     | 
    
         
             
                  Applitools::Base::ServerConnector.stop_session(@session, true, false)
         
     | 
| 
       269 
     | 
    
         
            -
                rescue  
     | 
| 
      
 277 
     | 
    
         
            +
                rescue => e
         
     | 
| 
       270 
278 
     | 
    
         
             
                  Applitools::EyesLogger.error "Failed to abort server session: #{e.message}!"
         
     | 
| 
       271 
279 
     | 
    
         
             
                ensure
         
     | 
| 
       272 
280 
     | 
    
         
             
                  @session = nil
         
     | 
| 
         @@ -280,8 +288,8 @@ class Applitools::Eyes 
     | 
|
| 
       280 
288 
     | 
    
         
             
              end
         
     | 
| 
       281 
289 
     | 
    
         | 
| 
       282 
290 
     | 
    
         
             
              def get_driver(options)
         
     | 
| 
       283 
     | 
    
         
            -
                # TODO remove the "browser" related block when possible. It's for backward compatibility.
         
     | 
| 
       284 
     | 
    
         
            -
                if options. 
     | 
| 
      
 291 
     | 
    
         
            +
                # TODO: remove the "browser" related block when possible. It's for backward compatibility.
         
     | 
| 
      
 292 
     | 
    
         
            +
                if options.key?(:browser)
         
     | 
| 
       285 
293 
     | 
    
         
             
                  Applitools::EyesLogger.warn('"browser" key is deprecated, please use "driver" instead.')
         
     | 
| 
       286 
294 
     | 
    
         | 
| 
       287 
295 
     | 
    
         
             
                  return options[:browser]
         
     | 
| 
         @@ -308,10 +316,10 @@ class Applitools::Eyes 
     | 
|
| 
       308 
316 
     | 
    
         
             
                    Applitools::EyesLogger.info 'Mobile device detected! Checking device type..'
         
     | 
| 
       309 
317 
     | 
    
         
             
                    if driver.android?
         
     | 
| 
       310 
318 
     | 
    
         
             
                      Applitools::EyesLogger.info 'Android detected.'
         
     | 
| 
       311 
     | 
    
         
            -
                      platform_name =  
     | 
| 
      
 319 
     | 
    
         
            +
                      platform_name = ANDROID
         
     | 
| 
       312 
320 
     | 
    
         
             
                    elsif driver.ios?
         
     | 
| 
       313 
321 
     | 
    
         
             
                      Applitools::EyesLogger.info 'iOS detected.'
         
     | 
| 
       314 
     | 
    
         
            -
                      platform_name =  
     | 
| 
      
 322 
     | 
    
         
            +
                      platform_name = IOS
         
     | 
| 
       315 
323 
     | 
    
         
             
                    else
         
     | 
| 
       316 
324 
     | 
    
         
             
                      Applitools::EyesLogger.warn 'Unknown device type.'
         
     | 
| 
       317 
325 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -379,15 +387,15 @@ class Applitools::Eyes 
     | 
|
| 
       379 
387 
     | 
    
         
             
                as_expected = @match_window_task.match_window(region, specific_timeout, tag, rotation,
         
     | 
| 
       380 
388 
     | 
    
         
             
                  @should_match_window_run_once_on_timeout)
         
     | 
| 
       381 
389 
     | 
    
         
             
                Applitools::EyesLogger.debug 'Match window done!'
         
     | 
| 
       382 
     | 
    
         
            -
                 
     | 
| 
       383 
     | 
    
         
            -
             
     | 
| 
       384 
     | 
    
         
            -
             
     | 
| 
       385 
     | 
    
         
            -
             
     | 
| 
       386 
     | 
    
         
            -
             
     | 
| 
       387 
     | 
    
         
            -
             
     | 
| 
       388 
     | 
    
         
            -
             
     | 
| 
       389 
     | 
    
         
            -
             
     | 
| 
       390 
     | 
    
         
            -
             
     | 
| 
       391 
     | 
    
         
            -
             
     | 
| 
      
 390 
     | 
    
         
            +
                return if as_expected
         
     | 
| 
      
 391 
     | 
    
         
            +
             
     | 
| 
      
 392 
     | 
    
         
            +
                @should_match_window_run_once_on_timeout = true
         
     | 
| 
      
 393 
     | 
    
         
            +
                return if @session.new_session?
         
     | 
| 
      
 394 
     | 
    
         
            +
             
     | 
| 
      
 395 
     | 
    
         
            +
                Applitools::EyesLogger.info %( mismatch #{ tag ? '' : "(#{tag})" } )
         
     | 
| 
      
 396 
     | 
    
         
            +
                return unless failure_reports.to_i == Applitools::Eyes::FAILURE_REPORTS[:immediate]
         
     | 
| 
      
 397 
     | 
    
         
            +
             
     | 
| 
      
 398 
     | 
    
         
            +
                raise Applitools::TestFailedError.new("Mismatch found in '#{@session_start_info.scenario_id_or_name}' "\
         
     | 
| 
      
 399 
     | 
    
         
            +
                  "of '#{@session_start_info.app_id_or_name}'")
         
     | 
| 
       392 
400 
     | 
    
         
             
              end
         
     | 
| 
       393 
401 
     | 
    
         
             
            end
         
     |