2016-09-14 2 views
7

Ich suchte nach einer Möglichkeit, nach Änderungen in einer bestimmten URL zu suchen, die vom Benutzer bereitgestellt wurde. Ich schrieb ein Skript, das ich zu Hause lief, das kann das erfolgreich mit WWW::Mechanize tun. Die Sache ist, ich muss es in einem anderen Computernetzwerk ausführen, das eine Gruppenrichtlinie hat, die alle $mech->get($url) Anfragen blockiert (es sind keine Firewall-Probleme, ich lasse Perl durch), also dachte ich, ich werde versuchen, dieses Problem zu umgehen, indem ich Perl lasse steuere den Webbrowser.Kontrolle von Google Chrome per Perl-Skript

Die Computer im Netzwerk laufen nur mit Google Chrome und IE8 und ich kann Firefox aufgrund einer anderen Richtlinie nicht installieren (dachte an die Verwendung von WWW::Mechanize::Firefox). Ich möchte IE8 nicht im Skript aufrufen, da die meisten der zur Verfügung gestellten URLs von Websites stammen, die nicht gut damit funktionieren, sodass ich nur mit Chrome arbeiten kann.

für ein Modul Suche, die das tun kann, fand ich nur AnyEvent::Chromi:

, die über eine WebSocket-Verbindung alle der Chrome-Erweiterungen API aussetzt.

Dies funktioniert nicht (die Richtlinie blockiert wahrscheinlich auch diesen Websocket).

Gibt es eine andere Möglichkeit, dieses Problem zu umgehen/Chrome über ein Perl-Skript zu steuern?

+0

Es gibt Selen. Sehen Sie sich https://metacpan.org/pod/Selenium::Chrome an. Aber ich glaube, du musst auch etwas installieren. Perl ist hier vielleicht nicht das richtige Werkzeug. – simbabque

+0

@simbabque Ich dachte auch daran, aber ich wurde trotzdem gebeten, es in Perl zu machen. Ich weiß nicht warum. Jetzt bin ich neugieriger, was ist der Perl-Weg, es zu tun. – yonyon100

+0

@ yonyon100 Ich denke, dass es ziemlich seltsam ist, eine Aufgabe zu erledigen, aber keine IT - Unterstützung dafür zu haben: s Ich hatte ein ähnliches Problem (aber 'persönlich' im Firmen - Laptop) und löste es mit einem 'Standalone Python' + Selen. Es war möglich, Chrome ohne Probleme zu befehlen. Eine andere Möglichkeit könnte auch die Verwendung von PowerShell + IE8 sein. Es gibt eine eingebaute Automatisierung, die Sie vielleicht nützlich finden. – eballes

Antwort

1

Da Sie IE8 erwähnt haben, gehe ich davon aus, dass es sich um ein Windows-System handelt. Und da du erwähnt hast, dass du WWW: Mechanix :: Firefox in Betracht gezogen hast, klingt es so, als ob du nicht nur auf Kernmodule beschränkt bist.

Basierend darauf, die einzige Möglichkeit, die Chrome Broswer zu automatisieren wäre Win32::GuiTest, um den Chrome-Browser zu steuern. Wenn Sie herausfinden können, wie Sie Ihre Tests nur mit Tastatureingabe (d. H. Ohne Maus) manuell durchführen, würde das die Dinge einfacher machen, als zu versuchen, die Mausemulation herauszufinden, um den Cursor für verschiedene Aufgaben an die richtige Position zu bringen.

Ich bin mir nicht sicher, ob das ist eine Route, die Sie gerne verwenden möchten oder nicht. Es ist nur der einzige Weg, an den ich denken kann, um das zu erreichen, was Sie mit den Einschränkungen machen wollen, mit denen Sie umgehen müssen.

+0

Anscheinend kann ich das auch nicht installieren. Sieht so aus, als ob der alte netadmin 'WWW :: Mechanize :: Firefox' installiert hat, aber der neue lässt mich keine neuen Module installieren ... aber danke, dass du mir dieses Modul vorgestellt hast! – yonyon100

1

Sie können dies auch von Grund auf ohne Verwendung von CPAN-Modulen tun. Ich testete dies auf Linux (Ubuntu 16.04, Google Chrome Version 53) mit Unix Domain (UD) Sockets. Leider scheint es, dass Windows keine UD-Sockets hat, aber sollte es möglich sein, das Gleiche unter Windows mit Named Pipes zu tun.

Zuerst sicherstellen, dass google-chrome im Hintergrund ausgeführt wird. Wir werden müssen eine Chrome App erstellen, die mit einem nativen Host über die native messaging API kommunizieren wird. Der native Host kann ein beliebiges Skript sein, das Nachrichten von seinen STDIN und Rückantwortantworten über seine STDOUT liest. Ich habe sowohl ein Python Skript als auch ein Perl Skript getestet.

Damit ein eigenständiges Perl-Skript mit dem Chrome-Browser kommuniziert, sendet es eine Anforderung über einen UD-Socket (erstellt von dem nativen Host) an den nativen Host; der native Host wird dann die Anfrage an google-chrome über seine Standardausgabe Pipe weiterleiten. Dann wird die Chrome-App (in JavaScript geschrieben) die Anfrage erhalten.Die Chrome App verwendet die JavaScript-APIs Chrome , um die angeforderten Daten abzurufen und sie an den systemeigenen Host zurückzugeben. Schließlich leitet der native Host das Ergebnis über den Socket an das Perl-Skript weiter.

Wie Sie sehen können, sind einige Details erforderlich, um dies einzurichten, aber ich kann bestätigen, dass es auf meiner Linux-Plattform funktioniert. Bitte lassen Sie mich wissen, wenn Sie mehr Details benötigen.