Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Francisco Silva

Min Read

23. Februar 2024

Capybara-Webkit zu Headless Chrome: Was Sie wissen sollten

Also, du hast eine Ruby on Rails Projekt, mit dem du getestet hast Wasserschweine und Capybara-Webkit und Sie müssen ein Upgrade durchführen auf Kopfloses Chrom.

Nun, du bist am richtigen Ort, denn hier zeige ich genau, wie du das erreichen kannst. Aber lassen Sie mich zunächst einen Kontext darüber geben, warum es wichtig ist, die Änderung vorzunehmen, und warum Chrome der perfekte Kandidat dafür ist.

Seit 2017 wird Google Chrome mit einer Headless-Umgebung ausgeliefert, die es uns ermöglicht, Benutzerinteraktionen ohne den Aufwand einer GUI nachzuahmen. Sie haben sich auch zusammengetan mit Selen, ein Browser-Automatisierungstool, das veröffentlicht werden soll Chrome-Treiber. Es bietet eine Standardoberfläche zur Steuerung von Chrome, sodass es mit den meisten Tools und Sprachen, die es verwenden möchten, gut funktioniert.

Nun, bevor das alles eine Option war, Capybara-Webkit, der Treiber für den QtWebKit-Browser, passte hervorragend zu dem Job. Allerdings würde ich jetzt nicht dasselbe sagen. Die Tests schlagen zeitweise fehl und erzwingen Wiederholungsversuche auf dem CI, und der Browser, auf den es angewiesen ist (QtWebKit), wurde veraltet.

Alles in allem haben Sie mit Chrome einen modernen Browser, einen Treiber dafür und ein praxiserprobtes Tool zur Automatisierung Ihrer Tests (Selenium). All das, ohne mit lästigen Qt-Versionsabhängigkeiten umgehen zu müssen. Fantastisch, oder?

Okay, jetzt, da Sie alle auf dem Laufenden sind, werde ich Sie durch die Einrichtung von ChromeDriver und Selenium führen und gleichzeitig einige der häufigsten Probleme beheben, die möglicherweise auftreten.

blue arrow to the left
Imaginary Cloud logo

Einrichtung der Umgebung

Für die Umstellung sind natürlich Chrome und einige Abhängigkeiten erforderlich, um sicherzustellen, dass alles sauber in Capybara integriert ist.

Dieser Teil ist ziemlich einfach, er sollte Ihnen keinen großen Aufwand bereiten.

Chrome installieren

Zuallererst müssen Sie die neueste stabile Version von Chrome installieren
Unter Linux können Sie dies wie folgt tun:


Abhängigkeiten installieren

Als Nächstes benötigen Sie zwei weitere Tools:

  • Chrome-Treiber: Chrome-Implementierung von Web-Treiber Schnittstelle für die Fernbedienung;
  • Selen: erforderlich, um die Automatisierungs- und Testtools zu implementieren, die Sie mit Capybara verwenden werden.

Das Juwel Webtreiber hilft bei der Installation von ChromeDriver, indem der Treiber automatisch heruntergeladen, installiert und auf dem neuesten Stand gehalten wird.

Dann sollten Sie beide zum Projekt in Ihrem Gemfile hinzufügen, wie unten gezeigt:


Vergiss nicht Bundle-Installation danach.

Die Treiber einrichten

Jetzt müssen Sie nur noch die Treiber registrieren und konfigurieren in spec_helper.rb:


Dadurch wird der Standardtreiber auf gesetzt : headless_chrome. Wenn Sie die Ausführung der Tests beobachten möchten, ändern Sie es einfach in : chrom in den letzten beiden Zeilen.

Möglicherweise stellen Sie auch fest, dass Funktionen aktivieren Tag in den Optionen von Chrome, dies ist eine vorübergehende Lösung aufgrund eines Problem in Chrome 74 in dem Cookies während der Ausführung nach dem Zufallsprinzip gelöscht werden, was dazu führen kann, dass Chrome einfriert.

Laut dem Bug-Tracker von Chromium wird dies in Version v75 behoben.

Wenn Sie das Projekt in Docker ausführen, Möglicherweise müssen Sie auch „no-Sandbox“ hinzufügen zu den Optionen von Chrome:


Dinge aufräumen

Nachdem das erledigt ist, können Sie fortfahren und entfernen Capybara-Webkit aus dem Gemfile sowie allen Importen oder Konfigurationen, die Sie möglicherweise noch übrig haben (suchen Sie nach Capybara: :Webkit).

blue arrow to the left
Imaginary Cloud logo

Probleme, die auftauchen könnten

Bei einigen Projekten laufen die Tests möglicherweise bereits nach diesen Schritten reibungslos, bei anderen jedoch möglicherweise nicht. Mit einem neuen Browser und Tools, mit denen die Tests ausgeführt werden, tauchen auch neue Funktionen und neue Probleme auf.

Capybara-WebKit hatte ein paar nützliche aber nicht standardmäßige Methoden, und Selenium unterstützt nicht alle Methoden Capybara hat zu bieten. Dadurch entsteht also eine ziemliche Lücke, und jeder Test, der nicht unterstützte Methoden verwendet hat, muss gepatcht werden.

  • Element #trigger wird von Selenium nicht unterstützt, obwohl es in den meisten Fällen sollte nicht verwendet werden, da es Aktionen zulässt, zu denen der Benutzer niemals in der Lage sein wird.

Eine einfache Problemumgehung besteht jedoch darin, den Return-Tastendruck an das Element zu senden, wenn Sie einen Klick auslösen:

Oder um das Element über Javascript anzuklicken:

Wenn Sie es mit einer anderen Art von Ereignis zu tun haben, können Sie jQuery wie folgt verwenden:

  • resize_window wurde in Selenium in resize_window_to umbenannt.
  • Das Lesen von JavaScript-Protokollen ist etwas anders. In der Treiberkonfiguration müssen Sie die Funktionen auf Folgendes ändern:


Und dann, um die Logs zu lesen, kannst du einfach:

Sie können mehr über die Funktionen und Optionen von Chrome lesen hier.

  • Das Überprüfen und Setzen der Header der Anfragen ist nicht unterstützt in Selenium standardmäßig. Das bedeutet, dass Seite.Treiber.Kopfzeile, page.response_headers und seite.status_code sind nicht verfügbar.

Die Behebung dieses letzten Punktes ist eine ziemliche Herausforderung, aber Die Lösung von GitLab ist eine großartige Problemumgehung. Als sie bei der Portierung ihres Browsers von PhantomJS nach Chrome auf dasselbe Problem stießen, implementierten sie eine Middleware, um die Header der Anfragen abzufangen (mehr dazu hier).

Um diese Lösung zu implementieren, habe ich einfach diese Dateien hinzugefügt

lib/testen:

Spezifikation/Unterstützung/Helfer:

Die Namespaces müssen an Ihr Projekt angepasst und das Gem 'Concurrent-Ruby' importiert werden, wie es in der Middleware erforderlich ist:

Denken Sie daran, die Dateien auch in zu importieren spec_helper.rb:

Und bei all dem Setup müssen Sie nur Folgendes tun, um die Details des Headers abzurufen:

blue arrow to the left
Imaginary Cloud logo

Noch ein paar Tipps

Jetzt, da alles in Betrieb ist, möchte ich Ihnen noch ein paar Tipps geben, um Headless Chrome und ChromeDriver optimal zu nutzen und einige häufig auftretende Probleme zu vermeiden.

Animationen können lästig sein, insbesondere Scrollanimationen

Capybara klickt auf folgende Weise auf Elemente:

  1. Finde das DOM-Element;
  2. Elementkoordinaten berechnen;
  3. Klicken Sie auf diese Koordinaten.

Wenn die Seite beispielsweise scrollt, während das Element angeklickt werden soll, könnten die Koordinaten zwischen Schritt 2 und 3 veraltet sein, was bedeutet, dass der Klick an die falsche Stelle fällt.

Eine mögliche Lösung für dieses Problem besteht darin, auf das Ende der Animationen zu warten. In diesem Fall habe ich darauf gewartet, dass die jQuery-Animation beim Scrollen des Körpers aufhört:


Eine andere Möglichkeit wäre, jQuery-Animationen beim Testen ganz zu deaktivieren, wie folgt:

Es ist erwähnenswert, dass das Deaktivieren der Animationen auch die Leistung der Tests verbessern kann.

Wenn dieser Fix bei Ihnen nicht funktioniert und Sie wirklich alle Animationen abbrechen möchten, schauen Sie sich das an dieser tolle Artikel zusammengestellt von den Leuten von Doctolib.

Fehler behoben, durch die deine Klicks gestohlen wurden

Capybara klickt nur auf Elemente, wenn sie sichtbar sind. Wenn Sie also eine Navigationsleiste oder ein Popup haben, das ein Element verdeckt, erhalten Sie möglicherweise eine Fehlermeldung wie diese:

Das Element ist an Punkt (100, 200) nicht anklickbar. Ein anderes Element würde den Klick erhalten:... (Selenium: :WebDriver: :Error: :UnknownError)

Um damit umzugehen, können Sie schließe alle Popups auf der Seite und scrolle nach unten zum Element bevor Sie darauf klicken.

Eine einfache Methode zur Umsetzung dieser Idee wäre:


blue arrow to the left
Imaginary Cloud logo

Fazit

Der Headless-Modus von Chrome und der dazugehörige ChromeDriver wurden stark zum Testen und Automatisieren verwendet, zumal QtWebKit veraltet war und damit Projekte, die darauf basierten, wie Phantom JS und Capybara-Webkit.

Sogar der Betreuer von Phantom JS, der einst beliebte Headless-Browser hat sein Projekt zugunsten von ChromeDriver eingestellt. Und Thoughtbot, die Macher von Capybara-Webkit, fangen an spiele mit ChromeDriver herum ebenso.

Capybara-Webkit hat den Job zwar eine ganze Weile gemacht, aber der Wechsel zu einer moderneren Alternative (dem Headless-Modus von Chrome) wird die Tests mehr machen zuverlässig und stabil. All dies mit dem zusätzlichen Vorteil, dass dieselbe Browser-Engine wie die meisten Benutzer verwendet wird, wodurch die Testaktionen viel ähnlicher sind, wie eine reale Benutzerinteraktion aussehen würde.

Viel Spaß beim Testen Leute!

Ready for a UX Audit? Book a free call

Fanden Sie diesen Artikel hilfreich? Diese könnten dir auch gefallen!

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
Francisco Silva
Francisco Silva

Enthusiast von allem, was mit Frontend zu tun hat. In einer engagierten Hassliebe mit CSS. Am häufigsten wird er beim Scrapen von Daten für Nebenprojekte gesehen, die er nie beenden wird.

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon