Επαληθεύστε το στοιχείο Παρουσίαση και αναμονή για εντολή εισόδου Selenium

⚡ Έξυπνη Σύνοψη

Επαληθεύστε την παρουσία στοιχείου και τις εντολές waitFor στις Selenium Το IDE επιβεβαιώνει ότι μια σελίδα περιέχει τα στοιχεία και το κείμενο που αναμένει μια δοκιμή και διακόπτει την αναπαραγωγή μέχρι να γίνει αληθής μια δυναμική συνθήκη πριν εκτελεστεί το επόμενο βήμα.

  • 🔘 Έλεγχοι στοιχείων: Η συνάρτηση verifyElementPresent επιστρέφει την τιμή TRUE όταν ο εντοπιστής ταιριάζει με κάτι στη σελίδα και η συνάρτηση verifyElementNotPresent είναι το ακριβές αντίστροφό του.
  • ☑️ Έλεγχοι κειμένου: Το verifyTextPresent αναζητά σε ολόκληρη τη σελίδα και κάνει διάκριση πεζών-κεφαλαίων, επομένως η λέξη "Atlanta" δεν ταιριάζει ποτέ με τη λέξη "atlanta".
  • Έλεγχοι θέσης: Τα verifyElementPositionLeft και verifyElementPositionTop συγκρίνουν την απόκλιση pixel ενός στοιχείου από την άκρη της σελίδας.
  • 🧪 Φορτώσεις σελίδας: Οι εντολές andWait, όπως η clickAndWait, διακόπτουν προσωρινά το σενάριο μέχρι να ολοκληρωθεί η φόρτωση μιας νέας σελίδας.
  • Δυναμικό περιεχόμενο: Οι εντολές waitFor αναμένουν μια συνθήκη αντί για φόρτωση σελίδας, κάτι που ταιριάζει σε οθόνες AJAX που δεν επαναφορτώνονται ποτέ.
  • 📊 Τρέχον IDE: Η επέκταση του προγράμματος περιήγησης μετονομάζει αυτά τα βήματα και δίνει σε κάθε εντολή αναμονής το δικό της χρονικό όριο χιλιοστών του δευτερολέπτου.

Επαληθεύστε την παρουσία του στοιχείου και την εντολή waitFor στην Selenium IDE

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

⚠️ Σημείωση για τις εκδόσεις: Τα παρακάτω στιγμιότυπα οθόνης προέρχονται από το πρωτότυπο Firefox-πρόσθετο Selenium IDE, το οποίο δεν διανέμεται πλέον, και χρησιμοποιούν τα ονόματα camelCase Selenese. Το τρέχον IDE είναι ένα Chrome, Firefox και Edge επέκταση προγράμματος περιήγησηςΗ συμπεριφορά που περιγράφεται εδώ εξακολουθεί να ισχύει, αλλά άλλαξαν αρκετά ονόματα εντολών — ένας χάρτηςping Ο πίνακας εμφανίζεται αργότερα σε αυτό το άρθρο και κάθε αρχική εντολή και στιγμιότυπο οθόνης διατηρείται ακριβώς όπως δημοσιεύτηκε.

Επαληθεύστε την παρουσία ενός στοιχείου

Μπορούμε να χρησιμοποιήσουμε τις ακόλουθες δύο εντολές για να επαληθεύσουμε την παρουσία ενός στοιχείου:

  • verifyElementPresent – επιστρέφει TRUE εάν το καθορισμένο στοιχείο βρέθηκε στη σελίδα. ΛΑΘΟΣ αν διαφορετικά
  • verifyElementNotPresent – επιστρέφει TRUE εάν το καθορισμένο στοιχείο ΔΕΝ ΒΡΕΘΗΚΕ πουθενά στη σελίδα. ΛΑΘΟΣ αν υπάρχει.

Και οι δύο εντολές δέχονται ένα στοιχείο τοποθετών στο Target πεδίο — ένα αναγνωριστικό, ένα όνομα, ένας επιλογέας CSS, ένα κείμενο συνδέσμου ή ένα XPath έκφραση — και καμία από τις δύο δεν χρειάζεται τιμή.

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

Selenium Σκριπτ IDE που χρησιμοποιεί verifyElementPresent στο πλαίσιο userName και verifyElementNotPresent στο πλαίσιο First Name

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

Επαληθεύστε την παρουσία ενός συγκεκριμένου κειμένου στην εντολή Selenium

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

  • verifyTextPresent – επιστρέφει TRUE εάν η καθορισμένη συμβολοσειρά κειμένου βρέθηκε κάπου στη σελίδα. ΛΑΘΟΣ αν διαφορετικά
  • verifyTextNotPresent – επιστρέφει TRUE εάν η καθορισμένη συμβολοσειρά κειμένου ΔΕΝ ΒΡΕΘΗΚΕ πουθενά στη σελίδα. ΛΑΘΟΣ αν βρέθηκε

Θυμηθείτε ότι αυτές οι εντολές κάνουν διάκριση πεζών-κεφαλαίων.

Το παρακάτω αρχείο καταγραφής δείχνει την ίδια σελίδα ελεγμένη δύο φορές με δύο ορθογραφίες της ίδιας φράσης.

Selenium Αρχείο καταγραφής IDE που εμφανίζει το verifyTextPresent να περνάει από Ατλάντα σε Λας Βέγκας και να αποτυγχάνει από Ατλάντα σε Λας Βέγκας

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

Επαληθεύστε τη συγκεκριμένη θέση ενός στοιχείου

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

Selenium Το IDE υποδεικνύει τη θέση ενός στοιχείου μετρώντας (σε pixel) πόσο απέχει από την αριστερή ή την επάνω άκρη του παραθύρου του προγράμματος περιήγησης.

  • verifyElementPositionLeft – επαληθεύει εάν ο καθορισμένος αριθμός pixel ταιριάζει με την απόσταση του στοιχείου από το αριστερό άκρο της σελίδας. Αυτό θα επιστρέψει FALSE εάν η καθορισμένη τιμή δεν ταιριάζει με την απόσταση από το αριστερό άκρο.
  • verifyElementPositionTop – επαληθεύει εάν ο καθορισμένος αριθμός pixel ταιριάζει με την απόσταση του στοιχείου από την επάνω άκρη της σελίδας. Αυτό θα επιστρέψει FALSE εάν η καθορισμένη τιμή δεν ταιριάζει με την απόσταση από την επάνω άκρη.

Το παρακάτω σενάριο καταγράφει τις αναμενόμενες μετατοπίσεις pixel στη στήλη Τιμή.

Selenium Βήματα IDE χρησιμοποιώντας verifyElementPositionLeft και verifyElementPositionTop με τιμές pixel στη στήλη Value

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

Εντολές αναμονής Selenium

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

Ακολουθούν οι τύποι εντολών αναμονής Selenium

και εντολές αναμονής

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

παραδείγματα είναι

  • κάντε κλικ και περιμένετε
  • πληκτρολογήστε και περιμένετε
  • επιλέξτε Και Περιμένετε

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

Εγγεγραμμένο βήμα clickAndWait κρατώντας πατημένο το Selenium Σκριπτ IDE μέχρι να ολοκληρωθεί η φόρτωση της επόμενης σελίδας

αναμονή για εντολές

Αυτές είναι εντολές που περιμένουν να γίνει αληθής μια καθορισμένη συνθήκη πριν προχωρήσετε στην επόμενη εντολή (ανεξάρτητα από τη φόρτωση μιας νέας σελίδας). Αυτές οι εντολές είναι πιο κατάλληλες για χρήση σε δυναμικούς ιστότοπους που βασίζονται σε AJAX που αλλάζουν τιμές και στοιχεία χωρίς να φορτώνουν ξανά ολόκληρη τη σελίδα. Τα παραδείγματα περιλαμβάνουν:

  • περιμένωΤίτλο
  • waitForTextPresent
  • περιμένωΕιδοποίηση

Εξετάστε το σενάριο του Facebook παρακάτω.

Φόρμα εγγραφής στο Facebook που εμφανίζει τον σύνδεσμο "Γιατί πρέπει να δώσω τον σύνδεσμο για τα γενέθλιά μου πριν γίνει κλικ σε αυτόν"

Μπορούμε να χρησιμοποιήσουμε έναν συνδυασμό "κλικ" και "waitForTextPresent" για να επαληθεύσουμε την παρουσία του κειμένου "Παροχή των γενεθλίων σας".

Selenium Βήματα IDE για σύζευξη κάντε κλικ με waitForTextPresent για να περιμένετε το Παροχή του κειμένου γενεθλίων σας

Δεν μπορούμε να χρησιμοποιήσουμε το clickAndWait επειδή καμία σελίδα δεν φορτώθηκε κάνοντας κλικ στο "Γιατί πρέπει να παρέχω τα γενέθλιά μου;" Σύνδεσμος. Αν το κάνουμε, το τεστ θα αποτύχει

Ο ίδιος κανόνας ισχύει για οποιοδήποτε περιεχόμενο εισάγεται από σενάριο και όχι από πλοήγηση, γι' αυτό και Οθόνες που βασίζονται σε AJAX σχεδόν πάντα χρειάζεται waitFor αντί για andWait.

Εντολές Assert vs Verify vs waitFor σε Selenium IDE

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

Πρόθεμα Τι κάνει Σχετικά με την αποτυχία καλύτερα χρησιμοποιείται για
διεκδικώ Ελέγχει αμέσως μια συνθήκη Καταγράφει την αποτυχία και διακόπτει την δοκιμαστική περίπτωση Προϋποθέσεις — μια σύνδεση που πρέπει να είναι επιτυχής πριν αποκτήσει νόημα οτιδήποτε άλλο
επαληθεύει Ελέγχει αμέσως μια συνθήκη Καταγράφει την αποτυχία και συνεχίζει με την επόμενη εντολή Ανεξάρτητοι έλεγχοι, όπως πολλές ετικέτες σε μία σελίδα επιβεβαίωσης
περίμενεΓια Δημοσκοπήσεις μέχρι να γίνει αληθής η συνθήκη Καταγράφει την αποτυχία μόλις λήξει το χρονικό όριο και στη συνέχεια συνεχίζει Οτιδήποτε εμφανίζεται αργά — απαντήσεις AJAX, περιστρεφόμενα παράθυρα, διάλογοι

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

Εντολές επαλήθευσης και αναμονής στο ρεύμα Selenium IDE

The FirefoxΤο IDE του πρόσθετου (plugin IDE) που παρήγαγε τα παραπάνω στιγμιότυπα οθόνης αποσύρθηκε και το σύνολο εντολών ανακατασκευάστηκε για την τρέχουσα επέκταση προγράμματος περιήγησης. Αρκετά ονόματα Selenese επέζησαν, μερικά μετονομάστηκαν και μερικά αφαιρέθηκαν. Ο παρακάτω πίνακας αντιστοιχίζει τις εντολές που χρησιμοποιούνται σε αυτό το άρθρο με τις σημερινές τους ισοδύναμες, οι οποίες προέρχονται από την επίσημη Selenium Αναφορά εντολής IDE.

Παλαιότερη εντολή Selenese Εντολή στο τρέχον IDE
verifyElementPresent επαλήθευση της παρουσίας στοιχείου
verifyElementNotPresent επαλήθευση ότι το στοιχείο δεν υπάρχει
verifyTextPresent επαλήθευση κειμένου (με πεδίο εφαρμογής έναν εντοπιστή στοιχείων, όχι ολόκληρη τη σελίδα)
verifyTextNotPresent επαλήθευση όχι κειμένου (εμβέλεια σε έναν εντοπιστή στοιχείων)
επαλήθευσηΤίτλου επαλήθευση τίτλου
verifyElementPositionLeft / verifyElementPositionTop Δεν υπάρχει ισοδύναμο — οι δηλώσεις θέσης απορρίφθηκαν
κάντε κλικ στο κουμπί "ΚαιΠεριμένετε", πληκτρολογήστε "ΚαιΠεριμένετε", επιλέξτε "ΚαιΠεριμένετε" Χωρίς επίθημα AndWait — η εντολή open περιμένει ήδη τη φόρτωση μιας σελίδας
waitForElementPresent αναμονή για την παρουσία στοιχείου, με χρόνο αναμονής σε χιλιοστά του δευτερολέπτου
περιμένωΕιδοποίηση επιβεβαιώστε την ειδοποίηση ή επαληθεύστε το κείμενο της ειδοποίησης μετά την εμφάνιση του παραθύρου διαλόγου

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

Συνηθισμένα σφάλματα με τις εντολές Verify και waitFor

Τα περισσότερα αναφερόμενα προβλήματα με αυτές τις εντολές δεν αποτελούν ελαττώματα στο IDE. Η παρακάτω λίστα καλύπτει τις βλάβες που εμφανίζονται συχνότερα και τι διορθώνει την καθεμία.

  • Το στοιχείο υπάρχει αλλά ο έλεγχος εξακολουθεί να αποτυγχάνει. Η παρουσία και η ορατότητα είναι διαφορετικές καταστάσεις. Ένα στοιχείο που είναι κρυμμένο πίσω από έναν κανόνα CSS εξακολουθεί να υπάρχει στο DOM, επομένως συνδυάστε τον έλεγχο παρουσίας με την αναμονή για ορατό στοιχείο όταν η δοκιμή εξαρτάται από το αν ο χρήστης το βλέπει πραγματικά.
  • Ένας έλεγχος κειμένου αποτυγχάνει σε διατύπωση που μοιάζει πανομοιότυπη. Τα μη διακοπτόμενα κενά, τα κενά στο τέλος και οι σγουρές απόστροφοι που αντιγράφονται από ένα έγγραφο σχεδίασης διακόπτουν μια ακριβή αντιστοίχιση. Πληκτρολογήστε ξανά την αναμενόμενη συμβολοσειρά χειροκίνητα αντί να την επικολλήσετε.
  • Μια εντολή αναμονής λήγει σε μια σελίδα που φορτώθηκε σαφώς. Το στοιχείο βρίσκεται συνήθως μέσα σε ένα iframe. Εκτελέστε πρώτα την εντολή select frame, διαφορετικά ο εντοπιστής αξιολογείται σε σχέση με το λάθος έγγραφο.
  • Το clickAndWait κολλάει σε μια εφαρμογή μίας σελίδας. Δεν πραγματοποιείται πλοήγηση, επομένως δεν υπάρχει λόγος αναμονής. Αντικαταστήστε το με ένα κλικ συν την κατάλληλη εντολή waitFor.
  • Ένας έλεγχος θέσης περνάει τοπικά και αποτυγχάνει στον διακομιστή δημιουργίας. Το μέγεθος οθόνης και η απόδοση της γραμματοσειράς διαφέρουν. Προτιμήστε έλεγχο παρουσίας ή κειμένου ή ορίστε ένα σαφές μέγεθος παραθύρου στην αρχή της δοκιμής.
  • Όλη η σουίτα σταματά στην πρώτη αναντιστοιχία. Καταγράφηκε μια εντολή assert ενώ προοριζόταν για εντολή verification. Αλλάξτε το πρόθεμα και η εκτέλεση θα αναφέρει κάθε αποτυχία αντί μόνο την πρώτη.

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

Συχνές Ερωτήσεις

Το παλαιότερο IDE μοιραζόταν ένα καθολικό χρονικό όριο σε κάθε βήμα waitFor, κάτι που άλλαξε με την εντολή setTimeout. Η τρέχουσα επέκταση λαμβάνει έναν σαφή χρόνο αναμονής σε χιλιοστά του δευτερολέπτου για κάθε εντολή wait, επομένως μια μεμονωμένη οθόνη αργής κίνησης δεν αναγκάζει πλέον κάθε άλλο βήμα να περιμένει για το ίδιο χρονικό διάστημα.

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

Δεν ισχύει. Η παρουσία σημαίνει ότι ο κόμβος υπάρχει στο DOM, κάτι που παραμένει αληθές για στοιχεία που είναι κρυμμένα από CSS ή τοποθετημένα εκτός οθόνης. Όταν η δοκιμή εξαρτάται από το αν ο χρήστης θα δει κάτι, προσθέστε την επιλογή "αναμονή για ορατό στοιχείο" δίπλα στον έλεγχο παρουσίας.

Ναι, και το τρέχον IDE το απαιτεί. Η εντολή verify text (επαλήθευση κειμένου) δέχεται έναν εντοπιστή στοιχείων συν την αναμενόμενη συμβολοσειρά, η οποία είναι πιο αυστηρή από την παλιά αναζήτηση σε ολόκληρη τη σελίδα και εμποδίζει ένα άσχετο στοιχείο μενού να ικανοποιήσει έναν έλεγχο που δεν προοριζόταν ποτέ να ικανοποιήσει.

Code Η εξαγωγή μετατρέπει κάθε εντολή σε μια ισοδύναμη πρόταση στη γλώσσα-στόχο, επομένως ένα βήμα αναμονής γίνεται μια ρητή αναμονή WebDriver. Διαβάστε το δημιουργημένο αρχείο πριν το εμπιστευτείτε, επειδή τα χρονικά όρια και η συμπεριφορά αποτυχίας soft-versus-hard δεν επιβιώνουν πάντα άθικτα μετά τη μετάφραση.

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

Χειρίζεται καλά το μηχανικό μέρος — μετατρέποντας ένα βήμα αναμονής σε ένα WebDriverWait με μια αναμενόμενη συνθήκη. RevΔείτε το χρονικό όριο που επιλέγει και την συνθήκη που επιλέγει, καθώς μια παραγόμενη συνθήκη παρουσίας συχνά χρειάζεται να είναι μια συνθήκη ορατότητας.

Οι εντοπιστές αξιολογούνται σε σχέση με το τρέχον επιλεγμένο έγγραφο και ένα iframe είναι ξεχωριστό. Εκτελέστε πρώτα την εντολή select frame, έπειτα την εντολή check και επιστρέψτε στο αρχικό έγγραφο στη συνέχεια, ώστε τα ακόλουθα βήματα να μην αναζητηθούν σε λάθος περιβάλλον.

Συνοψίστε αυτήν την ανάρτηση με: