courses/accelerator/playwright
● videoCase Studies

Testing with Playwright

Free for everyone
This video is free for everyone

Watch the whole thing, no account needed. If it clicks, grab The Imposter's Frontend Accelerator for lifetime access to every lesson.

Buy the course$129
SECTION
Case Studies
NEXT UP
end of course
COURSE
The Imposter's Frontend Accelerator
32 lessons
About this lesson

I'm a big fan of testing things - especially end-to-end (e2e). Let's see how Playwright can help us automate our login and video checks.

The focus will be: great, but how do I actually use this thing?

Off Camera

Setup a test user with Supabase and a new login page (I have to) as we have no way to authenticate our user otherwise.

Setting Up Playwright

We'll do the needful and see how Playwright works:

  • Install Playwright, showing both ways (VS Code Extension and CLI)
  • Look through the config, tweaking to make it a bit more usable
  • Have a gander at the examples
  • Understand how Locaters work and what makes UI testing so brittle

Authentication Issues

Our tests need to know who the user is, so we'll plug in authentication and discuss how this would work in automated tests (it won't and shouldn't)

Running Tests

Lots of ways to run tests:

  • VS Code Extension (don't like)
  • The CLI (it's OK)
  • The UI tool (it's great)

Rob's Opinion

I have lots of opinions on tests and testing, and I'm happy to share

Snippets

I have a number of snippets I like to use because I like to write tests by hand. Hope you find them useful!

<span class="hljs-attr">&quot;Playwright&quot;</span><span class="hljs-punctuation">:</span><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pw&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;const { test, expect } = require(&#x27;@playwright/test&#x27;);\r\n&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;test.describe(\&quot;$1\&quot;, () =&gt; {&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\ttest.beforeEach(async ({page}) =&gt; {&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\t\tawait page.goto(&#x27;&#x27;)&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\t});&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\ttest(\&quot;$2\&quot;, async ({page}) =&gt; {&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\t\t$0&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;\t});&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;});&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;Playwright describe&quot;</span> <span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pwd&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;test.describe(\&quot;$1\&quot;, () =&gt; {&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;  $0&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;});&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;Playwright label&quot;</span> <span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pwlbl&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;const $0 = await page.getByLabel(\&quot;$1\&quot;);&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;Playwright id&quot;</span> <span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pwid&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;const $0 = await page.locator(\&quot;#$1\&quot;);&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;Playwright test id&quot;</span> <span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pwtid&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;const $0 = await page.getByTestId(\&quot;$1\&quot;);&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;Playwright role&quot;</span> <span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prefix&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;pwrole&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;body&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;const $0 = await page.getByRole(&#x27;$1&#x27;, { name: &#x27;$2&#x27; });&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>