A framework isn't done when it works — it's done when someone else can extend it
without reading every file. This chapter rounds out coverage and adds the docs that
make the project approachable.
Code for this chapter is tagged
ch-24in the repo:
https://github.com/aktibaba/playwright-qa-course — see the new
profile-and-feed/article-filtersspecs anddocs/reference/framework.md.
Rounding out coverage
We fill the obvious gaps with flows that reuse everything we've built:
- Profile — an author's article shows on their profile page.
- Global feed & tag filter — toggling the feed and clicking a tag.
- Editing — open the editor for an existing article and save a change.
- API list filters — by author, the empty case, and the personalized feed.
A couple of these taught a familiar lesson about deterministic assertions under
parallelism:
// ❌ fragile: the unfiltered feed is page-limited and other tests add articles
await expect(page.getByRole("heading", { name: article.title })).toBeVisible();
// ✅ robust: assert the toggle works and *some* article renders…
await expect(globalFeed).toHaveClass(/active/);
await expect(page.locator(".preview-link").first()).toBeVisible();
// ✅ …or isolate with a fresh author / unique tag / high limit
const author = await registerUser(api);
const article = await createArticleAs(author.token);
await page.goto(`/#/profile/${author.username}`); // only this author's article
The new createArticleAs(token, …) helper provisions an article authored by a
specific user — the building block that makes an isolated profile or author-filter
test possible.
Docs that make it extendable
Finally, a framework reference — one page that maps the
layers, states the rules (the dependency direction, the determinism rules), and
answers "how do I add a test / Page Object / fixture / data factory?". Combined with
the repo's README, a newcomer can be productive in minutes instead of spelunking.
Good docs encode the decisions the code can't: why tests import only from
@fixtures, why no test resets the database, why you never assert on a list
position. That's what keeps a maturing framework from drifting.
Next up
Everything is in place. Chapter 25 — Capstone: a full end-to-end regression that
exercises the whole stack — sign up, author, comment, favorite, follow — tying every
technique from the course together, and a look at where to take the framework next.
Tag: ch-25.
Following along? Star the repo
and tell me what you'd put in your framework's onboarding doc.
Top comments (0)