Manuals / Playwright with Python / Chapter 44
Part 7 · Real-World Project & Job Readiness · pro · ~90 min · Chapter 44 of 61
33. Real-World Capstone Project
End-to-end framework build (login, CRUD flow, API validation) The capstone ties together nearly every prior chapter into one cohesive project rather than isolated exercises. A solid scope for a portfolio-worthy capstone: ● Login — using POM (Chapter 14), with a session-reuse fixture (Chapter 20) so login only happens once per run, not once per test.
Step 1 of 3
End-to-end framework build (login, CRUD flow, API validation)
The capstone ties together nearly every prior chapter into one cohesive project rather than isolated exercises. A solid scope for a portfolio-worthy capstone: login only happens once per run, not once per test. cover Create, Read, Update, Delete end-to-end through the UI. correctly server-side, not just that the UI looked right. tasks_page = TasksPage(authenticated_page) response = request.get("/api/tasks?title=Finish QA report") task_id = response.json()["tasks"][0]["id"] follow_up = request.get(f"/api/tasks/{task_id}") Pointers: The API-validation steps are what elevate this from "a UI clicker" to a genuine full-stack test — it's a detail interviewers specifically listen for, since it demonstrates you understand that UI success and data-layer success are two different things worth verifying independently.
- Login — using POM (Chapter 14), with a session-reuse fixture (Chapter 20) so
- CRUD flow — pick one feature (e.g., a "tasks" or "leave requests" module) and
- API validation — for at least the Create and Delete steps, verify the result via a direct API call (Chapter 18) as well as the UI, proving the data actually persisted
Example
assert response.json()["tasks"][0]["due_date"] == "2026-08-10"
# Update
tasks_page.edit_task("Finish QA report", new_title="Finish QA report v2")
expect(authenticated_page.get_by_text("Finish QA report v2")).to_be_visible()
# Delete
tasks_page.delete_task("Finish QA report v2")
expect(authenticated_page.get_by_text("Finish QA report v2")).not_to_be_visible()
# API validation of deletion
# Create
tasks_page.create_task("Finish QA report", due_date="2026-08-10")
expect(authenticated_page.get_by_text("Finish QA report")).to_be_visible()
# API validation of creation
# tests/test_task_crud.py
from pages.tasks_page import TasksPage
def test_create_read_update_delete_task(authenticated_page, request):Chapter learning outcomes
- End-to-end framework build (login, CRUD flow, API validation)
- Combining UI + API + auth + CI/CD in one suite
- Code review and refactor pass
Clear these before you leave
Side quest
33. Real-World Capstone Project deliverable
Apply one idea from “End-to-end framework build (login, CRUD flow, API validation)” in a small script or note.