ReCaptcha-Bypass in Selentests

ReCaptcha (sie wird im Volksmund als „CAPTCHA“ bezeichnet ) ist eines der schmerzhaftesten Dinge, denen ein Testautomat auf seinem Weg begegnen kann. Tausende verschiedener Videos, die von Einwanderern aus dem sonnigen Indien aufgenommen wurden, gehen im Internet darüber, welche Tänze mit einem Tamburin möglich sind, um dieses Tier zu täuschen. In der Tat ist es ziemlich schwierig zu versuchen, mit den programmierten Skripten mit einer Sache zu interagieren, deren Hauptzweck darin besteht, sicherzustellen, dass "Sie kein Roboter sind".

Ein sehr wichtiger Haftungsausschluss: Es ist unmöglich, ein Captcha zu täuschen.

Wenn Sie bereits auf dieses Problem gestoßen sind und diesen Artikel lesen und versuchen, ein Rezept für ein Allheilmittel zu googeln, wissen Sie, dass es nicht existiert. Darüber hinaus sind in Ihrem Kopf höchstwahrscheinlich innovative Ideen zur Simulation eines realistischen Benutzerverhaltens mit WebDriver entstanden, indem Elemente mit der Maus zufällig verschoben, auf Eingaben geklickt und Thread.sleep () sorgfältig platziert wurden. Es ist absolut bekannt, dass dieser Ansatz nicht funktioniert. Verschwenden Sie Ihre Zeit nicht umsonst.

Bild

Es stellt sich heraus, dass es keinen Ausweg gibt?

Nicht alles ist so pessimistisch. Manchmal reicht es aus, sich die genaueste Antwort auf die Frage "Was ist die Herausforderung für mich?" Zu geben. und schauen Sie sich die Situation weiter an. In den meisten Fällen werden Sie verstehen, dass Ihr Ziel nicht darin besteht, das Captcha zu täuschen, sondern es zu umgehen, um die dahinter verborgene Funktionalität zu testen. Am Beispiel meines Falles werde ich Ihnen die Optionen mitteilen, die ich zur Lösung der Aufgabe gefunden habe.

Kontext: Wir haben einen Teil unseres Produkts in einen Drittanbieter-Service integriert und wollten überwachen, ob auf ihrer Seite alles in Ordnung ist, weil Sie decken keine Teile ihrer Plattform von Drittanbietern ab. Um auf unsere Funktionen zugreifen zu können, mussten Sie sich zunächst anmelden. Damals traf ich mich mit dem Captcha von Angesicht zu Angesicht. Als nächstes gebe ich alle Optionen an, die ich versucht habe, um dieses Problem zu umgehen.


Nicht arbeitend


Melden Sie sich über Google oder Facebook an


Neben der klassischen Authentifizierung gab es eine kanonische Anmeldung bei Google / Facebook. Natürlich waren dort auch ihre "Captcha" vorhanden, so dass diese Option nicht zur Lösung des Problems beitrug.

Benutzerverhalten simulieren


Ja, ich habe es auch versucht. Es war lustig, aber zu naiv.



Arbeiter


Chrome / Firefox-Profile


Lassen Sie uns über die erste "Live" -Option sprechen. Die Treiber für diese Browser (chromedriver / geckodriver) können unter einem vordefinierten Benutzerprofil gestartet werden. Es speichert alle gespeicherten Passwörter, Cookies, Sitzungen und sogar den Browserverlauf und die Lesezeichen. Das heißt, Daher haben wir einfach den Anmeldeschritt verpasst, der für unsere Aufgabe absolut unwichtig ist, und sind direkt zur Seite mit dem Testobjekt gelangt. Es wird wie folgt implementiert:

  1. Erstellen Sie ein "sauberes" Browserprofil
  2. Geben Sie das Captcha manuell ein und melden Sie sich bei der gewünschten Ressource an
  3. Kopieren Sie das gewünschte Profil in unser Projekt (HOWTO für Firefox und Chrome ).

Danach müssen wir dem Treiber mitteilen, dass er aus dem angegebenen Profil geladen werden soll:

Firefox:

//   FirefoxProfile profile = new FirefoxProfile(new File("////")); //      FirefoxOptions options = new FirefoxOptions(); options.setProfile(profile); //   WebDriver driver = new FirefoxDriver(options); 

Chrome:

 //      ChromeOptions options = new ChromeOptions(); options.addArgument("--user-data-dir=/////"); options.addArgument("--profile-directory=____"); //   WebDriver driver = new ChromeDriver(options); 

Dieser Ansatz erwies sich beim Testen auf einem lokalen Computer mit einem installierten Browser und den üblichen Gecko- / Cromedrivers als gut, aber es gab Probleme beim Ausführen auf Jenkins. Wir erhöhen den Selenium-Hub und die Knoten innerhalb des Kubernetes-Clusters, sodass Probleme in Form eines Verzeichnisses aufgetreten sind, das zu lang war, um das Verzeichnis im Container bereitzustellen (ein sauberes Profil wiegt durchschnittlich etwa 25 MB, was ziemlich viel ist), sowie einige Probleme mit den CRUD-Rechten des Browsers konnte zur Laufzeit keine Änderungen am Profil vornehmen und fiel mit der Ausführung "Unbekannter Fehler: Präfektdatei konnte nicht geschrieben werden" aus. Darüber hinaus ist das Aktualisieren des Profils nach Erreichen des Ablaufdatums von Cookies und Sitzungen recht unpraktisch, und ich wollte keinen großen Ordner mit den Profilinternalen im Projekt behalten, sodass letztendlich die folgende Option ausgewählt wurde.

Cookies


"Und die Box wurde gerade geöffnet" - so konnte die Situation beschrieben werden, nachdem wir dem Fahrer gerade die manuell empfangenen Cookies hinzugefügt hatten. Der Aktionsalgorithmus ist so einfach wie möglich und hängt nicht vom ausgewählten Browser ab:

  1. Melden Sie sich manuell an
  2. Über das Netzwerk suchen wir nach Anforderungsheadern -> Cookies, die unser Browser sendet

Fügen Sie sie wie folgt zu unseren Tests hinzu:

 //  cookie private static final Cookie COOKIE = new Cookie("", "", "", "", new Date("")); //   WebDriver driver = new ChromeDriver(options); //  cookie   driver.manage().addCookie(COOKIE); 

Das offensichtliche Minus dieses Ansatzes ist die Notwendigkeit, Cookies nach Ablauf ihrer Gültigkeitsdauer manuell zu ändern. Da dieser Zeitraum auf der getesteten Plattform 3 Monate beträgt, haben wir uns für diese Lösung entschieden.



Und wenn ich mich nicht anmelden muss?



Aber was ist mit der Situation, in der es nicht um Autorisierung und Sitzungen geht, sondern um die Beauftragung einer einmaligen Aktion (z. B. Bestellung aus dem Warenkorb, Registrierung eines neuen Benutzers usw.)? Hier ist die Situation noch schlimmer. Zwei Optionen, die ich finden konnte, sind:

  1. Vereinbaren Sie mit Ihren Entwicklern eine Problemumgehung. Google bietet eine solche Möglichkeit , aber denken Sie daran, dass Sie bewusst ein kleines Sicherheitsloch machen.
  2. Nutzen Sie kostenpflichtige Dienste von Drittanbietern, die von Ihrer Seite einen Captcha-Screenshot erstellen, versuchen, ihn zu entschlüsseln, und senden Sie einen entschlüsselten Wert. Ich selbst habe diese Methode nicht ausprobiert und kann sie nicht vollständig empfehlen.



Zusammenfassend


Wie Sie sehen, gibt es keine hoffnungslosen Situationen. Es wäre jedoch dumm zu leugnen, dass absolut alle oben genannten Optionen ihre eigenen, ziemlich bedeutenden Nachteile haben, sodass Sie die Wahl haben.

Vielen Dank für Ihre Aufmerksamkeit.

PS Wenn Sie andere Lösungen kennen, die im wirklichen Leben funktionieren - beschreiben Sie sie bitte in den Kommentaren. Es wird sehr interessant sein, sie zu lesen.

Source: https://habr.com/ru/post/de442034/


All Articles