Class: Watir::Element
- Inherits:
-
Object
- Object
- Watir::Element
- Extended by:
- AttributeHelper
- Includes:
- Container, EventuallyPresent, Exception
- Defined in:
- lib/watir-webdriver/elements/element.rb,
lib/watir-webdriver/extensions/select_text.rb
Overview
Base class for HTML elements.
Direct Known Subclasses
Constant Summary
Constants included from Atoms
Instance Method Summary collapse
-
#==(other) ⇒ Object
(also: #eql?)
Returns true if two elements are equal.
-
#attribute_value(attribute_name) ⇒ String?
Returns given attribute value of element.
-
#browser ⇒ Watir::Browser
Returns browser.
-
#class_name ⇒ String
Value of className property.
-
#click(*modifiers) ⇒ Object
Clicks the element, optionally while pressing the given modifier keys.
-
#double_click ⇒ Object
Double clicks the element.
-
#drag_and_drop_by(right_by, down_by) ⇒ Object
Drag and drop this element by the given offsets.
-
#drag_and_drop_on(other) ⇒ Object
Drag and drop this element on to another element instance.
- #driver ⇒ Object private
-
#exists? ⇒ Boolean
(also: #exist?)
Returns true if element exists.
-
#fire_event(event_name) ⇒ Object
Simulates JavaScript events on element.
-
#flash ⇒ Object
Flashes (change background color far a moment) element.
-
#focus ⇒ Object
Focuses element.
-
#focused? ⇒ Boolean
Returns true if this element is focused.
- #hash ⇒ Object
-
#hover ⇒ Object
Moves the mouse to the middle of this element.
-
#id ⇒ String
temporarily add :id and :class_name manually since they’re no longer specified in the HTML spec.
-
#initialize(parent, selector) ⇒ Element
constructor
A new instance of Element.
-
#inner_html ⇒ String
Returns inner HTML code of element.
- #inspect ⇒ Object
-
#outer_html ⇒ String
(also: #html)
Returns outer (inner + element itself) HTML code of element.
-
#parent ⇒ Object
Returns parent element of current element.
-
#present? ⇒ Boolean
Returns true if the element exists and is visible on the page.
-
#right_click ⇒ Object
Right clicks the element.
-
#run_checkers ⇒ Object
Runs checkers.
- #select_text(str) ⇒ Object
-
#send_keys(*args) ⇒ Object
Sends sequence of keystrokes to element.
-
#style(property = nil) ⇒ String
Returns given style property of this element.
-
#tag_name ⇒ String
Returns tag name of the element.
-
#text ⇒ String
Returns the text of the element.
-
#to_subtype ⇒ Object
Cast this Element instance to a more specific subtype.
-
#value ⇒ String
Returns value of the element.
-
#visible? ⇒ Boolean
Returns true if this element is visible on the page.
- #wd ⇒ Object private
Methods included from AttributeHelper
attribute, attribute_list, inherit_attributes_from, method, typed_attributes
Methods included from EventuallyPresent
#wait_until_present, #wait_while_present, #when_present
Methods included from Container
#a, #abbr, #abbrs, #address, #addresses, #area, #areas, #article, #articles, #as, #aside, #asides, #audio, #audios, #b, #base, #bases, #bdi, #bdis, #bdo, #bdos, #blockquote, #blockquotes, #body, #bodys, #br, #brs, #bs, #button, #buttons, #canvas, #canvases, #caption, #captions, #checkbox, #checkboxes, #cite, #cites, #code, #codes, #col, #colgroup, #colgroups, #cols, #data, #datalist, #datalists, #datas, #dd, #dds, #del, #dels, #details, #detailses, #dfn, #dfns, #dialog, #dialogs, #div, #divs, #dl, #dls, #dt, #dts, #element, #elements, #em, #embed, #embeds, #ems, #extract_selector, #field_set, #field_sets, #fieldset, #fieldsets, #figcaption, #figcaptions, #figure, #figures, #file_field, #file_fields, #font, #fonts, #footer, #footers, #form, #forms, #frame, #frames, #frameset, #framesets, #h1, #h1s, #h2, #h2s, #h3, #h3s, #h4, #h4s, #h5, #h5s, #h6, #h6s, #head, #header, #headers, #heads, #hgroup, #hgroups, #hidden, #hiddens, #hr, #hrs, #htmls, #i, #iframe, #iframes, #image, #images, #img, #imgs, #input, #inputs, #ins, #inses, #is, #kbd, #kbds, #keygen, #keygens, #label, #labels, #legend, #legends, #li, #link, #links, #lis, #main, #mains, #map, #maps, #mark, #marks, #menu, #menuitem, #menuitems, #menus, #meta, #metas, #meter, #meters, #nav, #navs, #noscript, #noscripts, #object, #objects, #ol, #ols, #optgroup, #optgroups, #option, #options, #output, #outputs, #p, #param, #params, #pre, #pres, #progress, #progresses, #ps, #q, #qs, #radio, #radios, #rp, #rps, #rt, #rts, #rubies, #ruby, #s, #samp, #samps, #script, #scripts, #section, #sections, #select, #select_list, #select_lists, #selects, #small, #smalls, #source, #sources, #span, #spans, #ss, #strong, #strongs, #styles, #sub, #subs, #summaries, #summary, #sup, #sups, #table, #tables, #tbody, #tbodys, #td, #tds, #template, #templates, #text_field, #text_fields, #textarea, #textareas, #tfoot, #tfoots, #th, #thead, #theads, #ths, #time, #times, #title, #titles, #tr, #track, #tracks, #trs, #u, #ul, #uls, #us, #var, #vars, #video, #videos, #wbr, #wbrs
Methods included from Atoms
Methods included from XpathSupport
Constructor Details
#initialize(parent, selector) ⇒ Element
Returns a new instance of Element.
27 28 29 30 31 32 33 34 35 |
# File 'lib/watir-webdriver/elements/element.rb', line 27 def initialize(parent, selector) @parent = parent @selector = selector @element = nil unless @selector.kind_of? Hash raise ArgumentError, "invalid argument: #{selector.inspect}" end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args, &blk) ⇒ Object (private)
582 583 584 585 586 587 588 589 |
# File 'lib/watir-webdriver/elements/element.rb', line 582 def method_missing(meth, *args, &blk) method = meth.to_s if method =~ ElementLocator::WILDCARD_ATTRIBUTE attribute_value(method.gsub(/_/, '-'), *args) else super end end |
Instance Method Details
#==(other) ⇒ Object Also known as: eql?
Returns true if two elements are equal.
67 68 69 |
# File 'lib/watir-webdriver/elements/element.rb', line 67 def ==(other) other.kind_of?(self.class) && wd == other.wd end |
#attribute_value(attribute_name) ⇒ String?
Returns given attribute value of element.
272 273 274 275 |
# File 'lib/watir-webdriver/elements/element.rb', line 272 def attribute_value(attribute_name) assert_exists element_call { @element.attribute attribute_name } end |
#browser ⇒ Watir::Browser
Returns browser.
491 492 493 |
# File 'lib/watir-webdriver/elements/element.rb', line 491 def browser @parent.browser end |
#class_name ⇒ String
Returns value of className property.
25 |
# File 'lib/watir-webdriver/elements/element.rb', line 25 attribute String, :class_name, :className |
#click(*modifiers) ⇒ Object
Clicks the element, optionally while pressing the given modifier keys. Note that support for holding a modifier key is currently experimental, and may not work at all.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/watir-webdriver/elements/element.rb', line 115 def click(*modifiers) assert_exists assert_enabled element_call do if modifiers.any? assert_has_input_devices_for "click(#{modifiers.join ', '})" action = driver.action modifiers.each { |mod| action.key_down mod } action.click @element modifiers.each { |mod| action.key_up mod } action.perform else @element.click end end run_checkers end |
#double_click ⇒ Object
Double clicks the element. Note that browser support may vary.
145 146 147 148 149 150 151 |
# File 'lib/watir-webdriver/elements/element.rb', line 145 def double_click assert_exists assert_has_input_devices_for :double_click element_call { driver.action.double_click(@element).perform } run_checkers end |
#drag_and_drop_by(right_by, down_by) ⇒ Object
Drag and drop this element by the given offsets. Note that browser support may vary.
217 218 219 220 221 222 223 224 225 226 |
# File 'lib/watir-webdriver/elements/element.rb', line 217 def drag_and_drop_by(right_by, down_by) assert_exists assert_has_input_devices_for :drag_and_drop_by element_call do driver.action. drag_and_drop_by(@element, right_by, down_by). perform end end |
#drag_and_drop_on(other) ⇒ Object
Drag and drop this element on to another element instance. Note that browser support may vary.
194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/watir-webdriver/elements/element.rb', line 194 def drag_and_drop_on(other) assert_is_element other assert_exists assert_has_input_devices_for :drag_and_drop_on element_call do driver.action. drag_and_drop(@element, other.wd). perform end end |
#driver ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
384 385 386 |
# File 'lib/watir-webdriver/elements/element.rb', line 384 def driver @parent.driver end |
#exists? ⇒ Boolean Also known as: exist?
Returns true if element exists.
43 44 45 46 47 48 |
# File 'lib/watir-webdriver/elements/element.rb', line 43 def exists? assert_exists true rescue UnknownObjectException, UnknownFrameException false end |
#fire_event(event_name) ⇒ Object
Simulates JavaScript events on element. Note that you may omit “on” from event name.
359 360 361 362 363 364 |
# File 'lib/watir-webdriver/elements/element.rb', line 359 def fire_event(event_name) assert_exists event_name = event_name.to_s.sub(/^on/, '').downcase element_call { execute_atom :fireEvent, @element, event_name } end |
#flash ⇒ Object
Flashes (change background color far a moment) element.
235 236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/watir-webdriver/elements/element.rb', line 235 def flash background_color = style("backgroundColor") element_color = driver.execute_script("arguments[0].style.backgroundColor", @element) 10.times do |n| color = (n % 2 == 0) ? "red" : background_color driver.execute_script("arguments[0].style.backgroundColor = '#{color}'", @element) end driver.execute_script("arguments[0].style.backgroundColor = arguments[1]", @element, element_color) self end |
#focus ⇒ Object
Focuses element. Note that Firefox queues focus events until the window actually has focus.
331 332 333 334 |
# File 'lib/watir-webdriver/elements/element.rb', line 331 def focus assert_exists element_call { driver.execute_script "return arguments[0].focus()", @element } end |
#focused? ⇒ Boolean
Returns true if this element is focused.
342 343 344 345 |
# File 'lib/watir-webdriver/elements/element.rb', line 342 def focused? assert_exists element_call { @element == driver.switch_to.active_element } end |
#hash ⇒ Object
72 73 74 |
# File 'lib/watir-webdriver/elements/element.rb', line 72 def hash @element ? @element.hash : super end |
#hover ⇒ Object
Moves the mouse to the middle of this element. Note that browser support may vary.
177 178 179 180 181 182 |
# File 'lib/watir-webdriver/elements/element.rb', line 177 def hover assert_exists assert_has_input_devices_for :hover element_call { driver.action.move_to(@element).perform } end |
#id ⇒ String
temporarily add :id and :class_name manually since they’re no longer specified in the HTML spec.
TODO: use IDL from DOM core - dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html
24 |
# File 'lib/watir-webdriver/elements/element.rb', line 24 attribute String, :id, :id |
#inner_html ⇒ String
Returns inner HTML code of element.
304 305 306 307 |
# File 'lib/watir-webdriver/elements/element.rb', line 304 def inner_html assert_exists element_call { execute_atom(:getInnerHtml, @element) }.strip end |
#inspect ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/watir-webdriver/elements/element.rb', line 51 def inspect if @selector.has_key?(:element) '#<%s:0x%x located=%s selector=%s>' % [self.class, hash*2, !!@element, '{:element=>(webdriver element)}'] else '#<%s:0x%x located=%s selector=%s>' % [self.class, hash*2, !!@element, selector_string] end end |
#outer_html ⇒ String Also known as: html
Returns outer (inner + element itself) HTML code of element.
287 288 289 290 |
# File 'lib/watir-webdriver/elements/element.rb', line 287 def outer_html assert_exists element_call { execute_atom(:getOuterHtml, @element) }.strip end |
#parent ⇒ Object
Returns parent element of current element.
370 371 372 373 374 375 376 377 378 |
# File 'lib/watir-webdriver/elements/element.rb', line 370 def parent assert_exists e = element_call { execute_atom :getParentElement, @element } if e.kind_of?(Selenium::WebDriver::Element) Watir.element_class_for(e.tag_name.downcase).new(@parent, :element => e) end end |
#present? ⇒ Boolean
Returns true if the element exists and is visible on the page.
415 416 417 418 419 420 421 |
# File 'lib/watir-webdriver/elements/element.rb', line 415 def present? exists? && visible? rescue Selenium::WebDriver::Error::StaleElementReferenceError, UnknownObjectException # if the element disappears between the exists? and visible? calls, # consider it not present. false end |
#right_click ⇒ Object
Right clicks the element. Note that browser support may vary.
161 162 163 164 165 166 167 |
# File 'lib/watir-webdriver/elements/element.rb', line 161 def right_click assert_exists assert_has_input_devices_for :right_click element_call { driver.action.context_click(@element).perform } run_checkers end |
#run_checkers ⇒ Object
Runs checkers.
447 448 449 |
# File 'lib/watir-webdriver/elements/element.rb', line 447 def run_checkers @parent.run_checkers end |
#select_text(str) ⇒ Object
5 6 7 8 |
# File 'lib/watir-webdriver/extensions/select_text.rb', line 5 def select_text(str) assert_exists execute_atom :selectText, @element, str end |
#send_keys(*args) ⇒ Object
Sends sequence of keystrokes to element.
318 319 320 321 322 |
# File 'lib/watir-webdriver/elements/element.rb', line 318 def send_keys(*args) assert_exists assert_writable element_call { @element.send_keys(*args) } end |
#style(property = nil) ⇒ String
Returns given style property of this element.
434 435 436 437 438 439 440 441 |
# File 'lib/watir-webdriver/elements/element.rb', line 434 def style(property = nil) if property assert_exists element_call { @element.style property } else attribute_value("style").to_s.strip end end |
#tag_name ⇒ String
Returns tag name of the element.
93 94 95 96 |
# File 'lib/watir-webdriver/elements/element.rb', line 93 def tag_name assert_exists element_call { @element.tag_name.downcase } end |
#text ⇒ String
Returns the text of the element.
82 83 84 85 |
# File 'lib/watir-webdriver/elements/element.rb', line 82 def text assert_exists element_call { @element.text } end |
#to_subtype ⇒ Object
Cast this Element instance to a more specific subtype.
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 |
# File 'lib/watir-webdriver/elements/element.rb', line 459 def to_subtype elem = wd() tag_name = elem.tag_name.downcase klass = nil if tag_name == "input" klass = case elem.attribute(:type) when *Button::VALID_TYPES Button when 'checkbox' CheckBox when 'radio' Radio when 'file' FileField else TextField end else klass = Watir.element_class_for(tag_name) end klass.new(@parent, :element => elem) end |
#value ⇒ String
Returns value of the element.
255 256 257 258 259 |
# File 'lib/watir-webdriver/elements/element.rb', line 255 def value attribute_value('value') || '' rescue Selenium::WebDriver::Error::InvalidElementStateError '' end |
#visible? ⇒ Boolean
Returns true if this element is visible on the page.
403 404 405 406 |
# File 'lib/watir-webdriver/elements/element.rb', line 403 def visible? assert_exists element_call { @element.displayed? } end |
#wd ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
392 393 394 395 |
# File 'lib/watir-webdriver/elements/element.rb', line 392 def wd assert_exists @element end |