Dio 1 – Web i prvi automatski test
Dio 2 – Lokatori, čekanje i provjere
Dio 3 – Organizacija, preglednici i pristupačnost
Praksa – Playwright i stranica DeliveryApp
Materijale priredio Erkan Islamović
erkan.islamovic@eubd.edu.ba · erkan.islamovic@gmail.com
Petnaest sedmica: svaka ima tri časa teorije i tri časa praktične nastave. Danas: poglavlje 13 (Sedmica 13, označeno). Isti primjer kroz knjigu: DeliveryApp, narudžba N-1001.
| Sed. | Poglavlje | Teorija (3 časa) | Praksa (3 časa) |
|---|---|---|---|
| 1 | Zašto testiramo | Uvodne priče; greška, defekt, otkaz; sedam principa; DeliveryApp | Tabela očekivanih cijena rukom |
| 2 | Proces i nivoi | Test proces; nivoi i V-model; vrste; statičko testiranje | Recenzija zahtjeva DeliveryApp |
| 3 | Manuelno testiranje | Test slučaj; izvještaj o defektu; istraživačko testiranje | Test slučajevi za web stranicu |
| 4 | Automatizovano testiranje | Šta automatizovati; piramida testova; prvi test | Prvi pytest |
| 5 | Jedinično testiranje | AAA; fixture, parametri, izuzeci; TDD | Testovi za dostavu i popust |
| 6 | Bijela kutija | Graf toka; pokrivenost; ciklomatska složenost | coverage.py do 100 % grana |
| 7 | Tok podataka | Definicija i upotreba; anomalije; statička analiza, mutacije | ruff, mypy, ručna mutacija |
| 8 | Crna kutija | Ekvivalencija i granice; tabela odlučivanja; stanja | Lov na pet grešaka |
| Sed. | Poglavlje | Teorija (3 časa) | Praksa (3 časa) |
|---|---|---|---|
| 9 | Model i integracija | Model; strategije integracije; API | TestClient za API |
| 10 | Sistemsko testiranje | Sistemsko; performanse i sigurnost; prihvatno i BDD | Locust, Gherkin |
| 11 | OO testiranje | Stanje objekta; nasljeđivanje; dvojnici | Narudzba, unittest.mock |
| 12 | Paralelne aplikacije | Trka podataka; zastoj; nestabilni testovi | Niti, 1000 ponavljanja |
| 13 | Web aplikacije | Web i DOM; Playwright; Page Object, pristupačnost | Playwright za DeliveryApp |
| 14 | Upravljanje testiranjem | Test plan i rizik; metrike; CI/CD | GitHub Actions |
| 15 | Alati, AI, projekat | Pregled alata; AI u testiranju; ISTQB | Odbrana projekta |
U utorak, 15. novembra 2022., počela je pretprodaja karata za veliku turneju pjevačice Taylor Swift u SAD-u, preko sajta Ticketmaster. Pravo na pretprodaju imali su samo unaprijed registrovani obožavatelji, koji su dobili kod. Sistem je bio pripremljen za veliku gužvu, ali ne za ono što je stiglo: obožavatelji, ali i ogroman broj botova (programa koji automatski kupuju karte da bi ih kasnije preprodali skuplje). Prema izjavi same firme, sistem je tog dana primio 3,5 milijardi zahtjeva, oko četiri puta više nego u bilo kojem ranijem vrhuncu.
Stranica se zaglavljivala, redovi čekanja su stajali satima, korpe su se praznile u posljednjem koraku, a mnogi su dobijali poruke o grešci baš kad su karte bile u korpi. Opšta prodaja, planirana za nekoliko dana kasnije, otkazana je, jer nije ostalo dovoljno karata. Slučaj je završio na saslušanju u američkom Senatu u januaru 2023. Za nas je ova priča zanimljiva jer pokazuje koliko toga mora raditi zajedno da bi jedan klik na dugme „Kupi” uspio: preglednik, stranica, JavaScript, mreža, server, red čekanja, baza i zaštita od botova. Web aplikacija je mjesto na kojem se sve to susreće s korisnikom, i zato je testiranje weba posebna vještina.

U poglavlju 3 testirali smo web stranicu DeliveryApp ručno: test slučajevi TS-KOR-01 … TS-KOR-06, istraživanje, izvještaji o defektu, i našli greške UI-01 i UI-02. U poglavlju 4 vidjeli smo da testovi kroz korisnički interfejs stoje na vrhu piramide: malo ih je, sporiji su, ali provjeravaju ono što korisnik zaista vidi. Sada te ručne testove automatizujemo alatom Playwright. Prvo ukratko kako radi web i šta se na njemu testira. Zatim Playwright: kako pronaći dugme (lokatori), kako sačekati da se nešto pojavi i kako provjeriti rezultat. Na kraju obrazac Page Object, testiranje u više preglednika i na telefonu, i provjere pristupačnosti.
Nakon poglavlja možete:
objasniti kako preglednik, stranica i server sarađuju; nabrojati šta se na web aplikaciji testira; instalirati Playwright i pokrenuti test stranice DeliveryApp; izabrati dobar lokator i objasniti zašto su uloga i oznaka bolji od CSS putanje; objasniti automatsko čekanje i zašto se ne koristi sleep; napisati provjere expect za tekst, vidljivost i stanje dugmeta; organizovati testove obrascem Page Object; pokrenuti testove u više preglednika i na ekranu telefona; napisati osnovne testove pristupačnosti; istražiti pad testa pomoću snimka ekrana i traga.
| Čas | Sadržaj | Na času |
|---|---|---|
| Teorija 1 | 13.1–13.3 Kako radi web; šta testiramo; prvi Playwright test | Ručni TS-KOR-01 postaje automatski |
| Teorija 2 | 13.4–13.6 Lokatori; čekanje i provjere; istraživanje pada | Zašto sleep(2) nije rješenje |
| Teorija 3 | 13.7–13.9 Page Object; preglednici i telefon; pristupačnost | Naručivanje samo tastaturom |
Kad kupac otvori stranicu DeliveryApp, dešava se lanac koraka:
Za testera, iz toga slijede tri važne stvari:

Stranica iz primjeri/deliveryapp/web/index.html je mala, ali ima sve što nam treba: jelovnik s dugmadima „−” i „+”, korpu, polja za udaljenost i kod, pregled cijene, dugme „Naruči” i, poslije narudžbe, dugmad za promjenu stanja. Sa ?v=0 na kraju adrese učitava prvu verziju s greškama D-01 … D-05, UI-01 i UI-02 (poglavlje 3).
Web test nije samo „da li dugme radi”. Kontrolna lista, od funkcija ka kvalitetu:
| Šta | Pitanje | DeliveryApp |
|---|---|---|
| funkcionalnost | daje li stranica tačan rezultat? | N-1001 pokazuje 24,50 € |
| validacija unosa | odbija li loš unos s jasnom porukom? | 11 km → „izvan zone dostave”, dugme Naruči onemogućeno |
| stanja i tok | prate li dugmad i poruke pravila? | otkazivanje u pripremi odbijeno (PP-6) |
| preglednici | radi li isto u Chrome, Firefox, Safari? | isti testovi u tri preglednika |
| responzivnost | radi li na telefonu? | dugme Naruči vidljivo na ekranu 390 × 844 |
| pristupačnost | može li se koristiti tastaturom i čitačem ekrana? | dugmad imaju ime, polja imaju oznaku |
| performanse | koliko brzo se učita i reaguje? | alat Lighthouse u Chromeu |
| sigurnost | može li se ubaciti tuđi kod? | ime kupca <script>… iz poglavlja 10 |
Ručni testovi iz poglavlja 3 i automatski iz ovog poglavlja dopunjuju se. Automatski test ponavlja provjeru tačnih vrijednosti hiljadu puta bez umora. Ali samo čovjek primijeti da je dugme ružno, da je poruka zbunjujuća ili da je polje za kod skriveno ispod dugmeta.
Playwright je alat koji upravlja pravim preglednikom: otvori stranicu, klikne, upiše, i provjeri šta piše. Napravila ga je firma Microsoft, besplatan je i radi s Chromiumom (osnova Chromea i Edgea), Firefoxom i WebKitom (osnova Safarija). Instalacija:
pip install pytest-playwright
playwright install chromiumDruga naredba preuzme preglednik koji Playwright koristi (nekoliko stotina MB, jednom).
Ručni test slučaj TS-KOR-01 iz poglavlja 3 („N-1001: 2 × Margarita, 1 × Sok, 4,2 km → 24,50 €”) postaje automatski test u tests_web/test_web.py:
STRANICA = (pathlib.Path(__file__).parent.parent / "web" / "index.html").resolve().as_uri()
@pytest.fixture
def deliveryapp(page: Page):
page.goto(STRANICA)
return page
def dodaj(page, naziv, puta=1):
for _ in range(puta):
page.get_by_role("button", name="Dodaj " + naziv).click()
def test_n1001_ukupno(deliveryapp):
dodaj(deliveryapp, "Pizza Margarita", 2)
dodaj(deliveryapp, "Sok")
deliveryapp.get_by_test_id("udaljenost").fill("4.2")
expect(deliveryapp.get_by_test_id("dostava")).to_have_text("3,00 €")
expect(deliveryapp.get_by_test_id("ukupno")).to_have_text("24,50 €")Fixture page daje pytest-playwright: novu, praznu karticu preglednika za svaki test. Stranica se otvara direktno iz fajla, bez servera. Ostalo se čita skoro kao ručni test slučaj: dodaj dvije Margarite i sok, upiši 4,2 km, očekuj dostavu 3,00 € i ukupno 24,50 €. Isti obrazac pripremi–izvrši–provjeri kao u poglavlju 5.
pytest tests_web
............... [100%]
15 passed in 3.17sPreglednik se po defaultu ne vidi (radi „bez glave”, headless), zato je brz. Da biste gledali šta test radi, dodajte --headed --slowmo 500: preglednik se otvori, a svaki korak traje pola sekunde.
Nad prvom verzijom (DeliveryApp=v0, stranica s ?v=0):
FAILED tests_web/test_web.py::test_n1001_ukupno[chromium] - AssertionError: L...
FAILED tests_web/test_web.py::test_kod_malim_slovima[chromium] - AssertionErr...
FAILED tests_web/test_web.py::test_izvan_zone_poruka[chromium] - AssertionErr...
FAILED tests_web/test_web.py::test_kolicina_ne_moze_biti_negativna[chromium]
FAILED tests_web/test_web.py::test_otkazivanje_u_pripremi[chromium] - Asserti...
...
9 failed, 6 passed in 48.46sPet testova iz test_web.py hvata D-02, D-03, UI-01, UI-02 i D-04, a četiri iz test_web_po.py (13.7) još D-01 na tačno 30,00 €. Primijetite i vrijeme: 48 sekundi umjesto 3. Svaka pala provjera čeka do 5 sekundi da se tačna vrijednost možda ipak pojavi (13.5), pa tek onda prijavi pad.
Pokrenite playwright codegen s adresom stranice DeliveryApp. Otvore se preglednik i prozor u kojem Playwright zapisuje kod dok vi klikćete. Dodajte dvije Margarite i pogledajte kakve lokatore je izabrao. Snimljen kod je dobar početak, ali ga uvijek treba urediti: dodati provjere (expect) i ukloniti suvišne korake.
pytest-playwright.page daje novu karticu za svaki test.playwright codegen? Otvori preglednik i zapisuje Playwright kod dok korisnik klikće.Odgovori: tipka R ili klik na zamućeno polje.
Da bi kliknuo dugme, test ga mora pronaći. Opis kako se element traži zove se lokator. Isti element se može naći na više načina, i razlika je velika (slika 13.3):

get_by_role): „dugme s imenom Naruči”. Tako element vide korisnik i čitač ekrana za slijepe. Ako se promijeni boja, raspored ili HTML oko dugmeta, test i dalje radi.get_by_label): „polje s oznakom Udaljenost (km)”. Najbolje za polja forme.get_by_text): „Korpa je prazna.” Dobro za poruke.get_by_test_id): atribut data-testid="ukupno" koji programeri dodaju posebno za testove. Stabilan, ali korisnik ga ne vidi, pa ne provjerava ništa o pristupačnosti.#jelovnik > div:nth-child(2) button. Opisuje strukturu stranice („drugo dugme u drugom redu”) i puca čim neko doda novo jelo ili omot oko dugmeta. Izbjegavati.U stranici DeliveryApp dugmad „+” i „−” imaju samo znak, ali i opis za čitač ekrana: aria-label="Dodaj Pizza Margarita". Zato test može napisati get_by_role("button", name="Dodaj Pizza Margarita"). Ovdje se dobar test i dobra pristupačnost sreću: ako test ne može naći dugme po imenu, ne može ni slijepi korisnik.
„Najsigurnije je dodati data-testid na sve.” Test oznake su stabilne i korisne za elemente koji nemaju smisleno ime (npr. iznos 24,50 € u pregledu). Ali za dugmad i polja je bolje get_by_role i get_by_label: test tada usput provjerava i da element ima ime koje vide korisnik i čitač ekrana.
data-testid) su stabilne, ali ne provjeravaju ništa o pristupačnosti.Stranica se mijenja asinhrono: klik na „+” pokrene JavaScript, koji tek poslije promijeni cijenu. Na sporom računaru to može trajati duže. Stari alati su tjerali testera da piše:
page.click("text=+")
time.sleep(2) # nadam se da je dovoljno…
assert page.inner_text("#ukupno") == "24,50 €"To je recept za nestabilan test (poglavlje 12): na brzom računaru gubi dvije sekunde, na sporom CI serveru ponekad nije dovoljno.
Playwright to rješava na dva mjesta:
click, fill) sam sačeka da element postoji, da je vidljiv, da nije onemogućen i da se ne pomjera.expect ponavljaju provjeru dok ne uspije ili dok ne istekne vrijeme (5 sekundi po defaultu). Ovo su tzv. provjere „za web” (web-first assertions).expect(page.get_by_test_id("ukupno")).to_have_text("24,50 €") # čeka dok tekst ne bude 24,50 €
expect(page.get_by_test_id("naruci")).to_be_disabled() # čeka dok dugme ne bude onemogućeno
expect(page.get_by_test_id("poruka")).to_contain_text("izvan zone")
expect(page.get_by_label("Udaljenost (km)")).to_be_visible()Najvažnije provjere:
| Provjera | Šta znači |
|---|---|
to_have_text("…") | tačan tekst elementa |
to_contain_text("…") | tekst sadrži dati dio |
to_be_visible() / to_be_hidden() | element se vidi / ne vidi |
to_be_enabled() / to_be_disabled() | dugme se može / ne može kliknuti |
to_have_value("…") | vrijednost u polju forme |
to_have_count(n) | lokator nalazi tačno n elemenata |
Razlika između assert i expect je važna: assert page.get_by_test_id("ukupno").inner_text() == "24,50 €" pročita tekst jednom, u tom trenutku, i ne čeka. expect(...) čeka. Za web uvijek expect.
time.sleep čini test sporim i nestabilnim.expect ponavlja provjeru do 5 sekundi.expect, a ne assert nad jednom pročitanom vrijednošću.Kad web test padne, prvo pitanje je: šta je bilo na ekranu? Playwright daje tri pomoći.
1. Poruka provjere. Pad testa granice na v0 (3,1 km):
> expect(self.page.get_by_test_id("dostava")).to_have_text(tekst)
E AssertionError: Locator expected to have text '3,00 €'
E Actual value: 2,50 €
E Call log:
E - Expect "to_have_text" get_by_test_id("dostava") with timeout 5000ms
E - waiting for get_by_test_id("dostava")
E 14 × locator resolved to <span id="dostava" data-testid="dostava">2,50 €</span>
E - unexpected value "2,50 €"Poruka kaže šta je očekivano, šta je dobijeno, i da je Playwright 14 puta provjerio u 5 sekundi prije nego što je odustao. To je N-1001 na v0: dostava 2,50 € umjesto 3,00 €, greška D-02.
2. Snimak ekrana. pytest tests_web --screenshot only-on-failure sačuva sliku ekrana u trenutku pada, u folder test-results/. Slika je odlična za izvještaj o defektu (poglavlje 3).
3. Trag. pytest tests_web --tracing retain-on-failure za svaki pali test sačuva trag: svaki korak, sliku ekrana prije i poslije, DOM, mrežne zahtjeve i poruke konzole. Otvara se naredbom:
playwright show-trace test-results/<ime-testa>/trace.zipU pregledniku traga možete ići korak po korak, unazad i unaprijed, kao da gledate snimak utakmice. Trag je posebno koristan za pad u CI-ju, gdje ne možete gledati preglednik uživo.
expect kaže šta je očekivano, šta je dobijeno i koliko puta je provjereno.--screenshot only-on-failure čuva sliku ekrana u trenutku pada.--tracing retain-on-failure čuva trag sa svakim korakom, DOM-om i mrežom.playwright show-trace i posebno pomaže kod padova u CI-ju.get_by_role("button", name="Naruči") bolji od CSS putanje? Opisuje element kako ga vidi korisnik, ne puca kad se promijeni struktura stranice, i usput provjerava da dugme ima ime.assert ... inner_text() == ... i expect(...).to_have_text(...)? assert pročita jednom i ne čeka; expect ponavlja provjeru dok ne uspije ili istekne vrijeme.Odgovori: tipka R ili klik na zamućeno polje.
U test_web.py svaki test sam zna da se dugme zove „Dodaj Pizza Margarita” i da polje ima data-testid="udaljenost". Kad dizajner promijeni natpis na „Dodaj u korpu: Pizza Margarita”, treba mijenjati svaki test. Obrazac Page Object rješava to tako što stranicu predstavi klasom s metodama za radnje kupca. Testovi pozivaju metode, a samo klasa zna HTML.
Slika iz života: daljinski upravljač. Pritisnete „glasnije” i ne zanima vas kakav je čip u televizoru. Ako proizvođač promijeni čip, novi daljinski ima isto dugme „glasnije”.
Fajl tests_web/stranica.py:
class DeliveryAppStranica:
def __init__(self, page: Page, adresa: str):
self.page = page
self.adresa = adresa
def otvori(self):
self.page.goto(self.adresa)
return self
def dodaj(self, jelo, puta=1):
for _ in range(puta):
self.page.get_by_role("button", name=f"Dodaj {jelo}").click()
return self
def udaljenost(self, km):
self.page.get_by_label("Udaljenost (km)").fill(str(km))
return self
def ocekuj_dostavu(self, tekst):
expect(self.page.get_by_test_id("dostava")).to_have_text(tekst)
...Metode vraćaju self, pa se radnje mogu nizati. Testovi u tests_web/test_web_po.py čitaju se kao rečenice:
def test_n1001_kroz_page_object(deliveryapp):
deliveryapp.dodaj("Pizza Margarita", 2).dodaj("Sok").udaljenost(4.2)
deliveryapp.ocekuj_dostavu("3,00 €")
deliveryapp.ocekuj_ukupno("24,50 €")
@pytest.mark.parametrize("korpa, dostava", [
([("Pizza Capricciosa", 2), ("Sok", 3)], "3,00 €"), # 22,00 + 7,50 = 29,50 € (najbliže ispod granice)
([("Pizza Margarita", 2), ("Pizza Capricciosa", 1)], "0,00 €"), # 19,00 + 11,00 = tačno 30,00 € (PP-4)
])
def test_granica_besplatne_dostave(deliveryapp, korpa, dostava):
for jelo, puta in korpa:
deliveryapp.dodaj(jelo, puta)
deliveryapp.udaljenost(5)
deliveryapp.ocekuj_dostavu(dostava)Primijetite drugi test. Granica od 30,00 € (poglavlje 8) na stranici se ne može testirati sa 29,99 €, jer su sve cijene u jelovniku višestruke od 0,50 €. Najbliži iznos ispod granice koji kupac može složiti je 29,50 €, a tačno 30,00 € daju dvije Margarite i jedna Capricciosa. Granične vrijednosti uvijek treba prilagoditi onome što korisnik stvarno može unijeti. Ovaj test na v0 pada za 30,00 € (D-01).
Isti testovi pokreću se u drugom pregledniku jednom opcijom:
playwright install firefox webkit
pytest tests_web --browser chromium --browser firefox --browser webkitSvaki test se izvrši tri puta, a ime u izvještaju kaže gdje: test_n1001_ukupno[firefox]. WebKit je osnova Safarija, pa ovako na Windowsu i Linuxu dobijamo dobru aproksimaciju Safarija bez Apple računara.
Više od polovine posjeta na webu danas dolazi s telefona. Test na ekranu telefona pravi poseban kontekst preglednika s malim ekranom i dodirom:
def test_mobilni_ekran(browser):
"""Ista stranica na ekranu telefona (390 × 844): dugme Naruči mora biti vidljivo i upotrebljivo."""
kontekst = browser.new_context(viewport={"width": 390, "height": 844}, is_mobile=True, has_touch=True)
page = kontekst.new_page()
page.goto(ADRESA)
page.get_by_role("button", name="Dodaj Pizza Margarita").tap()
naruci = page.get_by_role("button", name="Naruči")
naruci.scroll_into_view_if_needed()
expect(naruci).to_be_visible()
expect(naruci).to_be_enabled()
kontekst.close()Umjesto click koristi se tap (dodir prstom). Playwright ima i gotove profile poznatih telefona (playwright.devices["iPhone 13"]), a pytest-playwright opciju --device "iPhone 13".
Emulacija nije isto što i pravi telefon: ekran i dodir se glume, ali procesor, mreža i stvarni Safari na iPhoneu nisu isti. Zato se uz automatske testove u emulaciji, prije izdanja, stranica proba i ručno na bar jednom pravom telefonu.
--browser pokreće iste testove u Chromiumu, Firefoxu i WebKitu.U poglavlju 10 rekli smo da stranicu treba da mogu koristiti i ljudi s invaliditetom. Standard WCAG ima stotine kriterija, ali tri najvažnija za početak mogu se testirati automatski:
<label>), a ne samo sivi tekst unutar polja koji nestane kad se počne kucati.Testovi iz test_web_po.py:
def test_samo_tastaturom(page: Page):
"""Pristupačnost: kupac koji ne koristi miš mora moći dodati jelo i vidjeti cijenu."""
page.goto(ADRESA)
dugme = page.get_by_role("button", name="Dodaj Pizza Margarita")
dugme.focus()
page.keyboard.press("Enter")
page.keyboard.press("Enter")
expect(page.get_by_test_id("artikli")).to_have_text("19,00 €")
def test_polja_imaju_vidljive_oznake(page: Page):
"""Pristupačnost: čitač ekrana mora znati šta je koje polje."""
page.goto(ADRESA)
expect(page.get_by_label("Udaljenost (km)")).to_be_visible()
expect(page.get_by_label("Kod popusta")).to_be_visible()
for dugme in page.get_by_role("button").all():
assert dugme.get_attribute("aria-label") or dugme.inner_text().strip()Drugi test prolazi kroz sva dugmad na stranici i provjerava da svako ima ime, bilo kao vidljiv tekst („Naruči”) ili kao opis za čitač ekrana (aria-label). Kad neko sutra doda novo dugme bez imena, test padne.
Za detaljniju provjeru postoje alati kao axe (biblioteka axe-core, koja se može pozvati iz Playwrighta) i Lighthouse u Chromeu (kartica Lighthouse u alatima za programere). Oni provjeravaju i kontrast boja, redoslijed naslova, jezik stranice i desetine drugih pravila. Ali ni oni ne mogu reći da li je stranica zaista upotrebljiva slijepom korisniku: za to je potrebno probati je s čitačem ekrana (NVDA na Windowsu, VoiceOver na Macu i iPhoneu), a najbolje s osobom koja ga svakodnevno koristi.
Pristupačnost nije samo dobra volja. Evropski akt o pristupačnosti (European Accessibility Act), čija se pravila primjenjuju od juna 2025. godine, traži da mnoge digitalne usluge u EU, među njima i online prodaja, budu pristupačne. Firme koje prodaju u EU, uključujući one iz BiH, moraju to provjeravati.
--browser chromium --browser firefox --browser webkit.aria-label? Da čitač ekrana izgovori šta dugme radi, npr. „Dodaj Pizza Margarita”; tada ga i test može naći po imenu.Odgovori: tipka R ili klik na zamućeno polje.
Cilj je automatizovati ručne test slučajeve iz poglavlja 3, organizovati ih obrascem Page Object, pokrenuti ih u više preglednika i na ekranu telefona, i provjeriti pristupačnost. Radi se u parovima. Prije početka: pip install pytest-playwright, pa playwright install chromium firefox webkit.
primjeri/deliveryapp pokrenite pytest tests_web nad ispravnom i nad prvom verzijom. Zapišite koji testovi padaju i koju grešku hvata svaki.--headed --slowmo 500 i gledajte preglednik.playwright codegen nad stranicom i snimite narudžbu 4 × Capricciosa na 2,5 km (stranica ima samo jelovnik Picerije). Uredite snimljen kod u test s provjerama (expect): artikli 44,00 €, dostava 0,00 € (PP-4), ukupno 44,00 €.DeliveryAppStranica. Ako nekoj radnji fali metoda (npr. ocekuj_poruku), dodajte je u stranica.py." STUDENT10 " s razmacima i za nepoznat kod STUDENT20.pytest tests_web --screenshot only-on-failure --tracing retain-on-failure.playwright show-trace … i prođite korak po korak. U kojem koraku se prvi put vidi pogrešna vrijednost?test-results/.--device "iPhone 13". Šta se mijenja?page.keyboard.press("Tab") i "Enter"). Uspijeva li? Ako ne, zapišite nalaz pristupačnosti.index.html uklonite aria-label s jednog dugmeta. Koji test pada?Rezultat koji se predaje: fajl rezultati-13.md s tabelom web testova nad obje verzije i greškom koju hvata svaki; prošireni stranica.py i testovi za TS-KOR-01 … TS-KOR-06; izvještaj o defektu UI-02 sa slikom ekrana; rezultati u tri preglednika i na telefonu; test samo tastaturom i nalazi Lighthousea.
Rješenja su sakrivena – tipka R ili klik na okvir.
Poredajte lokatore od najboljeg ka najgorem i objasnite: a) page.locator("div.pregled > button.glavno"); b) page.get_by_role("button", name="Naruči"); c) page.get_by_test_id("naruci"); d) page.locator("//section[3]/button[1]").
b) uloga i ime, kako dugme vidi korisnik i čitač ekrana; c) test oznaka, stabilna ali bez provjere pristupačnosti; a) CSS putanja, puca kad se promijene klase ili omot; d) XPath po rednom broju sekcije i dugmeta, najkrhkiji: puca čim se doda nova sekcija.
Prepravite test tako da ne koristi sleep:
page.get_by_role("button", name="Naruči").click()
time.sleep(3)
assert page.get_by_test_id("stanje").inner_text() == "NOVA"page.get_by_role("button", name="Naruči").click()
expect(page.get_by_test_id("stanje")).to_have_text("NOVA")expect čeka dok stanje ne bude NOVA (do 5 sekundi), pa je test brz kad je stranica brza i stabilan kad je spora.
Dodajte u DeliveryAppStranica metodu ocekuj_poruku(tekst) i napišite test za 11 km koji je koristi.
def ocekuj_poruku(self, tekst):
expect(self.page.get_by_test_id("poruka")).to_contain_text(tekst)
def test_izvan_zone(deliveryapp):
deliveryapp.dodaj("Pizza Margarita", 2).udaljenost(11)
deliveryapp.ocekuj_poruku("izvan zone")Na v0 test pada, jer stranica pokazuje „Greška 422” (UI-01).
Na stranici se mogu naručiti samo Margarita (9,50 €), Capricciosa (11,00 €) i Sok (2,50 €). Koje korpe biste izabrali za granicu PP-1 (najmanje 5,00 €)?
Ispod granice: 1 × Sok = 2,50 € (najveći iznos ispod 5,00 € koji se može složiti je 2,50 €, jer su sve cijene višestruke od 0,50 €, a 4,50 € nije moguće). Na granici: 2 × Sok = 5,00 €. Očekivano: 2,50 € odbijeno s porukom o minimalnoj narudžbi; 5,00 € prihvaćeno. Iznos 4,99 € iz poglavlja 8 testira se na nivou API-ja i funkcije, gdje se može unijeti.
Dizajner želi da polje za kod popusta nema oznaku, nego samo sivi tekst „npr. STUDENT10” unutar polja, „da bude čistije”. Šta odgovarate i koji test bi to otkrio?
Sivi tekst (placeholder) nestane čim kupac počne kucati, a mnogi čitači ekrana ga ne čitaju kao oznaku; ljudi s lošijim vidom ga teško vide zbog slabog kontrasta. Polje mora imati pravu oznaku (<label>). Test test_polja_imaju_vidljive_oznake bi pao, jer get_by_label("Kod popusta") ne bi našao polje.
expect ponavljaju se do 5 sekundi umjesto nestabilnog sleep, a pad se istražuje porukom, slikom ekrana i tragom.get_by_role dobar i za pristupačnost?time.sleep loš u web testovima i šta ga zamjenjuje?assert i expect u Playwrightu?