Class: WatirDrops::PageObject

Inherits:
Object
  • Object
show all
Includes:
Watir::Waitable
Defined in:
lib/watir_drops/page_object.rb

Direct Known Subclasses

TrainingWheels

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(browser_input = @@browser) ⇒ PageObject

Returns a new instance of PageObject.



100
101
102
# File 'lib/watir_drops/page_object.rb', line 100

def initialize(browser_input = @@browser)
  @browser = browser_input
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



151
152
153
154
155
156
157
# File 'lib/watir_drops/page_object.rb', line 151

def method_missing(method, *args, &block)
  if @browser.respond_to?(method) && method != :page_url
    @browser.send(method, *args, &block)
  else
    super
  end
end

Class Attribute Details

.element_listObject



26
27
28
# File 'lib/watir_drops/page_object.rb', line 26

def element_list
  @element_list ||= []
end

.require_urlObject (readonly)

Returns the value of attribute require_url.



9
10
11
# File 'lib/watir_drops/page_object.rb', line 9

def require_url
  @require_url
end

.required_element_listObject



30
31
32
# File 'lib/watir_drops/page_object.rb', line 30

def required_element_list
  @required_element_list ||= []
end

Instance Attribute Details

#browserObject (readonly)

Returns the value of attribute browser.



98
99
100
# File 'lib/watir_drops/page_object.rb', line 98

def browser
  @browser
end

Class Method Details

.browserObject



92
93
94
# File 'lib/watir_drops/page_object.rb', line 92

def browser
  @@browser
end

.browser=(browser_input) ⇒ Object



88
89
90
# File 'lib/watir_drops/page_object.rb', line 88

def browser=(browser_input)
  @@browser = browser_input
end

.element(name, required: false, &block) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/watir_drops/page_object.rb', line 47

def element(name, required: false, &block)
  define_method(name) do |*args|
    self.instance_exec(*args, &block)
  end

  define_method("#{name}=") do |val|
    watir_element = self.instance_exec &block
    case watir_element
    when Watir::Radio
      watir_element.set if val
    when Watir::CheckBox
      val ? watir_element.set : watir_element.clear
    when Watir::Select
      watir_element.select val
    when Watir::Button
      watir_element.click
    when Watir::TextField, Watir::TextArea
      watir_element.set val if val
    else
      watir_element.click if val
    end
  end
  element_list << name.to_sym
  required_element_list << name.to_sym if required
end

.elements(name, &block) ⇒ Object



39
40
41
42
43
44
45
# File 'lib/watir_drops/page_object.rb', line 39

def elements(name, &block)
  define_method(name) do |*args|
    self.instance_exec(*args, &block)
  end

  element_list << name.to_sym
end

.inherited(subclass) ⇒ Object



34
35
36
37
# File 'lib/watir_drops/page_object.rb', line 34

def inherited(subclass)
  subclass.element_list = element_list.dup
  subclass.required_element_list = required_element_list.dup
end

.page_titleObject



20
21
22
23
24
# File 'lib/watir_drops/page_object.rb', line 20

def page_title
  define_method("page_title") do |*args|
    yield(*args)
  end
end

.page_url(required: false) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/watir_drops/page_object.rb', line 12

def page_url(required: false)
  @require_url = required

  define_method("page_url") do |*args|
    yield(*args)
  end
end

.visit(*args) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/watir_drops/page_object.rb', line 73

def visit(*args)
  new.tap do |page|
    page.goto(*args)
    exception = Selenium::WebDriver::Error::WebDriverError
    message = "Expected to be on #{page.class}, but conditions not met"
    if page.page_verifiable?
      begin
        page.wait_until(&:on_page?)
      rescue Watir::Wait::TimeoutError
        raise exception, message
      end
    end
  end
end

Instance Method Details

#fill_form(model) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/watir_drops/page_object.rb', line 104

def fill_form(model)
  intersect = case model
              when OpenStruct
                self.class.element_list & model.to_h.keys
              when Hash
                self.class.element_list & model.keys
              else
                self.class.element_list & model.keys.select { |el| !model.send(el).nil? }
              end
  intersect.each do |val|
    self.send("#{val}=", model[val])
  end
end

#goto(*args) ⇒ Object



147
148
149
# File 'lib/watir_drops/page_object.rb', line 147

def goto(*args)
  browser.goto page_url(*args)
end

#inspectObject Also known as: selector_string



118
119
120
# File 'lib/watir_drops/page_object.rb', line 118

def inspect
  '#<%s url=%s title=%s>' % [self.class, url.inspect, title.inspect]
end

#on_page?Boolean

Returns:

  • (Boolean)

Raises:

  • (exception)


125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/watir_drops/page_object.rb', line 125

def on_page?
  exception = Selenium::WebDriver::Error::WebDriverError
  message = "Can not verify page without any requirements set"
  raise exception, message unless page_verifiable?

  if self.class.require_url
    expected = page_url.gsub("#{URI.parse(page_url).scheme}://", '').chomp('/')
    actual = browser.url.gsub("#{URI.parse(browser.url).scheme}://", '').chomp('/')
    return false unless expected == actual
  end

  if self.respond_to?(:page_title) && browser.title != page_title
    return false
  end

  if !self.class.required_element_list.empty? && self.class.required_element_list.any? { |e| !send(e).present? }
    return false
  end

  true
end

#page_verifiable?Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/watir_drops/page_object.rb', line 163

def page_verifiable?
  self.class.require_url || self.respond_to?(:page_title) || self.class.required_element_list.any?
end

#respond_to_missing?(method, _include_all = false) ⇒ Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/watir_drops/page_object.rb', line 159

def respond_to_missing?(method, _include_all = false)
  @browser.respond_to?(method) || super
end