Class: Applitools::ViewportSize

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

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.



25
26
27
28
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 25

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

Instance Attribute Details

#dimensionObject

Returns the value of attribute dimension.



24
25
26
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 24

def dimension
  @dimension
end

#driverObject (readonly)

Returns the value of attribute driver.



23
24
25
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 23

def driver
  @driver
end

Instance Method Details

#browser_sizeObject



93
94
95
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 93

def browser_size
  driver.manage.window.size
end

#browser_size=(other) ⇒ Object



97
98
99
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 97

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

#extract_viewport_from_browserObject Also known as: viewport_size



54
55
56
57
58
59
60
61
62
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 54

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

#extract_viewport_from_browser!Object



50
51
52
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 50

def extract_viewport_from_browser!
  self.dimension = extract_viewport_from_browser
end

#extract_viewport_heightObject



40
41
42
43
44
45
46
47
48
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 40

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



30
31
32
33
34
35
36
37
38
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 30

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



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 65

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 = Applitools::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



101
102
103
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 101

def to_hash
  Hash[dimension.each_pair.to_a]
end

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



83
84
85
86
87
88
89
90
91
# File 'lib/eyes_selenium_ruby/eyes/viewport_size.rb', line 83

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 #{dimension.values}")
  raise Applitools::TestFailedError.new(err_msg)
end