Class: Applitools::Selenium::Element

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/applitools/selenium/element.rb

Constant Summary collapse

JS_GET_COMPUTED_STYLE_FORMATTED_STR =
<<-JS.freeze
   var elem = arguments[0];
   var styleProp = '%s';
   if (window.getComputedStyle) {
   return window.getComputedStyle(elem, null)
   .getPropertyValue(styleProp);
   } else if (elem.currentStyle) {
   return elem.currentStyle[styleProp];
   } else {
   return null;
   };
JS
JS_GET_SCROLL_LEFT =
'return arguments[0].scrollLeft;'.freeze
JS_GET_SCROLL_TOP =
'return arguments[0].scrollTop;'.freeze
JS_GET_SCROLL_WIDTH =
'return arguments[0].scrollWidth;'.freeze
JS_GET_SCROLL_HEIGHT =
'return arguments[0].scrollHeight;'.freeze
JS_SCROLL_TO_FORMATTED_STR =
<<-JS.freeze
  arguments[0].scrollLeft = %d;
  arguments[0].scrollTop = %d;
JS
JS_GET_OVERFLOW =
'return arguments[0].style.overflow;'.freeze
JS_SET_OVERFLOW_FORMATTED_STR =
"arguments[0].style.overflow = '%s'".freeze
TRACE_PREFIX =
'EyesWebElement'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(driver, element) ⇒ Element

Initialize class instance.

Parameters:



37
38
39
40
41
# File 'lib/applitools/selenium/element.rb', line 37

def initialize(driver, element)
  super(element)

  @driver = driver
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



59
60
61
62
63
64
65
# File 'lib/applitools/selenium/element.rb', line 59

def ==(other)
  if other.is_a? self.class
    super other.web_element
  else
    super other
  end
end

#border_bottom_widthObject



149
150
151
# File 'lib/applitools/selenium/element.rb', line 149

def border_bottom_width
  computed_style_integer(:'border-bottom-width')
end

#border_left_widthObject



137
138
139
# File 'lib/applitools/selenium/element.rb', line 137

def border_left_width
  computed_style_integer(:'border-left-width')
end

#border_right_widthObject



145
146
147
# File 'lib/applitools/selenium/element.rb', line 145

def border_right_width
  computed_style_integer(:'border-right-width')
end

#border_top_widthObject



141
142
143
# File 'lib/applitools/selenium/element.rb', line 141

def border_top_width
  computed_style_integer(:'border-top-width')
end

#boundsApplitools::Base::Region

Gets the bounds of the element.

Returns:

  • (Applitools::Base::Region)

    An instance of the region.



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/applitools/selenium/element.rb', line 84

def bounds
  point = location
  left = point.x
  top = point.y
  width = 0
  height = 0

  begin
    dimension = size
    width = dimension.width
    height = dimension.height
  rescue => e
    # Not supported on all platforms.
    Applitools::EyesLogger.error("Failed extracting size using JavaScript: (#{e.message})")
  end

  if left < 0
    width = [0, width + left].max
    left = 0
  end

  if top < 0
    height = [0, height + top].max
    top = 0
  end

  Applitools::Base::Region.new(left, top, width, height)
end

#clickObject



49
50
51
52
53
# File 'lib/applitools/selenium/element.rb', line 49

def click
  @driver.add_mouse_trigger(Applitools::MouseTrigger::MOUSE_ACTION[:click], self)
  # logger.info "click(#{bounds})";
  web_element.click
end

#computed_style(prop_style) ⇒ Object



129
130
131
# File 'lib/applitools/selenium/element.rb', line 129

def computed_style(prop_style)
  driver.execute_script(JS_GET_COMPUTED_STYLE_FORMATTED_STR % prop_style, self).to_s
end

#computed_style_integer(prop_style) ⇒ Object



133
134
135
# File 'lib/applitools/selenium/element.rb', line 133

def computed_style_integer(prop_style)
  computed_style(prop_style).gsub(/px/, '').to_i.round
end

#find_element(*args) ⇒ Object



113
114
115
# File 'lib/applitools/selenium/element.rb', line 113

def find_element(*args)
  self.class.new driver, super
end

#find_elements(*args) ⇒ Object



117
118
119
# File 'lib/applitools/selenium/element.rb', line 117

def find_elements(*args)
  super(*args).map { |e| self.class.new driver, e }
end

#inspectObject



55
56
57
# File 'lib/applitools/selenium/element.rb', line 55

def inspect
  TRACE_PREFIX + web_element.inspect
end

#overflowObject



121
122
123
# File 'lib/applitools/selenium/element.rb', line 121

def overflow
  driver.execute_script(JS_GET_OVERFLOW, __getobj__).to_s
end

#overflow=(overflow) ⇒ Object



125
126
127
# File 'lib/applitools/selenium/element.rb', line 125

def overflow=(overflow)
  driver.execute_script(JS_SET_OVERFLOW_FORMATTED_STR % overflow, self)
end

#padding_bottom_widthObject



165
166
167
# File 'lib/applitools/selenium/element.rb', line 165

def padding_bottom_width
  computed_style_integer(:'padding-bottom')
end

#padding_left_widthObject



153
154
155
# File 'lib/applitools/selenium/element.rb', line 153

def padding_left_width
  computed_style_integer(:'padding-left')
end

#padding_right_widthObject



157
158
159
# File 'lib/applitools/selenium/element.rb', line 157

def padding_right_width
  computed_style_integer(:'padding-right')
end

#padding_top_widthObject



161
162
163
# File 'lib/applitools/selenium/element.rb', line 161

def padding_top_width
  computed_style_integer(:'padding-top')
end

#scroll_heightObject



181
182
183
# File 'lib/applitools/selenium/element.rb', line 181

def scroll_height
  Integer driver.execute_script(JS_GET_SCROLL_HEIGHT, self).to_s
end

#scroll_leftObject



169
170
171
# File 'lib/applitools/selenium/element.rb', line 169

def scroll_left
  Integer driver.execute_script(JS_GET_SCROLL_LEFT, self).to_s
end

#scroll_to(location) ⇒ Object



185
186
187
# File 'lib/applitools/selenium/element.rb', line 185

def scroll_to(location)
  driver.execute_script format(JS_SCROLL_TO_FORMATTED_STR, location.x, location.y), self
end

#scroll_topObject



173
174
175
# File 'lib/applitools/selenium/element.rb', line 173

def scroll_top
  Integer driver.execute_script(JS_GET_SCROLL_TOP, self).to_s
end

#scroll_widthObject



177
178
179
# File 'lib/applitools/selenium/element.rb', line 177

def scroll_width
  Integer driver.execute_script(JS_GET_SCROLL_WIDTH, self).to_s
end

#send_keys(*args) ⇒ Object Also known as: send_key

Types content into text box.

Parameters:

  • *args (Array)

    The arguments.



73
74
75
76
77
78
# File 'lib/applitools/selenium/element.rb', line 73

def send_keys(*args)
  Selenium::WebDriver::Keys.encode(args).each do |key|
    @driver.add_text_trigger(self, key.to_s)
  end
  web_element.send_keys(*args)
end

#to_hashObject



189
190
191
192
193
194
195
196
# File 'lib/applitools/selenium/element.rb', line 189

def to_hash
  {
    left: location.x.to_i,
    top: location.y.to_i,
    width: size.width.to_i,
    height: size.height.to_i
  }
end