Class: Applitools::ViewportSize

Inherits:
Object
  • Object
show all
Defined in:
lib/eyes_selenium_ruby/eyes/viewport_size.rb

Defined Under Namespace

Classes: Dimension

Constant Summary collapse

GET_VIEWPORT_HEIGHT_JAVASCRIPT_FOR_NORMAL_BROWSER =
"return window.innerHeight"
GET_VIEWPORT_WIDTH_JAVASCRIPT_FOR_NORMAL_BROWSER =
"return window.innerWidth"
DOCUMENT_CLEAR_SCROLL_BARS_JAVASCRIPT =
"var doc = document.documentElement;" +
"var previousOverflow = doc.style.overflow;"
DOCUMENT_RESET_SCROLL_BARS_JAVASCRIPT =
"doc.style.overflow = previousOverflow;"
DOCUMENT_RETURN_JAVASCRIPT =
"return __applitools_result;"
GET_VIEWPORT_WIDTH_JAVASCRIPT_FOR_BAD_BROWSERS =
DOCUMENT_CLEAR_SCROLL_BARS_JAVASCRIPT        +
"var __applitools_result = doc.clientWidth;" +
DOCUMENT_RESET_SCROLL_BARS_JAVASCRIPT        +
DOCUMENT_RETURN_JAVASCRIPT
GET_VIEWPORT_HEIGHT_JAVASCRIPT_FOR_BAD_BROWSERS =
DOCUMENT_CLEAR_SCROLL_BARS_JAVASCRIPT         +
"var __applitools_result = doc.clientHeight;" +
DOCUMENT_RESET_SCROLL_BARS_JAVASCRIPT         +
DOCUMENT_RETURN_JAVASCRIPT

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(driver, dimension = nil) ⇒ ViewportSize

Returns a new instance of ViewportSize.



30
31
32
33
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 30

def initialize(driver, dimension=nil)
  @driver = driver
  @dimension = dimension
end

Instance Attribute Details

#dimensionObject

Returns the value of attribute dimension.



29
30
31
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 29

def dimension
  @dimension
end

#driverObject (readonly)

Returns the value of attribute driver.



28
29
30
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 28

def driver
  @driver
end

Instance Method Details

#browser_sizeObject



99
100
101
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 99

def browser_size
  driver.manage.window.size
end

#browser_size=(other) ⇒ Object



103
104
105
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 103

def browser_size=(other)
  self.driver.manage.window.size = other
end

#extract_viewport_from_browserObject Also known as: viewport_size



59
60
61
62
63
64
65
66
67
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 59

def extract_viewport_from_browser
  width  = extract_viewport_width 
  height = extract_viewport_height
  Dimension.new(width,height)
rescue => e
  EyesLogger.info "getViewportSize(): only window size is available (#{e.message})"
  width, height = *browser_size.values
  Dimension.new(width,height)
end

#extract_viewport_from_browser!Object



55
56
57
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 55

def extract_viewport_from_browser!
  self.dimension = extract_viewport_from_browser
end

#extract_viewport_heightObject



45
46
47
48
49
50
51
52
53
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 45

def extract_viewport_height
   begin
     return driver.execute_script(GET_VIEWPORT_HEIGHT_JAVASCRIPT_FOR_NORMAL_BROWSER)
   rescue  => e 
     EyesLogger.info "getViewportSize(): Browser does not support innerHeight (#{e.message})"
   end

  driver.execute_script(GET_VIEWPORT_WIDTH_JAVASCRIPT_FOR_BAD_BROWSERS)
end

#extract_viewport_widthObject



35
36
37
38
39
40
41
42
43
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 35

def extract_viewport_width
   begin
     return driver.execute_script(GET_VIEWPORT_WIDTH_JAVASCRIPT_FOR_NORMAL_BROWSER)
   rescue => e 
     EyesLogger.info "getViewportSize(): Browser does not support innerWidth (#{e.message})"
   end

  driver.execute_script(GET_VIEWPORT_WIDTH_JAVASCRIPT_FOR_BAD_BROWSERS)
end

#setObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 70

def set
  if dimension.is_a?(Hash) && dimension.has_key?(:width) && dimension.has_key?(:height)
    # If dimension is hash of width/height, we convert it to a struct with width/height properties.
    self.dimension = Struct.new(:width, :height).new(dimension[:width], dimension[:height])
  elsif !dimension.respond_to?(:width) || !dimension.respond_to?(:height)
    raise ArgumentError, "expected #{dimension.inspect}:#{dimension.class}" +
                         " to respond to #width and #height, or be a hash with these keys"
  end
  self.browser_size = dimension
  verify_size(:browser_size)
  cur_viewport_size = extract_viewport_from_browser
  self.browser_size = Dimension.new(
                        (2 * browser_size.width) - cur_viewport_size.width,
                        (2 * browser_size.height) - cur_viewport_size.height
                      )
  verify_size(:viewport_size)
end

#to_hashObject



107
108
109
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 107

def to_hash
  Hash[dimension.each_pair.to_a]
end

#verify_size(to_verify, sleep_time = 1, retries = 3) ⇒ Object



88
89
90
91
92
93
94
95
96
97
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 88

def verify_size(to_verify, sleep_time=1, retries=3)
  retries.times do
    sleep(sleep_time) 
    cur_size = send(to_verify)
    return if cur_size.values == dimension.values
  end

  EyesLogger.info(err_msg = "Failed setting #{to_verify} to #{required_dimensions.values}")
  raise Applitools::TestFailedError.new(err_msg)
end