Casperjs / PhantomJs gegen Selen


150

Wir verwenden Selen, um unsere UITests zu automatisieren . Vor kurzem haben wir die Mehrheit unserer Nutzer gesehen, die Chrome verwenden. Wir wollten wissen, welche Vor- und Nachteile die Verwendung von PhantomJS gegenüber Selen hat:

  • Gibt es einen echten Leistungsvorteil, z. B. die Zeit, die für die Ausführung der Testfälle benötigt wird?
  • Wann sollte man PhantomJS Selen vorziehen?

Antworten:


183

Sie greifen verschiedene Probleme an. Da PhantomJS perfekt über die Befehlszeile ausgeführt wird, eignet es sich als erste Ebene für Rauchtests, sei es als Teil des Entwicklungsworkflows und / oder in einem kontinuierlichen Integrationsserver. Selen zielt auf mehrere Browser ab. Daher ist es sehr nützlich, die Konsistenz zwischen den Browsern sicherzustellen und umfangreiche Tests unter verschiedenen Betriebssystemen durchzuführen.

Wenn Ihre Webanwendung auf einer Vielzahl von Webbrowsern ausgeführt werden muss, führt das Ausführen der UI-Tests nur mit PhantomJS nicht zu den meisten Tests. Es ist jedoch vollkommen in Ordnung, PhantomJS zu starten und einige grundlegende Sicherheitsüberprüfungen durchzuführen, bevor Sie die eingehenden Tests durchführen. Stellen Sie sich den Wahnsinn vor, eine Finanzanwendung zu testen, bei der der Anmeldebildschirm unbeabsichtigt beschädigt und nicht funktionsfähig ist!

Beachten Sie, dass die Linie zwischen den beiden mit der jüngsten WebDriver-Unterstützung im neuesten PhantomJS leicht unscharf wird. Es ist jetzt möglich, die Tests schnell zuerst mit PhantomJS auszuführen und dann (vorausgesetzt, es liegt kein schwerwiegender Fehler vor) dieselben Tests in einem Selenium-Setup gründlich auszuführen.


Vielen Dank für die Antwort. Jeder Link, der mir helfen kann zu verstehen, wie Leute Phantomjs verwenden, um leistungsbezogene Statistiken in einer realen Produktions-App zu sammeln.
Spirit3189

34
Ariya Hidayat scheint der Schöpfer von PhantomJs zu sein
Sebastian Patten

Es scheint, dass Ihr beschriebener Workflow, mit dem Schreiben von Tests mit PhantomJS und der Verwendung von Selenium zu beginnen, eine vollständige Neufassung der Tests voraussetzt ... Könnten Sie PhantomJS-Skripte direkt mit Selenium verwenden?
Lajarre

1
Danke für das tolle PhantomJS, @AriyaHidayat! :)
Rinogo

49

Mit der jüngsten WebDriver-Integration (wie Ariya bemerkt hat) können Sie jetzt Selenium verwenden, um PhantomJS zu betreiben.

Das ist immens mächtig.

Sie können bei jedem Check-in eine Reihe vollautomatischer Selenium-Tests (mit PhantomJS als WebDriver-Implementierung) über Ihr CI auf einem kopflosen Unix-Server ausführen. Wenn Sie dann die Browserkompatibilität testen möchten, können Sie Ihre Tests lokal ausführen, indem Sie die zugrunde liegende WebDriver-Implementierung in Chrome, Firefox usw. ändern.


41

Ich schreibe gerade ein Web-Extraktions-Framework. Ich habe 524 Tests, die mit XPath Daten von 250 Websites abrufen. Ursprünglich verwendete das Framework einen HTML-Parser, HTMLCleaner, aber ich untersuche derzeit die Verwendung von Selenium, da ich Javascript-Unterstützung möchte. Ich habe die Tests mit den Treibern HtmlUnit, Chrome, Firefox und PhantomJS durchgeführt . Hier ist ein Vergleich der benötigten Zeit und der Anzahl der Fehler für jeden Ansatz:

                    Failures    Time (secs) 
HtmlCleaner         0           82  
HtmlUnit            169         102 
Google Chrome       38          562 
Firefox             46          1159    
PhantomJS           40          575

Einige Kommentare:

  • In einigen Fällen sind die "Fehler" möglicherweise überhaupt keine Fehler. Es kann sein, dass die Extraktoren fehlschlagen, weil Javascript das DOM neu schreibt. Ich bin dabei, die Fehler zu analysieren, um die Ursache zu finden.

  • Das heißt, HtmlUnit ist der schnellste Selenium-Treiber, aber es ist auch unzuverlässig. Diese Unzuverlässigkeit betrifft nicht nur Javascript, es gibt auch Probleme bei der Verarbeitung von "chaotischem, schmutzigem, realem" HTML, da der Algorithmus für den Tag-Ausgleich anscheinend fehlerhaft ist. Es wurden einige Probleme angesprochen, die jedoch nicht behoben wurden - siehe HTML-UNIT 1423 und HTML-UNIT 1046 .

  • Firefox ist der langsamste Selenium-Treiber, obwohl ich das Laden von Bildern und Stylesheets deaktiviere. Dies liegt daran, dass das Laden und Initialisieren am langsamsten ist, was es erheblich langsamer als Chrome macht. Jedes Mal, wenn eine Extraktion fehlschlägt, muss ich den Treiber neu laden (in den Tests erstelle ich einen Pool von 5 Treibern, um die Verzögerungen beim Abrufen von URLs für alle zu verringern die Selenium-Webtreiber).

  • PhantomJS erreicht eine bessere Genauigkeit als Firefox, etwas niedriger als Chrome, jedoch in etwa der Hälfte der Zeit von Firefox. Darüber hinaus kann ich es auf meiner Entwicklungsbox ausführen. Es übernimmt nicht "meinen Computer", indem es mehrere Browser startet, damit ich mit der Arbeit fortfahren kann.

Ich kann PhantomJS nur empfehlen.


1
Es dauert 9 Minuten, um Ihre Testsuite mit phantomJS auszuführen. Das muss sich wie für immer anfühlen ...
Kevin

@ Kevin Ja :) - aber HTMLCleaner ist der Standardtest. Ich markiere die Verwendung von JUnit-Kategorien , um die anderen Tests als optional zu markieren, damit sie nicht Teil der Standard-Komponententests sind.
Mark Butler

Vielen Dank. Ja, ich habe an Full-JS-Tests gearbeitet und sie sind so eisig - wie 15 bis 20 Sekunden für ein paar Seitentests. Vielleicht muss meine Skala von 'Gletscher' angepasst werden, obwohl hehe :) Seltsamerweise dauert es nur ~ 5 Sekunden, wenn ich es manuell mache, um durch die Formulare zu klicken.
Kevin

1
@lucaswxp Ja! Und viele andere Projekte dazwischen. Wie ich oben erkläre, gibt es keine perfekte Wahl. Zu der Zeit habe ich HtmlCleaner verwendet, aber eine Option zur Verwendung von PhantomJS hinzugefügt, wenn die zu extrahierende Seite diese benötigt.
Mark Butler

1
@iconoclast Nein - leider - früherer Arbeitgeber hat die IP.
Mark Butler

2

Nutzung der Leistung von Selen und PhantomJS PhantomJS verfügt über die Funktionen für kopflose Browser. Daher empfiehlt es sich, es als einen der Browser mit Selen zu verwenden (zusätzlich zu herkömmlichen Browsern wie IE, Chrome usw.). Vorteile dieses Ansatzes:

  1. Kann für Sanity für Webanwendungen in CI verwendet werden (obwohl die Agentencomputer weder über IE noch über Chrome verfügen), werden die Tests effektiv ausgeführt.
  2. Einige Entwicklungsteams verwenden diesen Ansatz, um schnelle Ergebnisse zu erzielen und weniger Zeit und Ressourcen zu verbrauchen.
  3. Das größte Merkmal von Phantom JS ist die Bildschirmaufnahme, bei der parallele Tests mit Multithreading ausgeführt werden, wodurch sich Ihre Ausführungszeit erheblich verkürzt.

1

Herausforderungen bei der Verwendung von PhantomJS:

Meine Anwendung war Preisgestaltung Webanwendung:

  1. Irgendwann funktionieren Locators, die im Chrome-Browser einwandfrei funktionierten, nicht mehr mit PhantomJS.
  2. Manchmal muss ich beim Ausführen eines Doppelklicks oder eines Kontextklicks durch Selen eine zusätzliche Prüfung durchführen, um die Operationen zu überprüfen, da sie an erster Stelle nicht klicken.
  3. Persistenz von Cache und Cookies. Nach dem Abmelden und Anmelden bleiben die Daten im Cache. | Also führen wir den Test auf Chrom durch.
  4. Eines der wichtigsten Probleme, das ich gefunden habe "Problem beim Hochladen von Dateien". Wir können in unserer Anwendung keine Datei in phantomJs Browser hochladen. Wir haben viele Dinge ausprobiert, javascriptexcutor, jqueries, aber keine davon hat überhaupt funktioniert. Deshalb führen wir diesen Test auch in Chrome durch. Hinweis: Wir haben in unserem Framework häufig Javascript-Funktionen verwendet, um mit Webelementen für PhantomJS zu interagieren. Eines ist sicher, dass die Ausführungszeit in PhantomJS sehr viel kürzer ist. Es hängt also von der Priorität des Kunden ab, ob er Funktionalität / Leistung wünscht. Wenn Sie das End-to-End-Szenario testen möchten, wählen Sie Chrome.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.