Selenium Firefox Profil: Ghid de configurare

โšก Rezumat inteligent

Firefox profilul stocheazฤƒ marcajele, parolele, extensiile ศ™i preferinศ›ele care aparศ›in unui utilizator de browser ศ™i Selenium WebDriver poate รฎncฤƒrca un profil dedicat, astfel รฎncรขt fiecare rulare automatฤƒ sฤƒ รฎnceapฤƒ dintr-o stare identicฤƒ ศ™i previzibilฤƒ a browserului.

  • ๐Ÿ”˜ Noศ›iuni de bazฤƒ despre profil: A Firefox Profilul conศ›ine marcajele, parolele salvate, suplimentele, certificatele ศ™i preferinศ›ele unui utilizator รฎntr-un singur folder.
  • โ˜‘๏ธ Locaศ›ia profilului: Windows, Linux ศ™i macOS fiecare stocheazฤƒ folderele de profil sub o cale diferitฤƒ รฎn directorul utilizatorului.
  • โœ… Crearea profilului: Managerul de profil รฎncorporat se deschide cu comanda firefox.exe -p ศ™i creeazฤƒ un profil de automatizare curat รฎn cinci paศ™i.
  • ๐Ÿงช Code acces: Clasa ProfilesIni citeศ™te profiles.ini, iar getProfile returneazฤƒ profilul numit ca FirefoxObiect de profil.
  • ๐Ÿ› ๏ธ Sintaxa curentฤƒ: Selenium 3 ศ™i 4 trec prin profil FirefoxOptions.setProfile รฎn loc de FirefoxConstructor de drivere.
  • โš ๏ธ Preferinศ›e: setPreference controleazฤƒ folderul de descฤƒrcare, notificฤƒrile, limba ศ™i gestionarea certificatelor รฎnainte de lansarea browserului.

Selenium Firefox Ghid de configurare a profilului

Selenium Firefox Profil

Firefox profil este o colecศ›ie de setฤƒri, personalizare, suplimente ศ™i alte setฤƒri de personalizare care pot fi fฤƒcute pe Firefox Browser. Puteศ›i personaliza Firefox profil pentru a vฤƒ potrivi Selenium cerinศ›a de automatizare.

De asemenea, Firefox sau orice alt browser se ocupฤƒ de setฤƒrile certificatelor SSL. Aศ™adar, automatizarea lor are foarte mult sens รฎmpreunฤƒ cu codul de execuศ›ie a testului.

Pe scurt, un profil reprezintฤƒ setฤƒrile personale ale unui utilizator. Cรขnd doriศ›i sฤƒ rulaศ›i un profil fiabil automatizare pe o Firefox browser, se recomandฤƒ crearea unui profil separat. Un profil dedicat exclude, de asemenea, datele de navigare zilnicฤƒ din test, acesta fiind primul lucru de exclus atunci cรขnd un Selenium Scriptul se comportฤƒ diferit pe douฤƒ maศ™ini.

Locaศ›ia folderului de profil pe disc

Firefox profilul este exact ca pe diferiศ›i utilizatori Firefox. Firefox salveazฤƒ informaศ›ii personale precum marcaje, parole ศ™i preferinศ›e utilizator, care pot fi editate, ศ™terse sau create folosind managerul de profiluri.

Captura de ecran de mai jos prezintฤƒ un folder de profil aศ™a cum apare pe disc, denumit dupฤƒ profil cu un prefix aleatoriu.

Firefox folderul de profil afiศ™at pe disc cu prefixul sฤƒu aleatoriu

Locaศ›ia profilului este dupฤƒ cum urmeazฤƒ

  • Pentru Windows > C:\Utilizatori\ \AppData\Roaming\Mozilla\Firefox\Profiles\nume_profil.implicit
  • Pentru Linux > ~/.mozilla/firefox/nume_profil.implicit/
  • Pentru Mac OS X > ~/Bibliotecฤƒ/Asistenศ›ฤƒ aplicaศ›ii/Firefox/Profiles/profile_name.default/

Pentru a rula un succes Selenium Test, a Firefox profilul ar trebui sฤƒ fie -

  • Uศ™or de รฎncฤƒrcat
  • Setฤƒri proxy dacฤƒ este necesar
  • Alte setฤƒri specifice utilizatorului bazate pe nevoile de automatizare

Cum sฤƒ setaศ›i Firefox Profil pentru Selenium Teste

Sฤƒ vedem pas cu pas cum se creeazฤƒ un Firefox profil.

Pas 1) Inchide Firefox browser-ul

รŽn primul pas, รฎnchideศ›i Firefox dacฤƒ este deja deschis. Managerul de profil nu va porni รฎn timp ce Firefox fereastra ruleazฤƒ.

Pas 2) Deschide Run (Windows tasta + R) ศ™i tastaศ›i firefox.exe โ€“p

Caseta de dialog Executare ar trebui sฤƒ arate ca รฎn captura de ecran de mai jos รฎnainte de a apฤƒsa OK.

Windows Rulaศ›i dialogul cu comanda firefox.exe -p tastatฤƒ

Notฤƒ: Dacฤƒ nu se deschide, puteศ›i รฎncerca sฤƒ utilizaศ›i calea completฤƒ รฎntre ghilimele.

  • Pe 32 de biศ›i Windowsโ€žC:\Program Files\Mozilla Firefoxโ€ž\firefox.exeโ€ โ€“p
  • Pe 64 de biศ›i Windows (32 de biศ›i Firefox): โ€žC:\Program Files (x86)\Mozilla Firefoxโ€ž\firefox.exeโ€ โ€“p

Pas 3) Alegeศ›i profilul utilizatorului

Acum, o casetฤƒ de dialog numitฤƒ Firefox se va deschide, aศ™a cum se aratฤƒ mai jos.

Firefox Caseta de dialog Alegeศ›i profilul utilizatorului care listeazฤƒ profilurile existente

Pas 4) Creeaza un profil

Selectaศ›i opศ›iunea Creare profil afiศ™atฤƒ รฎn captura de ecran urmฤƒtoare pentru a porni expertul.

Ecranul de bun venit al Asistentului de creare a profilului din Firefox manager de profil

Acum, selectaศ›i opศ›iunea Creare profil din fereastrฤƒ ศ™i se va deschide un expert. Faceศ›i clic pe urmฤƒtorul.

Pas 5) Daศ›i numele profilului dvs

Introduceศ›i un nume pentru profilul de automatizare รฎn cรขmpul evidenศ›iat mai jos ศ™i finalizaศ›i expertul.

Introducerea unui nou Firefox nume de profil รฎn Asistentul de creare a profilului

Acum profilul dvs. este gata, vฤƒ puteศ›i selecta profilul ศ™i deschide FirefoxDe aici, profilul se comportฤƒ ca orice altฤƒ sesiune de browser, deci a primul script WebDriver va rula รฎmpotriva acestuia neschimbat.

Veศ›i observa cฤƒ noul Firefox fereastra nu va afiศ™a niciunul dintre marcajele ศ™i pictogramele favorite.

Notฤƒ: Ultimul profil selectat se va รฎncฤƒrca automat la urmฤƒtoarea Firefox lansa. Va trebui sฤƒ reporniศ›i managerul de profil dacฤƒ doriศ›i sฤƒ schimbaศ›i profilurile.

Script de automatizare pentru Selenium

Odatฤƒ ce profilul este creat, urmฤƒtorul pas este sฤƒ รฎl รฎncฤƒrcaศ›i din cod. Pentru a accesa profilul nou creat Firefox profil รฎntr-un Selenium Pentru testarea software-ului WebDriver, trebuie sฤƒ folosim clasa ProfilesIni รฎncorporatฤƒ a WebDriver ศ™i metoda sa getProfile, aศ™a cum se aratฤƒ mai jos.

โš ๏ธ Notฤƒ privind versiunea: Fragmentele din aceastฤƒ secศ›iune sunt originale Selenium Formularul 2. รŽn prezent Selenium elibereazฤƒ clasa รฎn care trฤƒieศ™te org.openqa.selenium.firefox.ProfilesIni - .intern subpachetul a fost abandonat โ€” iar profilul este predat ศ™oferului prin FirefoxOpศ›iuni. Consultaศ›i FirefoxSecศ›iunea de opศ›iuni de mai jos pentru echivalentul modern.

Selenium cod pentru profil

Acesta este un cod pentru implementarea unui profil, care poate fi รฎncorporat รฎn Selenium cod.

ProfilesIni profile = new ProfilesIni();

// aceasta va crea un obiect pentru Firefox profil

FirefoxProfile myprofile = profile.getProfile("xyzProfile");

// aceasta va iniศ›ializa Firefox ลŸofer

WebDriver driver = new FirefoxDriver(myprofile)

Sฤƒ vedem implementarea acestui cod รฎn exemplele urmฤƒtoare.

Firefox Exemplu de profil 1

Primul exemplu รฎncarcฤƒ un profil dupฤƒ nume. Captura de ecran de mai jos prezintฤƒ acelaศ™i script รฎn editor.

Firefox Exemplu de profil 1 script care รฎncarcฤƒ un profil dupฤƒ nume รฎn editor

// import the package
import java.io.File;
      import java.util.concurrent.TimeUnit;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
public class FirefoxProfile {
 	public static void main(String[] args) {
	ProfilesIni profile = new ProfilesIni();
	FirefoxProfile myprofile = profile.getProfile("xyzProfile");
// Initialize Firefox driver
	WebDriver driver = new FirefoxDriver(myprofile);
//Maximize browser window
	driver.manage().window().maximize();
//Go to URL which you want to navigate
	driver.get("http://www.google.com");
//Set  timeout  for 5 seconds so that the page may load properly within that time
	driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//close firefox browser
	driver.close();
}

}

Explicaศ›ie pentru cod

Mai jos este explicaศ›ia codului linie cu linie.

  • Code linia 2-7: Mai รฎntรขi trebuie sฤƒ importฤƒm pachetul necesar pentru a rula Selenium cod.
  • Code linia 8: Creaศ›i o clasฤƒ publicฤƒ โ€žFirefoxProfil."
  • Code linia 9: Creaศ›i un obiect (trebuie sฤƒ aveศ›i cunoศ™tinศ›e de bazฤƒ despre conceptele de POO).
  • Code linia 10-11: Trebuie sฤƒ iniศ›ializฤƒm Firefox profil cu obiectul profilul_meu.
  • Code linia 13: Creaศ›i obiect pentru Firefox.
  • Code linia 15: Maximizare fereastrฤƒ.
  • Code linia 17: driver.get este folosit pentru a naviga la locaศ›ia datฤƒ URL.
  • Code linia 19: Setarea timeout-ului este utilizatฤƒ pentru a aศ™tepta un timp, astfel รฎncรขt browserul sฤƒ poatฤƒ รฎncฤƒrca pagina รฎnainte de a trece la pagina urmฤƒtoare.
  • Code linia 21: รŽnchidere Firefox.

Sฤƒ mai vedem un exemplu.

Firefox Exemplu de profil 2

Al doilea exemplu omite profiles.ini ศ™i indicฤƒ direct folderul profilului, aศ™a cum aratฤƒ captura de ecran a editorului.

Firefox Exemplu de profil 2, script de indicare FirefoxProfil la o cale de folder

import java.io.File;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;

public class FirefoxProfile2{
public static void main(String[] args) {

// Create object for FirefoxProfile
	FirefoxProfilemyprofile=newFirefoxProfile (newFile("\c:users\AppData\MozillaFirefoxProfile_name.default "));  
// Initialize Firefox driver    
	WebDriver driver = new FirefoxDriver(myprofile);
//Maximize browser window       
	driver.manage().window().maximize();
//Go to URL      
	driver.get("http://www.google.com");
//Set  timeout      
	driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//close firefox browser  
	driver.close();
    }

Explicaศ›ie pentru cod

Mai jos este explicaศ›ia codului linie cu linie.

  • Code linia 1-6: Mai รฎntรขi trebuie sฤƒ importฤƒm pachetul necesar pentru a rula Selenium cod.
  • Code linia 8: Creaศ›i o clasฤƒ publicฤƒ FirefoxProfil2.
  • Code linia 12: Creaศ›i obiectul profilului meu referindu-vฤƒ la calea exactฤƒ.
  • Code linia 14: Creaศ›i obiect pentru Firefox.
  • Code linia 16: Maximizare fereastrฤƒ.
  • Code linia 18: driver.get este folosit pentru a naviga la locaศ›ia datฤƒ URL.
  • Code linia 20: Setarea timeout-ului este utilizatฤƒ pentru a aศ™tepta un timp, astfel รฎncรขt browserul sฤƒ poatฤƒ รฎncฤƒrca pagina รฎnainte de a trece la pagina urmฤƒtoare.
  • Code linia 22: รŽnchidere Firefox.

Reศ›ineศ›i cฤƒ calea din acest fragment este scrisฤƒ exact aศ™a cum este prezentatฤƒ รฎn tutorialul original. Pe o maศ™inฤƒ realฤƒ, barele oblice inversate trebuie sฤƒ fie introduse prin escape, de exemplu โ€žC:\\Users\\guru99\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\xyzProfile.defaultโ€.

Cum se utilizeazฤƒ a Firefox Profil รฎn Selenium 4 cu FirefoxOpลฃiuni

Ambele exemple de mai sus se compileazฤƒ doar รฎmpotriva Selenium 2. Douฤƒ lucruri s-au schimbat ulterior, iar fiecare tutorial actual foloseศ™te forma mai nouฤƒ.

  • ProfilesIni s-a mutat din intern sub-pachet, deci importul este acum org.openqa.selenium.firefox.ProfilesIni.
  • Firefoxศ˜ofer (FirefoxConstructorul Profile) a fost eliminat. Profilul este ataศ™at la un FirefoxObiectul Options, iar obiectul options este transmis driverului.
  • Selenium 4 timeout-uri acceptฤƒ un java.time.Duration รฎn loc de o valoare plus un TimeUnit, deci implicitlyWait(5, TimeUnit.SECONDS) devine implicitlyWait(Duration.ofSeconds(5)).

Tabelul de mai jos mapeazฤƒ fiecare apel vechi cu รฎnlocuitorul sฤƒu.

Apel vechi (Selenium 2) Apel curent (Selenium 3 ศ™i 4)
importฤƒ org.openqa.selenium.firefox.internal.ProfilesIni; importฤƒ org.openqa.selenium.firefox.ProfilesIni;
nou Firefoxศ˜ofer (profilul meu) opศ›iuni.setProfile(profilulmeu); nou Firefoxศ˜ofer (opศ›iuni)
implicitWait(5, TimeUnit.SECONDS) implicitWait(Durata.deSecunde(5))
Proprietatea System.set pentru geckodriver Rezolvat automat de Selenium Manager

Rescris pentru o versiune curentฤƒ, Exemplul 1 aratฤƒ astfel.

import java.time.Duration;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.ProfilesIni;

public class FirefoxProfileSelenium4 {
    public static void main(String[] args) {
        ProfilesIni allProfiles = new ProfilesIni();
        FirefoxProfile myprofile = allProfiles.getProfile("xyzProfile");

        FirefoxOptions options = new FirefoxOptions();
        options.setProfile(myprofile);

        WebDriver driver = new FirefoxDriver(options);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("https://www.google.com");
        driver.quit();
    }
}

Cฤƒutarea profilului รฎn sine este neschimbatฤƒ: ProfilesIni citeศ™te รฎn continuare profiles.ini din Firefox folderul application-data ศ™i getProfile returneazฤƒ รฎn continuare null atunci cรขnd numele nu se potriveศ™te cu un profil, aศ™a cฤƒ meritฤƒ adฤƒugatฤƒ o verificare null รฎnainte de pornirea driverului. Acelaศ™i obiect de opศ›iuni conศ›ine ศ™i argumentele utilizate รฎn altฤƒ parte, cum ar fi cele pentru maximizarea sau redimensionarea ferestrei browserului.

Cum sฤƒ setaศ›i Firefox Preferinศ›e profil รฎn Selenium

Un profil salvat este doar jumฤƒtate din poveste. Majoritatea automatizฤƒrilor necesitฤƒ o serie de preferinศ›e aplicate รฎn cod, astfel รฎncรขt acelaศ™i comportament sฤƒ fie aplicat suitei pe orice maศ™inฤƒ. Metoda setPreference scrie aceste valori รฎn copia profilului รฎnainte Firefox lanseaza.

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", "C:\\selenium-downloads");
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
profile.setPreference("dom.webnotifications.enabled", false);
profile.setPreference("intl.accept_languages", "es");

FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile);
WebDriver driver = new FirefoxDriver(options);

Preferinศ›ele de mai jos acoperฤƒ cazurile care apar cel mai des รฎn scripting-ul zilnic.

Preferinลฃฤƒ Ceea ce controleazฤƒ
browser.download.folderList Setaศ›i la 2 pentru a utiliza un folder de descฤƒrcare personalizat รฎn loc de cel implicit al sistemului.
browser.download.dir Calea absolutฤƒ Firefox salveazฤƒ descฤƒrcฤƒrile รฎn.
browser.helperApps.neverAsk.saveToDisk Tipurile MIME au fost salvate fฤƒrฤƒ a afiศ™a caseta de dialog pentru descฤƒrcare.
dom.notificฤƒri web.activate Setaศ›i la fals pentru a suprima notificฤƒrile push web.
intl.accept_languages Antetul Accept-Language, util pentru rularea localizฤƒrii.
general.useragent.override รŽnlocuieศ™te ศ™irul de caractere al agentului utilizator trimis de browser.

Douฤƒ limite meritฤƒ cunoscute. Preferinศ›ele trebuie setate รฎnainte de crearea driverului, deoarece WebDriver copiazฤƒ profilul la lansare, iar modificฤƒrile ulterioare sunt ignorate. WebDriver รฎศ™i rezervฤƒ, de asemenea, un set mic de preferinศ›e de care are nevoie pentru a comunica cu browserul ศ™i le suprascrie pe cele atribuite. Deoarece aceste valori se aflฤƒ รฎn profil ศ™i nu รฎn script, ele sunt transmise ศ™i mai departe. testare cross browser ruleazฤƒ fฤƒrฤƒ nicio modificare a codului de test.

Comun Firefox Erori de profil รฎn Selenium ศ™i Cum sฤƒ le remediaศ›i

Problemele legate de profil apar de obicei ca o eroare de compilare sau ca un browser care se deschide cu setฤƒri greศ™ite. Tabelul listeazฤƒ erorile raportate cel mai des, รฎmpreunฤƒ cu cauzele fiecฤƒreia.

Simptom Provoca Repara
Constructorul Firefoxศ˜ofer (FirefoxProfilul) este nedefinit Constructorul a fost รฎnlฤƒturat dupฤƒ Selenium 2. รŽnfฤƒศ™uraศ›i profilul รฎn FirefoxOpศ›iuni ศ™i transmiteศ›i รฎn schimb obiectul opศ›iuni.
Nu se poate rezolva importul org.openqa.selenium.firefox.internal.ProfilesIni Clasa a ieศ™it din subpachetul intern. Importฤƒ fiศ™ierul org.openqa.selenium.firefox.ProfilesIni.
NullPointerException pe getProfile Numele profilului nu corespunde cu nicio intrare din profiles.ini. Redeschideศ›i managerul de profiluri ศ™i copiaศ›i numele exact, inclusiv majuscule/minuscule.
Ta Firefox Profilul nu poate fi รฎncฤƒrcat. Este posibil sฤƒ lipseascฤƒ sau sฤƒ fie inaccesibil. O alta Firefox instanศ›a conศ›ine deja profilul sau calea folderului este greศ™itฤƒ. รŽnchideศ›i fiecare Firefox fereastrฤƒ, apoi verificaศ›i calea รฎn raport cu locaศ›iile enumerate mai sus.
O preferinศ›ฤƒ nu are niciun efect A fost setatฤƒ dupฤƒ pornirea driverului sau WebDriver o rezervฤƒ. Mutฤƒ โ€‹โ€‹fiecare apel setPreference deasupra FirefoxConstructor de drivere.

Dacฤƒ browserul porneศ™te corect, dar scriptul tot eศ™ueazฤƒ ulterior, probabil cฤƒ profilul nu este cauza. gestionarea excepศ›iilor รฎn Selenium este de obicei ruta mai rapidฤƒ din acel punct.

รŽntrebฤƒri frecvente

Nu. FirefoxDriverul nu editeazฤƒ niciodatฤƒ un profil preexistent. Copiazฤƒ directorul profilului รฎntr-o locaศ›ie temporarฤƒ, aplicฤƒ preferinศ›ele necesare WebDriver ศ™i lanseazฤƒ browserul din acea copie, astfel รฎncรขt marcajele ศ™i parolele salvate sฤƒ rฤƒmรขnฤƒ neatinse.

Da. Orice extensie instalatฤƒ รฎn profil se รฎncarcฤƒ odatฤƒ cu browserul. De asemenea, puteศ›i apela profile.addExtension(new File(โ€œpath/to/extension.xpiโ€)) pentru a ataศ™a una la momentul execuศ›iei, ceea ce menศ›ine profilul de pe disc curat.

Python nu are echivalent ProfilesIni. Point FirefoxProfilul din directorul de profil, apoi atribuiศ›i-l la options.profile รฎnainte de a construi driverul. Selenium Python legฤƒturile cloneazฤƒ apoi acel folder exact aศ™a cum Java nu.

Instrumentele de testare asistate de inteligenศ›ฤƒ artificialฤƒ comparฤƒ preferinศ›ele capturate la rulฤƒrile reuศ™ite cu profilul curent ศ™i cu deviaศ›iile de semnalizare, cum ar fi un proxy sau un folder de descฤƒrcare care s-a modificat. Unele framework-uri folosesc, de asemenea, รฎnvฤƒศ›area automatฤƒ pentru a detecta instabilitฤƒศ›ile legate de profil รฎnainte ca acesta sฤƒ eศ™ueze la compilare.

Copilotul GitHub genereazฤƒ rapid ศ™ablonul standard, dar adesea emite elementele eliminate Firefoxศ˜ofer (FirefoxConstructorul Profile) รฎnvฤƒศ›at din cod mai vechi. Confirmaศ›i รฎntotdeauna cฤƒ sugestia foloseศ™te FirefoxOptions.setProfile ศ™i pachetul curent รฎnainte de a-l valida.

Da. Apelaศ›i options.addArguments(โ€ž-headlessโ€) รฎmpreunฤƒ cu options.setProfile(profile). Profilul furnizeazฤƒ preferinศ›e ศ™i extensii exact ca รฎnainte, deoarece modul headless modificฤƒ doar modul รฎn care Firefox randeazฤƒ, nu cum citeศ™te directorul profilului sฤƒu.

Deoarece WebDriver lucreazฤƒ pe o copie temporarฤƒ ศ™i o ศ™terge la sfรขrศ™itul sesiunii. Pentru a pฤƒstra modificฤƒrile, editaศ›i profilul manual รฎn managerul de profiluri sau setaศ›i preferinศ›ele รฎn cod, astfel รฎncรขt fiecare rulare sฤƒ รฎnceapฤƒ din aceeaศ™i stare cunoscutฤƒ.

Nu รฎntotdeauna, dar ajutฤƒ. Ataศ™area profilului la FirefoxOpศ›iunile livreazฤƒ preferinศ›ele รฎmpreunฤƒ cu sarcina utilฤƒ a capabilitฤƒศ›ilor, astfel รฎncรขt un nod la distanศ›ฤƒ aplicฤƒ acelaศ™i folder de descฤƒrcฤƒri, proxy ศ™i gestionare a certificatelor ca ศ™i maศ™ina localฤƒ.

Rezumaศ›i aceastฤƒ postare cu: