Record interactions in the browser, Run tests across Chrome & Edge, Report results with screenshots. Zero boilerplate.
One command installs everything
Interact in browser โ code generated
Interactive menu, Chrome & Edge
HTML report + screenshots on fail
Confident deploys, every time
Every feature exists to solve a real pain that QA engineers face daily.
Click record, interact with your browser โ Tesqo generates clean pytest code automatically. No Playwright API knowledge required.
All credentials live in .env. BASE_URL, USERNAME, PASSWORD never appear hardcoded in any test file.
No memorising pytest flags. run.bat gives you a numbered menu โ pick smoke, regression, single file, or record new.
Point at an Excel sheet โ every row becomes a named test case automatically. No code changes needed.
Failed tests auto-capture screenshots with timestamps. HTML reports are self-contained, shareable files.
Run on Chrome, Edge, or both in parallel. One flag change โ no test modifications needed.
Built-in TablePage iterates every row across all pages. No boilerplate pagination loops.
setup.bat for Windows, setup.sh for macOS/Linux, and a Makefile with universal targets that work everywhere.
Clone โ setup.bat / setup.sh / make setup โ done. Creates venv, installs deps, and installs browsers in one step.
No pytest knowledge required to get started.
Download Tesqo from GitHub
Windows: setup.bat | macOS/Linux: bash setup.sh | Any: make setup
Set your BASE_URL, USERNAME, PASSWORD
record.bat / make record โ interact in browser โ code saved automatically
run.bat / make run โ pick option โ HTML report opens automatically
:: 1. Clone git clone https://github.com/shaik-shahansha/tesqo.git cd tesqo :: 2. One-time setup setup.bat :: 3. Set your app details notepad .env :: 4. Record a test record.bat :: 5. Run & report run.bat
# Application BASE_URL=https://myapp.com USERNAME=admin PASSWORD=secret123 # Browser (chromium | msedge) BROWSER=chromium HEADLESS=false
Answer 3 prompts, interact with your browser, close it. Tesqo handles the rest.
After recording, the generated test is automatically cleaned up:
https://myapp.com โ config.BASE_URL
"admin" โ config.USERNAME
"secret123" โ config.PASSWORD
import pytest and from config.settings import config
@pytest.mark.smoke to every test function
tests/smoke/test_login_admin.py
Interactive menu (run.bat / make run) or direct CLI commands. Browser selection on every run.
Browser choice asked every run: Chrome ยท Edge ยท Both in parallel
# All tests pytest tests/ # By marker pytest tests/ -m smoke pytest tests/ -m regression # Single file / function pytest tests/smoke/test_login.py -v pytest tests/smoke/test_login.py::test_login_success -v # Visible browser (debugging) pytest tests/ --headed # Edge browser pytest tests/ --browser msedge # Both browsers in parallel pytest tests/ --browser chromium \ --browser msedge -n auto # Slow motion for demos pytest tests/ --headed --slowmo 1000
Tag every test โ run exactly what you need, when you need it.
| Marker | Purpose | When to run |
|---|---|---|
| @pytest.mark.smoke | Critical path โ login, core navigation | Every deploy |
| @pytest.mark.regression | Full feature coverage | Before every release |
| @pytest.mark.automation | State-changing scripts (bulk activate, update) | On demand |
| @pytest.mark.slow | Tests taking >30 seconds | Nightly |
No code changes โ add a row in Excel, get a new test case automatically.
| username | password | role | should_pass |
|---|---|---|---|
| alice | pass_alice | Admin | TRUE |
| bob | pass_bob | User | TRUE |
| hacker | wrong | โ | FALSE |
Each row appears as a named test: [alice], [bob], [hacker]
from data.data_loader import load_excel rows = load_excel("data/test_data.xlsx", sheet="Login") @pytest.mark.parametrize("row", rows, ids=[r["username"] for r in rows]) def test_login_from_excel(page, row): page.goto(config.BASE_URL + "/login") page.fill("#username", str(row["username"])) page.fill("#password", str(row["password"])) page.click("button[type='submit']") if str(row["should_pass"]).upper() == "TRUE": expect(page.locator(".dashboard")).to_be_visible() else: expect(page.locator(".error-alert")).to_be_visible()
BasePage, LoginPage, and TablePage ship with Tesqo. Extend them for your app.
from pages.login_page import LoginPage from config.settings import config def test_login(page): lp = LoginPage(page) lp.login(config.USERNAME, config.PASSWORD) lp.assert_login_success()
from pages.table_page import TablePage def test_all_users_active(page): tbl = TablePage(page, table_selector="table#users", path="/admin/users") tbl.open() for row in tbl.iter_all_pages(): status = row.locator(".status").inner_text() assert status == "Active"
from pages.base_page import BasePage class DashboardPage(BasePage): def go(self): self.navigate("/dashboard") def get_welcome_text(self): return self.get_text(".welcome-header")
A clean, predictable layout so you always know where to look.
No paid services, no lock-in. Everything is open source.
From a project template to a fully installable CLI package on PyPI.
Project template โ clone, setup.bat, record.bat, run.bat. Full POM, data-driven, multi-browser.
Installable CLI โ pip install tesqo. Commands: tesqo new, tesqo record, tesqo run, tesqo report.
Multi-project workspace. tesqo switch myapp. Allure report integration. Watch mode.
AI-assisted test generation. Self-healing selectors. CI/CD templates for GitHub Actions.
# Install once, use across all projects pip install tesqo # Scaffold a new project tesqo new myapp # Record a test cd myapp tesqo record # Run tesqo run smoke tesqo run regression --browser edge # Open last report tesqo report # Switch projects tesqo switch client-portal
All contributions welcome โ new page helpers, CI templates, report themes, bug fixes, docs improvements.
git checkout -b feature/my-improvement
The person behind Tesqo.
Passionate about making test automation accessible to everyone. Built Tesqo to give QA engineers a batteries-included framework โ record, run, and report without writing a single line of boilerplate.