Test Selectors & Page Objects

Kyle Coberly

www.kylecoberly.com

www.slides.com/kylecoberly/ember-test-selectors-page-objects

Objectives

  • Explain why test selectors are preferable
  • Use test selectors in an Ember app
  • Describe the page object pattern
  • Use page objects in tests
  • Use test selectors inside of page objects

How do we select DOM elements?

Explain why test selectors are preferable

var heading = find(".heading");
var heading = find("h1");
var heading = find("[data-test-heading]");

Semantic

Precise

Test Selector

var heading = find(testSelector("heading"));

Ember Test Selector

Why test selectors?

  • Decoupled from your app
  • Declarative
  • Removed in production

Use test selectors in an Ember app

<article>
    <h1 data-test-post-title data-test-post-id="{{post.id}}">
        {{post.title}}
    </h1>
    <p>{{post.body}}</p>
</article>
import testSelector from "ember-test-selectors";

// in Acceptance Tests
find(testSelector("post-id", "2"));

// in Component Integration Tests
this.$(testSelector("post-title")).click()

Component

Test

ember install ember-test-selectors

Installation

Page Objects

https://martinfowler.com/bliki/PageObject.html

Use page objects in tests

test("login shows an error when given bad credentials", function(assert) {
    page
        .visit()
        .username("admin")
        .password("invalid")
        .submit();

    andThen(() => {
        assert.equal(page.error, "Invalid credentials");
    });
});

Test

ember install ember-cli-page-object

Installation

import PageObject, {
    clickable,
    fillable,
    text,
    visitable
} from "frontend/tests/page-object";

const page = PageObject.create({
    visit: visitable("/"),
    username: fillable("#username"),
    password: fillable("#password"),
    submit: clickable("button"),
    error: text(".errors")
});

Page Object

Use test selectors in page objects

<form>
    <input type="text" data-test-username />
    <input type="password" data-test-password />
    <input type="submit" data-test-submit-button />
    {{#if error}}
        <p class="error" data-test-error-message>Invalid credentials</p>
    {{/if}}
</form>

Page

import PageObject, {
    clickable,
    fillable,
    text,
    visitable
} from "frontend/tests/page-object";
import testSelector from "ember-test-selector";

const page = PageObject.create({
    visit: visitable("/"),
    username: fillable(testSelector("username")),
    password: fillable(testSelector("password")),
    submit: clickable(testSelector("submit-button")),
    error: text(testSelector("error-message"))
});

Page Object

Objectives

  • Explain why test selectors are preferable
  • Use test selectors in an Ember app
  • Describe the page object pattern
  • Use page objects in tests
  • Use test selectors inside of page objects

Kyle Coberly

www.kylecoberly.com

www.slides.com/kylecoberly/ember-test-selectors-page-objects

Test Selectors & Page Objects

By Kyle Coberly

Test Selectors & Page Objects

Lightning talk for Denver Ember, May 2017

  • 1,913