Δημιουργία πλαισίου βάσει δεδομένων, βάσει λέξεων-κλειδιών και υβριδικού πλαισίου σεληνίου



Αυτό το ιστολόγιο εξηγεί τι είναι ένα πλαίσιο Selenium, τα οφέλη του και πώς να εφαρμόσετε πλαίσια βάσει δεδομένων, βάσει λέξεων-κλειδιών και υβριδικών στο σελήνιο.

Την προηγουμενη σε αυτήν τη σειρά σας έδωσαν έκθεση σε βασικές έννοιες στη δοκιμή Selenium.Ωστόσο, σε αυτό το blog, θα σας πω πώς να χρησιμοποιήσετε ένα πλαίσιο Selenium για τη βελτιστοποίηση της δομής του κώδικα και αυτό θα σας φέρει πιο κοντά για να γίνετε .

Τι είναι το πλαίσιο Selenium;

Το σελήνιο πλαίσιο είναι μια δομή κώδικα για να κάνει τη συντήρηση κώδικα απλούστερη και την αναγνωσιμότητα του κώδικα καλύτερη. Ένα πλαίσιο περιλαμβάνει τη διάσπαση ολόκληρου του κώδικα σε μικρότερα κομμάτια κώδικα, τα οποία ελέγχουν μια συγκεκριμένη λειτουργικότητα.





μια σημαντική διαφορά μεταξύ ενός χάκερ και ενός ηθικού χάκερ είναι:

Ο κώδικας είναι δομημένος έτσι ώστε, το «σύνολο δεδομένων» να διαχωρίζεται από την πραγματική «δοκιμαστική θήκη», η οποία θα ελέγχει τη λειτουργικότητα της εφαρμογής ιστού. Μπορεί επίσης να δομηθεί με τρόπο όπου, οι δοκιμαστικές περιπτώσεις που πρέπει να εκτελεστούν καλούνται (επικαλούνται) από μια εξωτερική εφαρμογή (όπως .csv)

Υπάρχουν πολλά πλαίσια εκεί έξω, αλλά 3 κοινά πλαίσια (-ες) Selenium είναι:



Αυτά τα πλαίσια θα συζητηθούν με μια επίδειξη σε αυτό το ιστολόγιο. Αλλά προτού προχωρήσω περισσότερο, επιτρέψτε μου να σας πω γιατί πρέπει να δημιουργηθεί ένα πλαίσιο Selenium και ποια οφέλη θα αποκομίσετε από τη χρήση τους.

Γιατί χρειαζόμαστε ένα πλαίσιο σεληνίου;

Χωρίς ένα πλαίσιο, θα υπάρχει μια δοκιμαστική θήκη που θα περιλαμβάνει ολόκληρη τη λειτουργικότητα της δοκιμής. Το τρομακτικό μέρος είναι ότι αυτή η μοναδική δοκιμαστική θήκη έχει τη δυνατότητα να ανέλθει σε ένα εκατομμύριο γραμμές κώδικα. Είναι λοιπόν αρκετά προφανές ότι μια τεράστια δοκιμαστική θήκη θα είναι δύσκολο να διαβαστεί. Ακόμα κι αν θέλετε να τροποποιήσετε κάποια λειτουργικότητα αργότερα, τότε θα δυσκολευτείτε να τροποποιήσετε τον κώδικα.

Από την εφαρμογή ενός πλαισίου, θα έχει ως αποτέλεσμα μικρότερα αλλά πολλαπλά κομμάτια κώδικα, υπάρχουν διάφορα οφέλη.



Οφέλη του πλαισίου Selenium

  • Αυξημένη επαναχρησιμοποίηση κώδικα
  • Βελτιωμένη αναγνωσιμότητα κώδικα
  • Υψηλότερη φορητότητα
  • Μειωμένο σενάριοσυντήρηση

Τώρα που γνωρίζετε τα βασικά του πλαισίου, επιτρέψτε μου να εξηγήσω καθένα από αυτά λεπτομερώς.

Πλαίσιο βάσει δεδομένων

Ένα πλαίσιο βάσει δεδομένων στο Σελήνιο είναι η τεχνική διαχωρισμού του «συνόλου δεδομένων» από την πραγματική «δοκιμαστική υπόθεση» (κωδικός). Αυτό το πλαίσιο εξαρτάται πλήρως από τα δεδομένα δοκιμής εισόδου. Τα δεδομένα δοκιμής τροφοδοτούνται από εξωτερικές πηγές, όπως ένα αρχείο excel, αρχείο .CSV ή οποιαδήποτε βάση δεδομένων.

πλαίσιο βάσει δεδομένων - πλαίσιο σεληνίου - edureka

Δεδομένου ότι η δοκιμαστική θήκη διαχωρίζεται από το σύνολο δεδομένων, μπορούμε εύκολα να τροποποιήσουμε τη δοκιμαστική θήκη μιας συγκεκριμένης λειτουργικότητας χωρίς να κάνουμε χονδρικές αλλαγές στον κωδικό σας. Για παράδειγμα, εάν θέλετε να τροποποιήσετε τον κώδικα για τη λειτουργία σύνδεσης, τότε μπορείτε να το τροποποιήσετε αντί να χρειάζεται να τροποποιήσετε οποιοδήποτε άλλο εξαρτημένο τμήμα του ίδιου κώδικα.

Εκτός από αυτό, μπορείτε επίσης να ελέγξετε εύκολα πόσα δεδομένα πρέπει να δοκιμαστούν. Μπορείτε εύκολα να αυξήσετε τον αριθμό των παραμέτρων δοκιμής προσθέτοντας περισσότερα πεδία ονόματος χρήστη και κωδικού πρόσβασης στο αρχείο excel (ή άλλες πηγές).

Για παράδειγμα, αν πρέπει να ελέγξω τη σύνδεση σε μια ιστοσελίδα, τότε μπορώ να διατηρήσω το σύνολο διαπιστευτηρίων ονόματος χρήστη και κωδικού πρόσβασης σε ένα αρχείο excel και να μεταβιβάσω τα διαπιστευτήρια στον κώδικα για να εκτελέσω αυτοματοποίηση στο πρόγραμμα περιήγησης σε ένα ξεχωριστό αρχείο κλάσης Java.

Χρήση του Apache POI με Selenium WebDriver

Το WebDriver δεν υποστηρίζει άμεσα την ανάγνωση αρχείων excel. Ως εκ τούτου χρησιμοποιούμε Apache POI για ανάγνωση / εγγραφή σε οποιοδήποτε έγγραφο του Microsoft Office. Μπορείτε να κατεβάσετε το Apache POI (σύνολο αρχείων JAR) από εδώ . Κατεβάστε το αρχείο zip ή το αρχείο tar σύμφωνα με την απαίτησή σας και τοποθετήστε τα μαζί με το σετ JAR Selenium.

Ο συντονισμός μεταξύ του κύριου κώδικα και του συνόλου δεδομένων θα γίνει με προσοχή Πάροχοι δεδομένων TestNG, που είναι μια βιβλιοθήκη που έρχεται ως μέρος των αρχείων Apache POI JAR. Για επίδειξη, έχω δημιουργήσει ένα αρχείο excel με το όνομα 'LoginCredentials' στο οποίο τα ονόματα χρήστη και οι κωδικοί πρόσβασης έχουν αποθηκευτεί σε διαφορετικές στήλες.

Ρίξτε μια ματιά στον παρακάτω κώδικα για να κατανοήσετε τη δοκιμαστική περίπτωση. Είναι ένας απλός κώδικας για τη δοκιμή της λειτουργικότητας σύνδεσης μιας εφαρμογής κράτησης πτήσης.

πακέτο DataDriven import org.openqa.selenium. Με εισαγωγή org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.AfterM Method εισαγωγή org.testng.annotations.DataProvider import org.testng.annotations.Test δημόσια κλάση DDTExcel {ChromeDriver driver @Test (dataProvider = 'testdata') public void DemoProject (String username, String password) ρίχνει InterruptException {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = νέο ChromeDriver () driver.get ('http://newtours.demoaut.com/') driver.findElement (By.name ('userName')). sendKeys (username) driver.findElement (By.name ('password') sendKeys (password) driver.findElement (By.name ('login')). ​​κάντε κλικ στο () Thread.sleep (5000) Assert.assertTrue (driver.getTitle (). match ('Εύρεση πτήσης: Mercury Tours: '),' Μη έγκυρα διαπιστευτήρια ') System.out.println (' Επιτυχής είσοδος ')} @AfterMethod void ProgramTermination () {driver.quit ()} @DataProvider (name =' testdata ') δημόσιο αντικείμενο [] [] TestDa taFeed () {ReadExcelFile config = new ReadExcelFile ('C: UsersVardhanworkspaceSeleniumLoginCredentials.xlsx') int rows = config.getRowCount (0) Object [] [] διαπιστευτήρια = νέο αντικείμενο [σειρές] [2] για (int i = 0i

Εάν παρατηρήσατε από ψηλά, έχουμε μια μέθοδο που ονομάζεται 'TestDataFeed ()'. Σε αυτήν τη μέθοδο, έχω δημιουργήσει μια παρουσία αντικειμένου μιας άλλης κλάσης με το όνομα 'ReadExcelFile'. Κατά τη δημιουργία αυτού του αντικειμένου, έχω τροφοδοτήσει τη διαδρομή του αρχείου excel που περιέχει τα δεδομένα. Έχω ορίσει περαιτέρω ένα βρόχο για την ανάκτηση του κειμένου από το βιβλίο εργασίας του excel.

Όμως, για την ανάγνωση των δεδομένων από έναν δεδομένο αριθμό φύλλου, αριθμό στήλης και αριθμό σειράς, οι κλήσεις πραγματοποιούνται στην τάξη 'ReadExcelFile'. Ο κωδικός του «ReadExcelFile» μου είναι παρακάτω.

πακέτο DataDriven import java.io.File import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook δημόσια τάξη ReadExcelFile {XSSFWorkbook wb XSSFSheet excelPath) {δοκιμάστε {File src = new File (excelPath) FileInputStream fis = new FileInputStream (src) wb = new XSSFWorkbook (fis)} catch (Exception e) {System.out.println (e.getMessage ())}} δημόσια String getData (int sheetnumber, int baris, int στήλη) {sheet = wb.getSheetAt (sheetnumber) String data = sheet.getRow (γραμμή) .getCell (στήλη) .getStringCellValue () return data} public int getRowCount (int sheetIndex) { int row = wb.getSheetAt (sheetIndex) .getLastRowNum () σειρά = σειρά + 1 σειρά επιστροφής}}

Πρώτα σημειώστε τις βιβλιοθήκες που έχω εισαγάγει. Έχω εισαγάγει Apache POI XSSF βιβλιοθήκες που χρησιμοποιούνται για την ανάγνωση / εγγραφή δεδομένων για την υπεροχή αρχείων. Εδώ, έχω δημιουργήσει έναν κατασκευαστή (αντικείμενο της ίδιας μεθόδου) για να περάσω τις τιμές: αριθμός φύλλου, αριθμός σειράς και αριθμός στήλης. Για να κατανοήσετε καλύτερα αυτό το πλαίσιο, σας παρακαλώ να διαβάσετε το παρακάτω βίντεο, όπου το εξήγησα με δομημένο τρόπο.

Πλαίσιο βάσει δεδομένων στο Selenium WebDriver | Εκπαιδευτικό σελήνιο

Τώρα ας προχωρήσουμε στο πλαίσιο, δηλαδή το πλαίσιο βάσει λέξεων-κλειδιών.

Πλαίσιο βάσει λέξεων-κλειδιών

Το πλαίσιο βάσει λέξεων-κλειδιών είναι μια τεχνική στην οποία όλες οι λειτουργίες και οι οδηγίες που πρέπει να εκτελούνται γράφονται ξεχωριστά από την πραγματική περίπτωση δοκιμής. Η ομοιότητα που έχει με το πλαίσιο Data Driven είναι ότι, οι λειτουργίες που θα εκτελεστούν αποθηκεύονται ξανά σε ένα εξωτερικό αρχείο όπως το φύλλο Excel.

Οι λειτουργίες για τις οποίες αναφέρομαι δεν είναι τίποτα άλλο από τις μεθόδους που πρέπει να εκτελεστούν ως μέρος μιας δοκιμαστικής υπόθεσης. Το πλεονέκτημα με το πλαίσιο βάσει λέξεων-κλειδιών είναι ότι μπορείτε εύκολα να ελέγξετε τις λειτουργίες που θέλετε να δοκιμάσετε. Μπορείτε να καθορίσετε τις μεθόδους που ελέγχουν τη λειτουργικότητα της εφαρμογής στο αρχείο excel. Έτσι, θα δοκιμάζονται μόνο τα ονόματα των μεθόδων που καθορίζονται στο excel.

Για παράδειγμα, για τη σύνδεση στην εφαρμογή ιστού, μπορούμε να γράψουμε πολλές μεθόδους στην κύρια δοκιμαστική περίπτωση, στην οποία κάθε δοκιμαστική περίπτωση θα δοκιμάσει συγκεκριμένη λειτουργικότητα. Για την παρουσίαση του προγράμματος οδήγησης του προγράμματος περιήγησης μπορεί να υπάρχει μία μέθοδος, για την εύρεση των πεδίων ονόματος χρήστη και κωδικού πρόσβασης, θα μπορούσαν να υπάρχουν μέθοδοι, για την πλοήγηση σε μια ιστοσελίδα θα μπορούσε να υπάρχει άλλη μέθοδος κ.λπ.

χειρισμός αρχείων σε παράδειγμα java

Ρίξτε μια ματιά στον παρακάτω κώδικα για να κατανοήσετε πώς φαίνεται το πλαίσιο. Οι γραμμές που σχολιάζονται στον παρακάτω κώδικα χρησιμεύουν ως εξήγηση εάν δεν καταλαβαίνετε.

KeywordDriven import org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.Test import java.util.concurrent.TimeUnit εισαγωγή org.openqa.selenium.By import org.openqa.selenium.WebDriver Δημόσια τάξη Ενέργειες {public static WebDriver driver public static void openBrowser () {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = νέο ChromeDriver ()} δημόσιο static void navigate () {driver .manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS) driver.get ('http://newtours.demoaut.com')} δημόσιο στατικό void input_Username () {driver.findElement (By.name (' userName ')). sendKeys (' mercury ')} public static void input_Password () {driver.findElement (By.name (' password ')). sendKeys (' mercury ')} public static void click_Login () {driver.findElement (By.name ('login')). ​​Κάντε κλικ ()} @Test public static void verifikasi_login () {String pageTitle = driver.getTitle () Assert.assertEquals (pageTitle, 'Find a Flight: Mercury Tours) : ')} δημόσιο στατικό κενό closeBrowser () {driver.quit ()}}

Όπως μπορείτε να δείτε, οι διαφορετικές λειτουργίες που πρέπει να δοκιμαστούν υπάρχουν σε ξεχωριστές μεθόδους που περιμένουν να κληθούν. Τώρα, αυτές οι μέθοδοι θα κληθούν από άλλη τάξη, με βάση την παρουσία του ονόματος της μεθόδου στο αρχείο excel. Και ομοίως, για να διαβάσω το αρχείο excel, και να στείλω πίσω τα αποτελέσματα, έγραψα άλλη τάξη. Και οι δύο εμφανίζονται παρακάτω.

Το αρχείο τάξης που επικαλείται τις μεθόδους, είναι αυτό.

πακέτο KeywordDriven δημόσια τάξη DriverScript {public static void main (String [] args) ρίχνει Εξαίρεση {// Δήλωση της διαδρομής του αρχείου Excel με το όνομα του αρχείου Excel String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Εδώ περνάμε τη διαδρομή του Excel και το SheetName ως ορίσματα για σύνδεση με το αρχείο Excel ReadExcelData.setExcelFile (sPath, 'Sheet1') // Οι τιμές με σκληρή κωδικοποίηση χρησιμοποιούνται για το Excel και τις στήλες προς το παρόν // Οι τιμές με σκληρή κωδικοποίηση χρησιμοποιούνται για τη σειρά Excel & στήλες για τώρα // Σε μεταγενέστερα κεφάλαια θα αντικαταστήσουμε αυτές τις τιμές με κωδικοποίηση με varibales // Αυτός είναι ο βρόχος για την ανάγνωση των τιμών της στήλης 3 (Action Keyword) σειρά προς σειρά για (int iRow = 1iRow<=7iRow++) { String sActions = ReadExcelData.getCellData(iRow, 1) //Comparing the value of Excel cell with all the keywords in the 'Actions' class if(sActions.equals('openBrowser')) { //This will execute if the excel cell value is 'openBrowser' //Action Keyword is called here to perform action Actions.openBrowser() } else if(sActions.equals('navigate')) { Actions.navigate() } else if(sActions.equals('input_Username')) { Actions.input_Username() } else if(sActions.equals('input_Password')) { Actions.input_Password() } else if(sActions.equals('click_Login')) { Actions.click_Login() } else if(sActions.equals('verify_Login')) { Actions.verify_login() } else if(sActions.equals('closeBrowser')) { Actions.closeBrowser() } } } } 

Και το αρχείο τάξης που διαβάζει τις τιμές του Excel είναι αυτό.

πακέτο KeywordDriven import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFCell δημόσια τάξη ReadExcelic XSSFSheet ExcelWSheet private static XSSFWorkbook ExcelWBook private static XSSFCell Cell // Αυτή η μέθοδος είναι να ορίσετε τη διαδρομή αρχείου και να ανοίξετε το αρχείο Excel // Pass Excel Path and SheetName ως επιχειρήματα σε αυτήν τη μέθοδο δημόσια στατικά void setExcelFile (String Path, String SheetName) Εξαίρεση {FileInputStream ExcelFile = new FileInputStream (Path) ExcelWBook = νέο XSSFWorkbook (ExcelFile) ExcelWSheet = ExcelWBook.getSheet (SheetName)} // Αυτή η μέθοδος είναι η ανάγνωση των δεδομένων δοκιμής από το κελί του Excel // Σε αυτό περνάμε παραμέτρους / ορίσματα καθώς το Row Num και το Col Num public static String getCellData (int RowNum, int ColNum) ρίχνει την Εξαίρεση {Cell = ExcelWSheet.getRow (RowNum) .getCell (ColNum) String CellData = Cell.getStringCellValue () επιστροφή CellData}}

Τώρα, ας προχωρήσουμε στο τελευταίο μέρος αυτού του ιστολογίου πλαισίου Selenium, όπου θα σας δείξω πώς να φτιάξετε ένα υβριδικό πλαίσιο.

Υβριδικό πλαίσιο

Το υβριδικό πλαίσιο είναι μια τεχνική στην οποία μπορούμε να κάνουμε την καλύτερη δυνατή χρήση των πλαισίων σελήνιο βάσει δεδομένων και βάσει λέξεων-κλειδιών. Χρησιμοποιώντας τα παραδείγματα που εμφανίζονται παραπάνω σε αυτό το ιστολόγιο, μπορούμε να δημιουργήσουμε ένα υβριδικό πλαίσιο αποθηκεύοντας τις μεθόδους για εκτέλεση σε ένα αρχείο excel (προσέγγιση βάσει λέξεων-κλειδιών) και μεταβιβάζοντας αυτά τα ονόματα μεθόδων στο Τάξη προβληματισμού Java (προσέγγιση βάσει δεδομένων) αντί να δημιουργήσετε ένα Εάν / άλλο βρόχο στην κατηγορία 'DriverScript'.

Ρίξτε μια ματιά στην τροποποιημένη κλάση 'DriverScript' στο παρακάτω απόσπασμα κώδικα.Εδώ, αντί να χρησιμοποιούν πολλαπλούς βρόχους If / Else, χρησιμοποιείται προσέγγιση βάσει δεδομένων για την ανάγνωση των ονομάτων μεθόδου από το αρχείο excel.

πακέτο HybridFramework import java.lang.reflect.M Method public class DriverScriptJava {// Αυτό είναι ένα αντικείμενο κλάσης, που δηλώνεται ως «δημόσιο στατικό» // Για να μπορεί να χρησιμοποιηθεί εκτός του πεδίου της κύριας [] μεθόδου δημόσια στατική Ενέργειες δράσηΚλειδί δημόσια στατική String sActions // Αυτό είναι αντικείμενο κλάσης προβληματισμού, που δηλώνεται ως «δημόσιο στατικό» // Για να μπορεί να χρησιμοποιηθεί εκτός του πεδίου της κύριας [] μεθόδου δημόσια στατική μέθοδος Μέθοδος [] δημόσια στατική κενή κύρια (String [] args) ρίχνει Εξαίρεση {// Δήλωση της διαδρομής του αρχείου Excel με το όνομα του αρχείου Excel String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Εδώ περνάμε τη διαδρομή Excel και το SheetName για σύνδεση με το αρχείο Excel // Αυτή η μέθοδος δημιουργήθηκε προηγουμένως ReadExcelData.setExcelFile (sPath, 'Sheet1') // Οι σκληρές κωδικοποιημένες τιμές χρησιμοποιούνται για τη σειρά και τις στήλες του Excel προς το παρόν // Αργότερα, θα χρησιμοποιήσουμε αυτές τις σκληρές κωδικοποιημένες τιμές πολύ πιο αποτελεσματικά // Αυτός είναι ο βρόχος για ανάγνωση τις τιμές της σειράς στήλης (Λέξη-κλειδί δράσης) κατά σειρά // Αυτό σημαίνει ότι αυτός ο βρόχος θα εκτελέσει όλα τα βήματα που αναφέρονται για τη δοκιμαστική υπόθεση στο φύλλο δοκιμαστικών βημάτων για (int iRow = 1iRow<=7iRow++) { sActions = ReadExcelData.getCellData(iRow, 1) //A new separate method is created with the name 'execute_Actions' //You will find this method below of the this test //So this statement is doing nothing but calling that piece of code to execute execute_Actions() } } //This method contains the code to perform some action //As it is completely different set of logic, which revolves around the action only, it makes sense to keep it separate from the main driver script //This is to execute test step (Action) private static void execute_Actions() throws Exception { //Here we are instantiating a new object of class 'Actions' actionKeywords = new Actions() //This will load all the methods of the class 'Actions' in it. //It will be like array of method, use the break point here and do the watch method = actionKeywords.getClass().getMethods() //This is a loop which will run for the number of actions in the Action Keyword class //method variable contain all the method and method.length returns the total number of methods for(int i = 0i

Για να κατανοήσετε καλύτερα αυτήν την έννοια των πλαισίων βάσει δεδομένων, βάσει λέξεων-κλειδιών και υβριδικών οδηγών, σας ζητώ να παρακολουθήσετε το παρακάτω βίντεο.

Selenium Framework χρησιμοποιώντας Java | Σελήνιο Σεμινάριο | Σελήνιο Εκπαίδευση στο Διαδίκτυο

Ελπίζω ότι αυτό το blog ήταν χρήσιμο για εσάς και σας έδωσε μια σαφή κατανόηση του τι είναι ένα πλαίσιο Selenium, πώς είναι ωφέλιμο και πώς να φτιάξετε τη δομή του κώδικα χρησιμοποιώντας αυτά τα 3 πλαίσια Selenium. Μείνετε συντονισμένοι σε περισσότερα ιστολόγια αυτής της σειράς.

Εάν θέλετε να μάθετε το Σελήνιο και να δημιουργήσετε μια καριέρα στον τομέα των δοκιμών, τότε ρίξτε μια ματιά στο διαδραστικό μας, ζωντανό διαδικτυακό εδώ, συνοδεύεται από υποστήριξη 24 * 7 για να σας καθοδηγήσει καθ 'όλη τη διάρκεια της μαθησιακής σας περιόδου. Οι έννοιες που σχετίζονται με το «Selenium Framework» καλύπτουν σε βάθος το μάθημα του Edureka.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων και θα επικοινωνήσουμε μαζί σας.