ReCaptcha (c'est le
«captcha» bien-aimé) est l'une des choses les plus douloureuses qu'un automate de test peut rencontrer sur son chemin. Des milliers de vidéos enregistrées par des immigrants de l'Inde ensoleillée se promènent sur le Web concernant ce qui danse avec un tambourin, il est possible de tromper cette bête. En effet, il est assez difficile d'essayer d'interagir avec les scripts programmés avec une chose dont le but principal est de s'assurer que "vous n'êtes pas un robot".
Un avertissement très important:
il est impossible de tromper un captcha.Si vous avez déjà rencontré ce problème et que vous lisez cet article en essayant de rechercher une recette de panacée sur Google, sachez qu'il n'existe pas. De plus, dans votre tête, des idées innovantes sont probablement apparues concernant la simulation d'un comportement utilisateur réaliste à l'aide de WebDriver, en survolant des éléments au hasard, en cliquant sur des entrées et en plaçant Thread.sleep () soigneusement placé. Il est absolument connu que cette approche ne fonctionnera pas, ne perdez pas votre temps en vain.
Il s'avère qu'il n'y a pas d'issue?Tout n'est pas si pessimiste. Parfois, il suffit d’essayer de vous donner la réponse la plus précise à la question "Quel est le défi auquel je suis confronté?" et regarder la situation plus large. Dans la plupart des cas, vous comprendrez que votre objectif n'est pas de tromper le captcha, mais de le contourner afin de tester la fonctionnalité cachée derrière lui. Sur l'exemple de mon cas, je partagerai avec vous les options que j'ai trouvées pour résoudre la tâche.
Contexte: nous avons intégré une partie de notre produit dans un service tiers, et voulions vérifier si tout allait bien de leur côté, car ils ne couvrent pas les parties tierces de leur plateforme. Pour accéder à nos fonctionnalités, vous devez d'abord vous connecter. C'est alors que j'ai rencontré le captcha face à face. Ensuite, je donne toutes les options que j'ai essayées pour contourner ce problème.
Ne travaille pas
Connectez-vous via Google ou Facebook
En plus de l'authentification classique, il y avait une connexion canonique avec Google / Facebook. Bien sûr, leur "captcha" y était également présent, donc cette option n'a pas aidé à résoudre le problème.
Simuler le comportement des utilisateurs
Oui, je l'ai essayé aussi. C'était drôle, mais trop naïf.
Les travailleurs
Profils Chrome / Firefox
Parlons de la première option "live". Les pilotes de ces navigateurs (chromedriver / geckodriver) ont la possibilité de démarrer sous un profil utilisateur prédéfini. Il stocke tous les mots de passe, cookies, sessions et même l'historique et les signets du navigateur. C'est-à-dire ainsi, nous avons simplement raté l'étape de connexion qui est absolument sans importance pour notre tâche, et nous sommes donc arrivés directement à la page avec l'objet de test. Il est implémenté comme suit:
- Créez un profil de navigateur «propre»
- Entrez manuellement le captcha et connectez-vous à la ressource souhaitée
- Copiez le profil requis dans notre projet (HOWTO pour Firefox et Chrome )
Après cela, nous devons dire au pilote qu'il doit être chargé à partir du profil spécifié:
Firefox:
Chrome:
Cette approche s'est avérée bonne lors des tests sur une machine locale avec un navigateur installé et les gecko- / cromedrivers habituels, mais il y avait des problèmes lors de l'exécution sur Jenkins. Nous augmentons le concentrateur et les nœuds Selenium à l'intérieur du cluster Kubernetes, nous avons donc rencontré des problèmes sous la forme d'un répertoire trop long pour monter le répertoire à l'intérieur du conteneur (un profil propre pèse environ 25 Mo en moyenne, ce qui est beaucoup), ainsi que certains problèmes avec les droits CRUD du navigateur, qui n'a pas pu apporter de modifications au profil lors de l'exécution et est tombé avec une exécution «erreur inconnue: échec d'écriture du fichier prefs». De plus, la mise à jour du profil après que les cookies et les sessions ont atteint leurs dates d'expiration est assez gênante, et je ne voulais pas garder un énorme dossier avec les profils internes dans le projet, donc l'option suivante a finalement été choisie.
Les cookies
«Et la boîte vient de s'ouvrir» - c'est ainsi qu'il a été possible de décrire la situation, après avoir simplement ajouté les cookies reçus manuellement au conducteur. L'algorithme d'actions est aussi simple que possible et ne dépend pas du navigateur sélectionné:
- Connectez-vous manuellement
- À travers le réseau, nous recherchons les en-têtes de demande -> les cookies que notre navigateur envoie
Ajoutez-les à nos tests comme suit:
Le inconvénient évident de cette approche est la nécessité de changer manuellement les cookies après l'expiration de leur période de validité. Mais, comme cette période est de 3 mois sur la plateforme testée, nous avons choisi cette solution.
Et si je n'ai pas besoin de me connecter?
Mais qu'en est-il de la situation quand il ne s'agit pas d'autorisation et de sessions, mais de la commission d'une action ponctuelle (par exemple passer une commande dans le panier, enregistrer un nouvel utilisateur, etc.)? Ici, la situation est encore pire. Deux options que j'ai pu trouver sont:
- Convenez avec vos développeurs pour vous fournir une sorte de solution de contournement. Google offre une telle opportunité , mais n'oubliez pas que vous faites consciemment une petite faille dans la sécurité.
- Profitez des services payants tiers qui prennent une capture d'écran captcha de votre part, essayez de la décoder et de vous envoyer une valeur décryptée. Je n'ai moi-même pas essayé cette méthode et je ne peux pas la recommander pleinement.
Pour résumer
Comme vous pouvez le voir, il n'y a pas de situations désespérées. Cependant, il serait stupide de nier qu'absolument toutes les options ci-dessus ont leurs propres inconvénients, assez importants, donc le choix vous appartient.
Merci de votre attention.
PS Si vous connaissez d'autres solutions qui fonctionnent dans la vie réelle - veuillez les décrire dans les commentaires, ce sera très intéressant à lire.