Class: Kookaburra::UIDriver::UIComponent Abstract

Inherits:
Object
  • Object
show all
Includes:
Assertion
Defined in:
lib/kookaburra/ui_driver/ui_component.rb,
lib/kookaburra/ui_driver/ui_component/address_bar.rb

Overview

This class is abstract.

Subclass and implement (at least) #component_locator. Unless you override the default implementation of #url, you must also override the #component_path method.

UIComponent is intended to be subclassed to represent each component of your application-under-test's user interface. The purpose of the UIComponent object is to abstract away the implementation details of your interface when testing and allow you to concentrate on testing your business requirements. For instance, a UIComponent subclass for your sign-up form might have accessors for the individual fields as well as methods that allow you to perform distinct operations:

Note that the "browser operation" methods such as #fill_in and #click_button are forwarded to the #browser object (see #method_missing) and are automatically scoped to the component's DOM element.

Examples:

SignUpForm component

class SignUpForm < Kookaburra::UIDriver::UIComponent
  def component_path
    '/signup'
  end

  def component_locator
    '#sign_up_form'
  end

  def email
    find('#user_email').value
  end

  def email=(new_email)
    fill_in 'user_email', :with => new_email
  end

  def password
    find('#user_password').value
  end

  def password=(new_password)
    fill_in 'user_password', :with => new_password
  end

  def password_confirmation
    find('#user_password_confirmation').value
  end

  def password_confirmation=(new_password_confirmation)
    fill_in 'user_password_confirmation', :with => new_password_confirmation
  end

  def submit
    click_button 'Sign Up'
  end

  def (data = {})
    self.email = data[:email]
    self.password = data[:password]
    self.password_confirmation = data[:password_confirmation]
    submit
  end
end

Direct Known Subclasses

AddressBar

Defined Under Namespace

Classes: AddressBar

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Assertion

#assert

Constructor Details

#initialize(configuration) ⇒ UIComponent

New UIComponent instances are typically created for you by your Kookaburra::UIDriver instance.

Parameters:

See Also:



77
78
79
80
81
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 77

def initialize(configuration)
  @browser = configuration.browser
  @app_host = configuration.app_host
  @server_error_detection = configuration.server_error_detection
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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

If the UIComponent is sent a message it does not understand, it will forward that message on to its #browser but wrap the call in a block provided to the the browser's #within method. This provides convenient access to the browser driver's DSL, automatically scoped to this component.



88
89
90
91
92
93
94
95
96
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 88

def method_missing(name, *args, &block)
  if respond_to?(name)
    browser.within(component_locator) do
      browser.send(name, *args, &block)
    end
  else
    super
  end
end

Instance Attribute Details

#browserObject (readonly, protected)

The browser object from the initialized configuration



124
125
126
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 124

def browser
  @browser
end

Instance Method Details

#component_locatorString (protected)

This method is abstract.

Returns the CSS3 selector that will find the element in the DOM.

Returns:

  • (String)

    the CSS3 selector that will find the element in the DOM

Raises:

  • (Kookaburra::ConfigurationError)

    raised if you haven't provided an implementation



138
139
140
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 138

def component_locator
  raise ConfigurationError, "You must define #{self.class.name}#component_locator."
end

#component_pathString (protected)

This method is abstract.

Returns the URL path that should be loaded in order to reach this component.

Returns:

  • (String)

    the URL path that should be loaded in order to reach this component

Raises:

  • (Kookaburra::ConfigurationError)

    raised if you haven't provided an implementation



130
131
132
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 130

def component_path
  raise ConfigurationError, "You must define #{self.class.name}#component_path."
end

#detect_server_error!Object (protected)

Runs the server error detection function specified in Configuration#server_error_detection.

It's a noop if no server error detection was specified.

Raises:

  • (UnexpectedResponse)

    raised if the server error detection function returns true



149
150
151
152
153
154
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 149

def detect_server_error!
  return if @server_error_detection.nil?
  if @server_error_detection.call(browser)
    raise UnexpectedResponse, "Your server error detection function detected a server error. Looks like your applications is busted. :-("
  end
end

#url(*args) ⇒ Object

Returns the full URL by appending #component_path to the value of the Configuration#app_host from the initialized configuration.



117
118
119
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 117

def url(*args)
  "#{@app_host}#{component_path(*args)}"
end

#visible?Boolean

Is the component's element found on the page and is it considered "visible" by the browser driver.

Returns:

  • (Boolean)


107
108
109
110
111
112
113
# File 'lib/kookaburra/ui_driver/ui_component.rb', line 107

def visible?
  visible = browser.has_css?(component_locator, :visible)
  unless visible
    detect_server_error!
  end
  visible
end