PageObject is a DSL implementing something akin to the Page Object pattern for automated testing in Elixir. The API is inspired by ember-cli-page-object. PageObject currently uses hound but in future may also support other integration testing libraries.
To find out more about the PageObject pattern check out the selenium documentation.
Install PageObject via hex:
{:page_object, "~> 0.4.0"}
To use PageObject in your tests you'll still need to setup hound in your test environment. To find out more about that go to the hound repository.
Once you have hound and have started a hound_session in your test you can use PageObject modules you've defined as in the API examples below.
# test/support/pages/dashboard_page.ex defmodule DashboardPage do use PageObject visitable :visit, "http://localhost:4001/account/:account_id/dashboard" clickable :submit, "input[type='submit']" clickable :logout, "button.logout" collection :things, item_scope: ".thing" do clickable :click, "button" value :name_value, "input[name='name']" end fillable :fill_email, "input[type='email']" value :email, "input[type='email']" def visit_and_submit(account_id) do visit(account_id: account_id, test_param: "filter") submit end def update_email(email_address) do visit(account_id: account_id, test_param: "filter") fill_email(email_address) submit end end # import the module so that actions can be chained together import DashboardPage # visit http://localhost:4001/account/1/dashboard?test_param=filter DashboardPage.visit_and_submit(1) # or chain actions DashboardPage |> visit(account_id: 1, test_param: "filter") |> submit # visit the page and update a form value DashboardPage.update_email("newemail@example.com") # or chain actions again DashboardPage |> visit(account_id: 1, test_param: "filter") |> fill_email("newemail@example.com") |> submit # confirm the value was updated assert DashboardPage.email == "newemail@example.com" # useful assertions for urls DashboardPage.visit(account_id: 3, test_param: "filter") assert current_url == DashboardPage.visit_url(account_id: 3, test_param: "filter") # click logout DashboardPage.logout # how many ".thing" elements are there? count = DashboardPage.Things.all |> Enum.count # get 0th item from collection of elements and click button on that item DashboardPage.Things.get(0) |> DashboardPage.Things.click #get 0th item from collection and query the value of "input[name='name']" DashboardPage.Things.get(0) |> DashboardPage.Things.name_value
For more API examples see the tests.
Browser automation is handled by Hound but you'll also need phantomjs installed.
npm install -g phantomjsphantomjs --wd > /dev/null 2>&1 & mix test; killall phantomjs