# Hound

For browser automation and writing integration tests in Elixir.

<a href="" target="_parent">Source</a> | <a href="" target="_parent">Documentation</a>

[![Build Status](](
[![Deps Status](](

## Features

* Can run __multiple browser sessions__ simultaneously. [See example](

* Supports Selenium (Firefox, Chrome), ChromeDriver and PhantomJs.

* Supports Javascript-heavy apps. Retries a few times before reporting error.

* Implements the WebDriver Wire Protocol.

**Internet Explorer may work under Selenium, but hasn't been tested.

#### Example

##### ExUnit example

defmodule HoundTest do
  use ExUnit.Case
  use Hound.Helpers


  test "the truth", meta do

    element = find_element(:name, "message")
    fill_field(element, "Happy Birthday ~!")

    assert page_title() == "Thank you"


Here's another [simple browser-automation example](

## Setup

Hound requires Elixir 1.0.4 or higher.

* Add dependency to your mix project


{:hound, "~> 1.0"}

* Start Hound in your `test/test_helper.exs` file **before** the `ExUnit.start()` line:


When you run `mix test`, Hound is automatically started. __You'll need a webdriver server__ running, like Selenium Server or Chrome Driver. If you aren't sure what it is, then [read this](

## Configure

To configure Hound, use your `config/config.exs` file or equivalent.


```config :hound, driver: "phantomjs"```

[More examples here](

## Usage

Add the following lines to your ExUnit test files.

# Import helpers
use Hound.Helpers

# Start hound session and destroy when tests are run

If you prefer to manually start and end sessions, use `Hound.start_session` and `Hound.end_session` in the setup and teardown blocks of your tests.

## Helpers

The documentation pages include examples under each function.

* [Navigation](
* [Page](
* [Element](
* [Cookies](
* [Javascript execution](
* [Javascript dialogs](
* [Screenshot](
* [Session](
* [Window](

The docs are at <>.

### More examples? [Checkout Hound's own test cases](

## FAQ

#### Can I run multiple browser sessions simultaneously

Oh yeah ~! [Here is an example](

If you are running PhantomJs, take a look at the *Caveats* section below.

#### Can I run tests async?


The number of tests you can run async at any point in time, depends on the number of sessions that your webdriver can maintain at a time. For Selenium Standalone, there seems to be a default limit of 15 sessions. You can set ExUnit's async option to limit the number of tests to run parallelly.

#### Will Hound guarantee an isolated session per test?

Yes. A separate session is started for each test process.

## PhantomJs caveats

PhantomJs is extremely fast, but there are certain caveats. It uses Ghostdriver for its webdriver server, which currently has unimplemented features or open issues.

* Cookie jar isn't separate for sessions - <>
  Which means all sessions share the same cookies. Make sure you run `delete_cookies()` at the end of each test.
* Isolated sessions were added to GhostDriver recently and are yet to land in a PhantomJs release.
* Javascript alerts aren't yet supported - <>.

## Running tests

You need a webdriver in order to run tests. We recommend `phantomjs` but any can be used by setting the WEBDRIVER environment variable as shown below:

    $ phantomjs --wd
    $ WEBDRIVER=phantomjs mix test

## Maintainers

* Akash Manohar ([HashNuke](
* Daniel Perez ([tuvistavie](

## Customary proclamation...

Copyright &copy; 2013-2015, Akash Manohar J, under the MIT License (basically, do whatever you want)