Lokatori u Selenium

โšก Pametni saลพetak

Lokatori u Selenium su naredbe koje usmjeravaju mehanizam za automatizaciju da identificira elemente grafiฤkog korisniฤkog suฤelja kao ลกto su tekstualni okviri, gumbi i potvrdni okviri. Ovaj priruฤnik objaลกnjava tipove lokatora ID-a, naziva, teksta poveznice, DOM-a i XPath-a s praktiฤnim primjerima, sintaktiฤkim pravilima i strategijama odabira za pouzdane skripte za web automatizaciju.

  • ๐ŸŽ“ Foundational Naฤelo: Prvo koristite ID lokatore jer su jedinstveni i omoguฤ‡uju najbrลพu i najstabilniju identifikaciju elemenata.
  • ๐Ÿš€ Fokus implementacije: Primjena lokatora imena s atributima filtera za razlikovanje elemenata koji dijele identiฤne vrijednosti imena, kao ลกto su radio gumbi.
  • ๐Ÿ’ก Napredna tehnika: Iskoristite DOM metode poput getElementById, getElementsByName i indeksiranje obrazaca za pristup duboko ugnijeลพฤ‘enim elementima.
  • ๐Ÿ€ Strategija optimizacije: Odaberite XPath za elemente kojima nedostaju atributi klase, imena ili ID-a, ali uravnoteลพite fleksibilnost s troลกkovima odrลพavanja skripte.
  • ๐Ÿ‘œ Utjecaj na kvalitetu: Odabir prave vrste lokatora izravno utjeฤe na pouzdanost skripte, brzinu izvrลกavanja i dugoroฤno odrลพavanje testa.

Lociranje putem ID-a u Selenium

ล to su lokatori u Selenium?

Lokator je naredba koja usmjerava Selenium IDE ili Selenium WebDriver na ispravan GUI element, kao ลกto je tekstualni okvir, gumb, poveznica ili potvrdni okvir, na kojem se mora izvrลกiti radnja. Identificiranje ispravnog GUI elementa preduvjet je za izradu bilo kojeg pouzdanog skripta za automatizaciju. Meฤ‘utim, toฤna identifikacija je izazovnija nego ลกto zvuฤi. Ponekad moลพete zavrลกiti u interakciji s pogreลกnim elementom ili bez ikakvog elementa. Kako biste to rijeลกili, Selenium nudi niz strategija lokatora koje omoguฤ‡uju precizno ciljanje elemenata grafiฤkog korisniฤkog suฤelja.

Dok neke naredbe, poput naredbe "otvori", ne zahtijevaju lokator, veฤ‡ina Selenium Naredbe ovise o lokatorima elemenata. Izbor lokatora uvelike ovisi o vaลกoj aplikaciji koja se testira (AUT). U ovom tutorijalu ฤ‡emo naizmjeniฤno koristiti Facebook i Mercury Demo stranica Tours (newtours.demoaut), na temelju lokatora koje svaka aplikacija podrลพava. Isto tako, u vaลกoj vlastitoj testiranje projekt, odabrat ฤ‡ete lokator elemenata u Selenium WebDriver na temelju strukture vaลกe aplikacije.

Lociranje po ID-u

Ovo je najฤeลกฤ‡a metoda lociranja elemenata jer su ID-ovi namijenjeni da budu jedinstveni za svaki element na stranici. Kad god postoji atribut ID-a, trebao bi biti vaลก prvi izbor za brze, stabilne i ฤitljive testne skripte.

Target Format: id=id elementa

Za ovaj primjer koristit ฤ‡emo Facebook demo stranicu jer Mercury Tours ne koristi ID atribute za glavna polja obrasca.

Korak 1) Koristite ovu demo stranicu https://demo.guru99.com/test/facebook.html za testiranje. Pregledajte tekstualni okvir "E-poลกta ili telefon" pomoฤ‡u ugraฤ‘enih alata za razvojne programere u pregledniku (pritisnite F12 u Chromeu, Edgeu ili Firefox) i zabiljeลพite njegov ID. U ovom sluฤaju, ID je โ€že-poลกtaโ€œ.

Lociranje putem ID-a u Selenium

Korak 2) Lansirati Selenium IDE i unesite "id=email" u Target okvir. Kliknite gumb Pronaฤ‘i i primijetite da je tekstualni okvir โ€žE-poลกta ili telefonโ€œ oznaฤen ลพutom bojom sa zelenim okvirom, ลกto ukazuje na to Selenium IDE je ispravno locirao element.

Lociranje putem provjere identiteta

Lociranje po imenu

Lociranje elemenata po imenu sliฤno je lociranju po ID-u, osim ลกto koristimo โ€œime=โ€ prefiks umjesto toga. Ovaj pristup je koristan kada elementi nemaju ID, ali imaju definirani atribut imena.

Target Format: ime=ime elementa

Za sljedeฤ‡u demonstraciju koristit ฤ‡emo Mercury Obilasci jer svi znaฤajni elementi obrasca na web-mjestu nose atribut imena.

Korak 1) Doฤ‘ite na https://demo.guru99.com/test/newtours/ i upotrijebite alate za razvojne programere u pregledniku kako biste pregledali tekstualno polje โ€žKorisniฤko imeโ€œ. Zabiljeลพite njegov atribut name.

Lociranje po imenu u Selenium

Ovdje je naziv elementa โ€žkorisniฤkoImeโ€œ.

Korak 2) In Selenium IDE, unesite "name=userName" u Target okvir i kliknite gumb Pronaฤ‘i. Selenium IDE bi trebao pronaฤ‡i tekstualni okvir Korisniฤko ime tako da ga oznaฤi.

Lociranje putem provjere imena

Kako locirati element prema nazivu pomoฤ‡u filtara

Filteri su korisni kada nekoliko elemenata dijeli isti atribut imena. Filteri su dodatni atributi koji se koriste za razlikovanje elemenata koji dijele identiฤan naziv. Bez filtera, Selenium bi se prema zadanim postavkama prikazao samo prvi odgovarajuฤ‡i element.

Target Format: naziv=naziv_elementa filter=vrijednost_filtera

Proฤ‘imo kroz primjer.

Korak 1) Prijavite se na Mercury Kule.

Prijavite se Mercury Obilasci koji koriste "tutorial" kao korisniฤko ime i lozinku. Stranica za pronalaลพenje letova trebala bi se pojaviti kao ลกto je prikazano dolje.

Pronaฤ‘ite element prema nazivu pomoฤ‡u filtara

Korak 2) Koristite alate za razvojne programere za pregled atributa VALUE.

Primijetite da radio gumbi Povratno putovanje i Jednosmjerno putovanje dijele isti naziv "tripType". Meฤ‘utim, imaju razliฤite atribute VALUE, pa svaku vrijednost moลพemo koristiti kao filter.

Filtriraj po vrijednosti atributa

Korak 3) Kliknite na prvi redak u editoru.

  • Prvo ฤ‡emo pristupiti radio gumbu Jednosmjerni put. Kliknite prvi redak u Selenium IDE ureฤ‘ivaฤ.
  • U okvir Naredba unesite naredbu โ€žklikniโ€œ.
  • u Target U okvir unesite โ€žname=tripType value=onewayโ€œ. Dio โ€žvalue=onewayโ€œ sluลพi kao naลก filter.

Kliknite naredbu s filtrom

Korak 4) Pritisnite gumb Pronaฤ‘i.

Primijeti da Selenium IDE oznaฤava radio gumb Jednosmjerno zelenom bojom, potvrฤ‘ujuฤ‡i da je elementu uspjeลกno pristupljeno putem njegovog atributa VALUE.

Provjera filtra

Korak 5) Odaberite radio gumb Jednosmjerno.

Pritisnite tipku "X" na tipkovnici za izvrลกavanje naredbe klika. Sada je odabran radio gumb Jednosmjerno.

Odabran je jednosmjerni prijevoz

Istu radnju moลพete izvesti na radio gumbu Povratno putovanje, ovaj put koristeฤ‡i "name=tripType value=povratno putovanje" kao cilj.

Lociranje prema tekstu veze

Ova strategija lokatora primjenjuje se samo na tekstove hiperveza. Vezi pristupamo tako da ispred cilja stavimo prefiks "link=", nakon ฤega slijedi vidljivi tekst hiperveze. Ova metoda je vrlo ฤitljiva i dobro funkcionira za testiranje navigacije.

Target Format: link=tekst_linka

U sljedeฤ‡em primjeru, pristupit ฤ‡emo poveznici โ€žREGISTRACIJAโ€œ koja se nalazi na Mercury Poฤetna stranica Tours.

Korak 1)

  • Prvo se uvjerite da ste odjavljeni iz Mercury Kule.
  • Doฤ‘ite na Mercury Poฤetna stranica Tours.

Korak 2)

  • Pomoฤ‡u alata za razvojne programere provjerite poveznicu "REGISTRACIJA". Tekst poveznice prikazuje se izmeฤ‘u poฤetne i zavrลกne oznake sidra.
  • U ovom sluฤaju, tekst poveznice je โ€žREGISTRACIJAโ€œ. Kopirajte tekst poveznice.

Lociranje prema tekstu veze

Korak 3) Kopirajte tekst poveznice i zalijepite ga u Selenium IDE Target okvir. Dodajte mu ispred "link=".

Link Tekst u Target

Korak 4) Pritisnite gumb Pronaฤ‘i. Selenium IDE ฤ‡e ispravno istaknuti poveznicu REGISTER.

Istaknuti tekst poveznice

Korak 5) Za dodatnu provjeru unesite "clickAndWait" u okvir za naredbe i izvrลกite je. Selenium IDE ฤ‡e uspjeลกno kliknuti na poveznicu REGISTRACIJA i odvesti vas na stranicu za registraciju prikazanu u nastavku.

Stranica za registraciju

Lociranje prema DOM-u (Document Object Model)

The Model objekta dokumenta (DOM), jednostavnim rijeฤima, opisuje kako su HTML elementi strukturirani kao stablo ฤvorova. Selenium IDE moลพe navigirati ovim stablom kako bi pristupio elementima stranice. Prilikom koriลกtenja ove metode, Target Okvir uvijek poฤinje s โ€ždom=dokumentโ€ฆโ€œ. Prefiks โ€ždom=" se obiฤno izostavlja jer Selenium IDE automatski interpretira bilo koju vrijednost koja poฤinje s "document" kao DOM putanju.

Postoje ฤetiri osnovna naฤina za lociranje elementa kroz DOM u Selenium:

  • getElementById
  • getElementsByName
  • dom:name (odnosi se samo na elemente unutar imenovanog obrasca)
  • dom:indeks

Lociranje prema DOM-u โ€“ getElementById

Prvo istraลพimo metodu getElementById DOM-a u SeleniumOva metoda vraฤ‡a jedan element usklaฤ‘ivanjem njegovog atributa ID.

Sintaksa

document.getElementById("id of the element")

  • id elementa = vrijednost atributa ID elementa kojem se pristupa. Ova vrijednost uvijek mora biti unutar navodnika.

Korak 1) Koristite ovu demo stranicu https://demo.guru99.com/test/facebook.htmlIdite do njega i upotrijebite Alate za razvojne programere kako biste provjerili potvrdni okvir "Ostani prijavljen". Zabiljeลพite njegov ID.

Inspekcija getElementById

ID koji bismo trebali koristiti je โ€žpersist_boxโ€œ.

Korak 2) Otvoren Selenium IDE i u Target U okvir unesite document.getElementById(โ€œpersist_boxโ€), a zatim kliknite Pronaฤ‘i. Selenium IDE ฤ‡e pronaฤ‡i potvrdni okvir "Ostani prijavljen/a". Iako ne moลพe istaknuti unutraลกnjost potvrdnog okvira, okruลพuje element jarko zelenim rubom, kao ลกto je prikazano dolje.

Verifikacija getElementById-a

Lociranje prema DOM-u โ€“ getElementsByName

Metoda getElementById pristupa samo jednom elementu istovremeno, i to elementu s navedenim ID-om. Metoda getElementsByName ponaลกa se drugaฤije. Vraฤ‡a niz elemenata koji dijele navedeni naziv. Pojedinaฤnim elementima pristupa se pomoฤ‡u numeriฤkog indeksa koji poฤinje od 0.

Ilustracija getElementById getElementById
Vraฤ‡a samo jedan element. Taj element nosi ID naveden unutar zagrada funkcije getElementById().
Ilustracija getElementsByName getElementsByName
Vraฤ‡a kolekciju elemenata ฤija su imena identiฤna. Svaki element je indeksiran brojem koji poฤinje od 0, poput niza. Odreฤ‘eni element odabirete postavljanjem njegovog indeksa unutar uglatih zagrada u sintaksi ispod.

Sintaksa

document.getElementsByName("name")[index]

  • name = naziv elementa definiran njegovim atributom 'name'
  • indeks = cijeli broj koji oznaฤava koji ฤ‡e se element unutar niza getElementsByName koristiti.

Korak 1) Doฤ‘ite na Mercury Posjetite poฤetnu stranicu Toursa i prijavite se koristeฤ‡i "tutorial" kao korisniฤko ime i lozinku. Preglednik ฤ‡e uฤitati zaslon za pronalaลพenje letova.

Korak 2) Pomoฤ‡u alata za razvojne programere provjerite tri radio gumba na dnu stranice (Ekonomska klasa, Poslovna klasa i Prva klasa). Primijetite da svi imaju isti naziv, โ€žservClassโ€œ.

Inspekcija getElementsByName

Korak 3) Prvo, pristupimo radio gumbu "Ekonomska klasa". Od tri radio gumba, ovaj element se pojavljuje prvi, pa mu je indeks 0. U Selenium IDE, upiลกite document.getElementsByName(โ€œservClassโ€)[0] i kliknite gumb Pronaฤ‘i. Selenium IDE ฤ‡e ispravno prepoznati radio gumb ekonomske klase.

Smjeลกten u ekonomskoj klasi

Korak 4) Promijenite indeksni broj na 1, tako da vaลก Target postaje document.getElementsByName(โ€œservClassโ€)[1]. Kliknite gumb Pronaฤ‘i i Selenium IDE ฤ‡e istaknuti radio gumb "Poslovna klasa" kao ลกto je prikazano dolje.

Smjeลกten u poslovnoj klasi

Lociranje prema DOM โ€“ dom:naziv

Kao ลกto je ranije spomenuto, ova metoda se primjenjuje samo ako se element kojem pristupate nalazi unutar imenovanog obrasca. Put lokatora poฤinje na obrascu, a zatim se po imenu spuลกta do ciljnog elementa.

Sintaksa

document.forms["name of the form"].elements["name of the element"]

  • naziv obrasca = vrijednost atributa name oznake obrasca koja sadrลพi element kojem ลพelite pristupiti
  • ime elementa = vrijednost atributa imena elementa kojem ลพelite pristupiti

Korak 1) Doฤ‘ite na Mercury Poฤetna stranica Tours https://demo.guru99.com/test/newtours/ i upotrijebite Alate za razvojne programere za pregled tekstnog okvira Korisniฤko ime. Primijetite da se nalazi u obrascu pod nazivom "poฤetna stranica".

dom:name Inspekcija

Korak 2) In Selenium IDE, upiลกite document.forms[โ€œhomeโ€].elements[โ€œuserNameโ€] i kliknite gumb Pronaฤ‘i. Selenium IDE ฤ‡e uspjeลกno pristupiti elementu.

dom:name Verifikacija

Lociranje prema DOM โ€“ dom:index

Ova metoda se primjenjuje ฤak i kada element nije unutar imenovanog obrasca jer koristi indeks obrasca umjesto njegovog imena. Ovo je korisno za naslijeฤ‘ene stranice ili automatski generirane obrasce gdje imenovanje nije dostupno.

Sintaksa

document.forms[index of the form].elements[index of the element]

  • indeks obrasca = indeksni broj (poฤevลกi od 0) obrasca u odnosu na cijelu stranicu
  • indeks elementa = indeksni broj (poฤevลกi od 0) elementa u odnosu na oblik koji ga sadrลพi

Pristupit ฤ‡emo tekstualnom okviru โ€žTelefonโ€œ na Mercury Stranica za registraciju tura. Obrazac na ovoj stranici nema ni atribut imena ni atribut ID-a, pa je dobar primjer.

Korak 1) Doฤ‘ite na Mercury Posjetite stranicu za registraciju i pregledajte tekstualni okvir Telefon. Primijetite da okolni obrazac nema atribute ni ID ni ime.

dom:index inspekcija

Korak 2) Unesite document.forms[0].elements[3] u Selenium IDE Target okvir i kliknite gumb Pronaฤ‘i. Selenium IDE ฤ‡e ispravno pristupiti tekstualnom okviru Telefon.

dom:index Verifikacija

Korak 3) Alternativno, moลพete koristiti naziv elementa umjesto njegovog indeksa za isti rezultat. Unesite document.forms[0].elements[โ€œphoneโ€] u Target okvir. Tekstualni okvir Telefon i dalje ฤ‡e biti oznaฤen.

dom:index po imenu

Lociranje pomoฤ‡u XPath-a

XPath je jezik upita koji se koristi za navigaciju XML (Extensible Markup Language) ฤvorovima. Buduฤ‡i da se HTML moลพe smatrati implementacijom XML-a, XPath takoฤ‘er moลพe locirati HTML elemente. To je jedna od najmoฤ‡nijih strategija lokatora u Selenium.

  • Prednost: Moลพe pristupiti gotovo svakom elementu, ukljuฤujuฤ‡i i one bez atributa klase, imena ili ID-a.
  • Hendikep: To je najsloลพenija strategija lokatora zbog mnogih pravila i sintaktiฤkih varijacija.

Moderni alati za razvojne programere preglednika mogu automatski generirati XPath izraze. U Chromeu, Edgeu ili Firefox, desnom tipkom miลกa kliknite element u ploฤi Elementi i odaberite Kopiraj > Kopiraj XPath. U sljedeฤ‡em primjeru pristupit ฤ‡emo slici koja se ne moลพe locirati pomoฤ‡u metoda koje smo ranije opisali.

Korak 1) Doฤ‘ite na Mercury Otvorite poฤetnu stranicu Toursa i upotrijebite Alate za razvojne programere kako biste pregledali naranฤasti pravokutnik desno od ลพutog okvira "Linkovi", kao ลกto je prikazano dolje.

Pregled XPath elemenata

Korak 2) Desnom tipkom miลกa kliknite HTML kod elementa, a zatim odaberite opciju "Kopiraj XPath".

Kopiraj XPath opciju

Korak 3) In Selenium IDE, upiลกite jednu kosu crtu naprijed "/" u Target okvir, a zatim zalijepite XPath kopiran u prethodnom koraku. Ulaz u Target okvir sada treba zapoฤeti s dvije kose crte naprijed โ€œ//โ€.

XPath zalijepljen

Korak 4) Pritisnite gumb Pronaฤ‘i. Selenium IDE ฤ‡e istaknuti naranฤasti okvir, kao ลกto je prikazano dolje.

XPath provjera

Zaลกto je vaลพan odabir pravog lokatora

Odabir ispravne strategije lokatora jedna je od najutjecajnijih odluka u Selenium automatizacija jer izravno utjeฤe na stabilnost skripte, brzinu izvrลกavanja i dugoroฤne troลกkove odrลพavanja. Loลกe odabran lokator moลพe uzrokovati nestabilne testove, laลพne kvarove i ฤeste preinake kad god se promijeni korisniฤko suฤelje aplikacije. Redoslijed preferencija koji preporuฤuju iskusni inลพenjeri automatizacije je prvo ID, zatim Naziv, nakon ฤega slijedi CSS selektor, Tekst poveznice i na kraju XPath.

Lokatori temeljeni na ID-u su najbrลพi jer je pretraลพivanje preglednika optimizirano za jedinstvene identifikatore. Lokatori temeljeni na imenu gotovo su jednako uฤinkoviti kada su imena jedinstvena. CSS selektori i XPath pruลพaju fleksibilnost, ali su obiฤno sporiji i krhkiji kada programeri refaktoriraju DOM. Tekst poveznice izvrstan je za navigacijske poveznice, ali nudi ograniฤenu ponovnu upotrebu.

Stabilna automatizacija takoฤ‘er ovisi o suradnji s programerima. Kada testeri zatraลพe dosljedne i smislene ID ili data-* atribute tijekom pregleda koda, trajnost lokatora znaฤajno se poboljลกava. Izbjegavajte oslanjanje na automatski generirane ID-ove (poput onih koje proizvode okviri) jer se oni mogu mijenjati izmeฤ‘u verzija. Davanjem prioriteta ฤitljivim, namjerno voฤ‘enim lokatorima, timovi mogu odrลพati testne pakete odrลพivima i smanjiti tehniฤki dug kako se aplikacija razvija.

Najbolje prakse za pisanje pouzdanih lokatora

Pouzdani lokatori su temelj odrลพivog Selenium paket testova. Sljedeฤ‡e prakse pomaลพu u smanjenju kvarova skripti, poboljลกanju ฤitljivosti i otpornosti testova na promjene korisniฤkog suฤelja.

  1. Preferirajte jedinstvene ID-ove: Uvijek prvo provjerite atribut ID-a. ID-ovi bi trebali biti jedinstveni unutar stranice i najuฤinkovitiji su izbor.
  2. Koristite semantiฤko ime i atribute data-*: Potaknite programere da dodaju stabilne atribute testiranja kao ลกto su data-testid ili data-qa. Oni ostaju dosljedni ฤak i kada se promijene CSS klase.
  3. Izbjegavajte apsolutni XPath: Apsolutne putanje poput /html/body/div[2]/div[3]/span lako se prekidaju. Koristite relativne XPath izraze s atributima kao ลกto je //input[@name='userName'].
  4. Kombinirajte atribute za preciznost: Kada jedan atribut nije jedinstven, kombinirajte viลกe atributa (na primjer, //button[@type='submit' i @name='login']) kako biste ciljali ispravan element.
  5. Mudro koristite tekst: Lokatori koji ovise o vidljivom tekstu mogu se prelomiti u razliฤitim jeziฤnim lokalizacijama. Koristite lokatore temeljene na tekstu samo kada je sadrลพaj stabilan i jednojeziฤan.
  6. Centralizirajte lokatore: Pohranite lokatore u klasu Page Object Model (POM) kako bi se aลพuriranja mogla vrลกiti na jednom mjestu, a ne u mnogim testnim skriptama.
  7. Validiraj u Alatima za razvojne programere: Prije dodavanja lokatora skripti, testirajte ga u konzoli preglednika koristeฤ‡i $x(โ€œ//xpathโ€) za XPath ili document.querySelector za CSS kako biste potvrdili da vraฤ‡a toฤno jedan element.
  8. Izbjegavajte lokatore temeljene na indeksu kad god je to moguฤ‡e: Pozicije indeksa poput [3] ovise o redoslijedu elemenata. ฤŒak i manje promjene rasporeda mogu pomaknuti indeks i prekinuti skriptu.

Dosljednom primjenom ovih praksi, inลพenjeri automatizacije stvaraju testne pakete koji se mogu skalirati meฤ‘u timovima i podnose ฤesta aลพuriranja korisniฤkog suฤelja uz minimalno odrลพavanje.

Pitanja i odgovori

Lokator ID-ova je najbrลพi jer preglednici optimiziraju pretrage za jedinstvene identifikatore. Kada ID-ovi nisu dostupni, Name i CSS Selector su obiฤno brลพi od XPath-a, koji opseลพnije prolazi kroz DOM tijekom razrjeลกavanja elemenata.

Apsolutni XPath poฤinje od korijena HTML dokumenta i prati potpunu putanju, ลกto ga ฤini nestabilnim. Relativni XPath poฤinje bilo gdje u DOM-u pomoฤ‡u atributa kao ลกto je //input[@id='email'], nudeฤ‡i stabilnije i odrลพivije ciljanje elemenata.

Firebug je ukinut 2017. Moderni preglednici ukljuฤuju ugraฤ‘ene alate za razvojne programere kojima se pristupa putem F12 u Chromeu, Edgeu i FirefoxOvi alati omoguฤ‡uju inspekciju elemenata, kopiranje XPath-a, kopiranje CSS selektora i testiranje konzole za validaciju lokatora.

Da. Alati pokretani umjetnom inteligencijom kao ลกto su Testim, Mabl i Functionize analiziraju DOM i generiraju lokatore s moguฤ‡noลกฤ‡u samoobnavljanja. Ove platforme koriste strojno uฤenje za automatsko prilagoฤ‘avanje lokatora kada se korisniฤko suฤelje promijeni, smanjujuฤ‡i odrลพavanje i nestabilne kvarove testiranja.

Samoobnavljajuฤ‡i mehanizmi pokretani umjetnom inteligencijom uฤe atribute okruลพujuฤ‡e okoline, poloลพaj i DOM kontekst svakog elementa. Kada izvorni lokator ne uspije, mehanizam odabire najbliลพe podudaranje koristeฤ‡i rezultate vjerojatnosti, omoguฤ‡ujuฤ‡i testnim skriptama da nastave s radom bez ruฤne intervencije.

Saลพmite ovu objavu uz: