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
JS_SET_SCROLL_DATA_FORMATTED_STR =
"arguments[0].setAttribute('data-applitools-scroll', '%s')".freeze
JS_SET_OVERFLOW_DATA_FORMATTED_STR =
"arguments[0].setAttribute('data-applitools-original-overflow', '%s')".freeze
TRACE_PREFIX =
'EyesWebElement'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(driver, element) ⇒ Element

Initialize class instance.

Parameters:



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

def initialize(driver, element)
  super(element)

  @driver = driver
end

Instance Method Details

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



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

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

#border_bottom_widthObject



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

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

#border_left_widthObject



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

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

#border_right_widthObject



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

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

#border_top_widthObject



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

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.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/applitools/selenium/element.rb', line 96

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::Region.new(left, top, width, height)
end

#clickObject



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

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



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

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



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

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

#find_element(*args) ⇒ Object



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

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

#find_elements(*args) ⇒ Object



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

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

#inspectObject



68
69
70
# File 'lib/applitools/selenium/element.rb', line 68

def inspect
  TRACE_PREFIX + web_element.inspect
end

#overflowObject



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

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

#overflow=(overflow) ⇒ Object



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

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

#overflow_data_attribute=(value) ⇒ Object



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

def overflow_data_attribute=(value)
  driver.execute_script(JS_SET_OVERFLOW_DATA_FORMATTED_STR % value, self)
end

#padding_bottom_widthObject



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

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

#padding_left_widthObject



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

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

#padding_right_widthObject



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

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

#padding_top_widthObject



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

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

#scroll_data_attribute=(value) ⇒ Object



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

def scroll_data_attribute=(value)
  driver.execute_script(JS_SET_SCROLL_DATA_FORMATTED_STR % value, self)
end

#scroll_heightObject



201
202
203
# File 'lib/applitools/selenium/element.rb', line 201

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

#scroll_leftObject



189
190
191
# File 'lib/applitools/selenium/element.rb', line 189

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

#scroll_to(location) ⇒ Object



205
206
207
# File 'lib/applitools/selenium/element.rb', line 205

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

#scroll_topObject



193
194
195
# File 'lib/applitools/selenium/element.rb', line 193

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

#scroll_widthObject



197
198
199
# File 'lib/applitools/selenium/element.rb', line 197

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

#send_keys(keys) ⇒ Object Also known as: send_key

Types content into text box.

Parameters:

  • keys (Array, String)

    The content to type.



85
86
87
88
89
90
# File 'lib/applitools/selenium/element.rb', line 85

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



209
210
211
212
213
214
215
216
# File 'lib/applitools/selenium/element.rb', line 209

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