Playwright Python

pip install tracera-playwright

يتطلب Python ≥ 3.11 وpytest ≥ 8 (انظر محوّلات الاختبار الآلي). tracera-playwright على PyPI.

لا تحمّل tracera-pytest وtracera-playwright في نفس تشغيل pytest.

fixture الـ page تأتي من pytest-playwright. فعّل screenshot وvideo وtrace في إعداد Playwright — تُضاف المخرجات إلى نتيجة Tracera.

متغيرات البيئة ووضع التشغيل وإعادة المحاولة: محوّلات الاختبار الآلي.

مفتاح Env عند إعادة المحاولة: PLAYWRIGHT_RETRY.

ربط testCaseId و autotestName

استورد واجهات pytest وPlaywright القياسية كالمعتاد، ومن tracera_playwright — tracera وid.

عند التصريح (المفضّل — الربط يعمل حتى لو تخطّى الاختبار مبكرًا):

from tracera_playwright import id as tracera_id

@tracera_id(42, "e2e/login")
def test_login(page):
    page.goto("https://example.com/login")

داخل الاختبار (اختياري إذا ربطت @tracera.id الحالة مسبقًا):

from tracera_playwright import tracera

def test_login(page):
    tracera.test_case(42, "e2e/login")
    page.goto("https://example.com/login")

Skip

استخدم تخطّي pytest القياسي (pytest.skip، @pytest.mark.skip، …). يُضاف سبب التخطّي إلى النتيجة كـ comment.

import os
import pytest
from tracera_playwright import id as tracera_id

@tracera_id(42, "e2e/login")
def test_login(page):
    if not os.environ.get("READY"):
        pytest.skip("env not ready")
    page.goto("https://example.com/login")

الخطوات

استخدم tracera.step(title, body) أو @tracera.step("…") أو with tracera.step("…"): أو async with tracera.step("…"): (وكذلك @tracera.step / await tracera.step(…) مع async def). في الديكوراتور @tracera.step("add {item}") يُستبدَل {item} من وسيط item لنفس الدالة. الخطوات داخل fixtures بنطاق function تذهب إلى الإعداد / التنظيف في النتيجة؛ الخطوات داخل الاختبار تذهب إلى قسم الاختبار في النتيجة. خطافات مستوى الـ suite لا تُبلَّغ.

import pytest
from tracera_playwright import tracera

@pytest.fixture(autouse=True)
def open_shop(page):
    with tracera.step("open shop"):
        page.goto("https://example.com/shop")
    yield
    with tracera.step("cleanup"):
        page.goto("https://example.com/cart/clear")

def test_checkout(page):
    tracera.test_case(10, "e2e/checkout")

    @tracera.step("add {item}")
    def add_to_cart(item: str):
        page.get_by_role("button", name="Add").click()

    add_to_cart("sku-1")  # → step "add sku-1"

التعليقات والأخطاء والمرفقات

التعليقات والأخطاء والمرفقات: محوّلات الاختبار الآلي. يُرفق Playwright لقطات الشاشة والفيديو وPlaywright trace بنفسه — في Tracera تفتح الصور في عارض ضوئي، ويُشغَّل الفيديو ضمن الصفحة، ويُفتح الـ trace في Trace Viewer.

from tracera_playwright import tracera

def test_login(page):
    tracera.test_case(42, "e2e/login")
    tracera.comment("result-level note")
    tracera.error("result-level error text")

    with tracera.step("open login"):
        page.goto("https://example.com/login")
        tracera.comment("landed on login")
        tracera.attachment(
            file_name="suite-log.txt",
            mime_type="text/plain",
            data=b"finished login flow",
        )

الاختبارات ذات المعلمات

الوسيط الثاني في المزخرف @tracera.id هو اسم الـ autotest. يمكن وضع عناصر نائبة {اسم_الوسيط} / {param_id} فيه؛ يجب أن يطابق {اسم_الوسيط} وسائط دالة الاختبار، وكل صف @pytest.mark.parametrize يملأها من قيم ذلك الصف ({param_id} هو معرّف المعامل إن وفّره pytest). في المثال أدناه تحصل على نتيجتين للحالة 42 باسمي autotest login as ok وlogin as sso:

import pytest
from tracera_playwright import id as tracera_id

@tracera_id(42, "login as {login}")
@pytest.mark.parametrize("login", ["ok", "sso"])
def test_login(page, login):
    page.goto("https://example.com/login")

أو اربط داخل الاختبار عندما يتغيّر أيضاً معرّف الحالة:

import pytest
from tracera_playwright import tracera

@pytest.mark.parametrize(
    "case_id,name,path",
    [
        (42, "e2e/login-ok", "/login"),
        (43, "e2e/login-sso", "/login/sso"),
    ],
)
def test_login_row(page, case_id, name, path):
    tracera.test_case(case_id, name)

    with tracera.step("open"):
        page.goto(f"https://example.com{path}")