Class: Akephalos::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/akephalos/node.rb

Overview

Akephalos::Node wraps HtmlUnit’s DOMNode class, providing a simple API for interacting with an element on the page.

Instance Method Summary collapse

Constructor Details

#initialize(node) ⇒ Node

Returns a new instance of Node.

Parameters:

  • node (HtmlUnit::DOMNode)


7
8
9
10
# File 'lib/akephalos/node.rb', line 7

def initialize(node)
  @nodes = []
  @_node = node
end

Instance Method Details

#[](name) ⇒ String?

Return the value of the node’s attribute.

Parameters:

  • name (String)

    attribute on node

Returns:

  • (String)

    the value of the named attribute

  • (nil)

    when the node does not have the named attribute



31
32
33
# File 'lib/akephalos/node.rb', line 31

def [](name)
  @_node.hasAttribute(name.to_s) ? @_node.getAttribute(name.to_s) : nil
end

#checked?true, false

Returns whether the element is checked.

Returns:

  • (true, false)

    whether the element is checked



13
14
15
16
17
18
19
# File 'lib/akephalos/node.rb', line 13

def checked?
  if @_node.respond_to?(:isChecked)
    @_node.isChecked
  else
    !! self[:checked]
  end
end

#clickObject

Click the node and then wait for any triggered JavaScript callbacks to fire.



150
151
152
153
154
# File 'lib/akephalos/node.rb', line 150

def click
  @_node.click
  @_node.getPage.getEnclosingWindow.getJobManager.waitForJobs(1000)
  @_node.getPage.getEnclosingWindow.getJobManager.waitForJobsStartingBefore(1000)
end

#file_input?true, false

Returns whether the node is a file input.

Returns:

  • (true, false)

    whether the node is a file input



91
92
93
# File 'lib/akephalos/node.rb', line 91

def file_input?
  tag_name == "input" && @_node.getAttribute("type") == "file"
end

#find(selector) ⇒ Array<Node>

Search for child nodes which match the given XPath selector.

Parameters:

  • selector (String)

    an XPath selector

Returns:

  • (Array<Node>)

    the matched nodes



160
161
162
163
164
# File 'lib/akephalos/node.rb', line 160

def find(selector)
  nodes = @_node.getByXPath(selector).map { |node| Node.new(node) }
  @nodes << nodes
  nodes
end

#fire_event(name) ⇒ Object

Fire a JavaScript event on the current node. Note that you should not prefix event names with “on”, so:

link.fire_event('mousedown')

Parameters:

  • JavaScript (String)

    event name



123
124
125
# File 'lib/akephalos/node.rb', line 123

def fire_event(name)
  @_node.fireEvent(name)
end

#multiple_select?true, false

Returns whether the node allows multiple-option selection (if the node is a select).

Returns:

  • (true, false)

    whether the node allows multiple-option selection (if the node is a select).



86
87
88
# File 'lib/akephalos/node.rb', line 86

def multiple_select?
  !self[:multiple].nil?
end

#optionsArray<Node>

Return the option elements for a select box.

Returns:

  • (Array<Node>)

    the options



106
107
108
# File 'lib/akephalos/node.rb', line 106

def options
  @_node.getOptions.map { |node| Node.new(node) }
end

#selected?true, false

for CSS.

Returns:

  • (true, false)

    whether the node is selected to the user accounting



140
141
142
143
144
145
146
# File 'lib/akephalos/node.rb', line 140

def selected?
  if @_node.respond_to?(:isSelected)
    @_node.isSelected
  else
    !! self[:selected]
  end
end

#selected_optionsArray<Node>

Return the selected option elements for a select box.

Returns:

  • (Array<Node>)

    the selected options



113
114
115
# File 'lib/akephalos/node.rb', line 113

def selected_options
  @_node.getSelectedOptions.map { |node| Node.new(node) }
end

#tag_nameString

Returns the node’s tag name.

Returns:

  • (String)

    the node’s tag name



128
129
130
# File 'lib/akephalos/node.rb', line 128

def tag_name
  @_node.getNodeName
end

#textString

Returns inner text of the node.

Returns:

  • (String)

    inner text of the node



22
23
24
# File 'lib/akephalos/node.rb', line 22

def text
  @_node.asText
end

#type(value) ⇒ Object

Types each character into a text or input field.

Parameters:

  • value (String)

    the string to type



79
80
81
82
83
# File 'lib/akephalos/node.rb', line 79

def type(value)
  value.each_char do |c|
    @_node.type(c)
  end
end

#unselecttrue, false

Unselect an option.

Returns:

  • (true, false)

    whether the unselection was successful



99
100
101
# File 'lib/akephalos/node.rb', line 99

def unselect
  @_node.setSelected(false)
end

#valueString+

Return the value of a form element. If the element is a select box and has “multiple” declared as an attribute, then all selected options will be returned as an array.

Returns:

  • (String, Array<String>)

    the node’s value



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/akephalos/node.rb', line 40

def value
  case tag_name
  when "select"
    if self[:multiple]
      selected_options.map { |option| option.value }
    else
      selected_option = @_node.selected_options.first
      selected_option ? Node.new(selected_option).value : nil
    end
  when "option"
    self[:value] || text
  when "textarea"
    @_node.getText
  else
    self[:value]
  end
end

#value=(value) ⇒ Object

Set the value of the form input.

Parameters:

  • value (String)


61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/akephalos/node.rb', line 61

def value=(value)
  case tag_name
  when "textarea"
    @_node.setText("")
    type(value)
  when "input"
    if file_input?
      @_node.setValueAttribute(value)
    else
      @_node.setValueAttribute("")
      type(value)
    end
  end
end

#visible?true, false

for CSS.

Returns:

  • (true, false)

    whether the node is visible to the user accounting



134
135
136
# File 'lib/akephalos/node.rb', line 134

def visible?
  @_node.isDisplayed
end

#xpathString

Returns the XPath expression for this node.

Returns:

  • (String)

    the XPath expression for this node



167
168
169
# File 'lib/akephalos/node.rb', line 167

def xpath
  @_node.getCanonicalXPath
end