web-dev-qa-db-fra.com

Automatiseur Chrome

J'ai vu des choses folles se produire lorsque je colle du code JavaScript codé dans une URL dans Firefox et Chrome. Est-il possible d'utiliser cette technique pour indiquer à Chrome de visiter une URL, puis de l'enregistrer sous forme de fichier? J'essaie d'automatiser Chrome et Selenium semblait extrêmement décourageant.

EDIT: Malheureusement, j'ai oublié d'être plus clair ici. Laisse-moi expliquer. Des choses comme wget, curl, etc. ne fonctionneront pas car je dois passer par des connexions dans certains de ces scripts. Et j’ai jeté un œil sur iMacros, mais j’ai constaté que je ne pouvais pas les exécuter à partir de la ligne de commande, sauf sous Windows, à moins de payer le package à 499 $. Les autres avantages des GCE sont que la plate-forme de développement est gratuite et ouverte dans une certaine mesure, et qu'ils sont multi-plateformes. (J'utilise Linux.)

EDIT: À ce stade, j'apprends à propos de Google Chrome Extensions. Il semble qu’ils soient faciles à construire et me laisseront (je pense) dire au navigateur d’ouvrir un nouvel onglet, d’accéder à une page, de manipuler le DOM sur cette page (par exemple, remplir des champs et se connecter), puis de manipuler le DOM sur la page de réponse. Les GCE ne vous permettent pas de faire des E/S sur fichier, elles ne ressemblent donc pas aux extensions Firefox avec XPCOM, mais vous pouvez contourner ce problème en utilisant AJAX pour envoyer des données à un script backend (comme un PHP script sur un serveur LAMP) pour enregistrer ces données.

EDIT: Au fait, et ceci est légèrement hors sujet (mais j'ajoute pour clarifier) ​​ces "choses sauvages" en Javascript que j'ai mentionnées étaient lorsque vous manipulez le DOM en créant une URL qui ressemble à ceci:

javascript:(function(){...your URL-encoded Javascript here...})();
17
Volomike

La solution semble être de créer son propre Google Chrome Extension (GCE) . Il est facile d’apprendre au bout de 4 heures environ si vous savez faire du Javascript légèrement avancé et qu’il est très puissant. Je peux utiliser l'API Tabs pour créer un nouvel onglet et accéder à une URL spécifique. Je peux ensuite injecter jQuery dans cette URL et lui faire manipuler le DOM ou faire tout ce que nous pouvons normalement faire avec jQuery. Je ne peux pas faire de fichier d'E/S, mais il existe deux solutions de contournement. Premièrement, je peux forcer le navigateur à télécharger un fichier depuis un emplacement distant et envoyer des données de la page actuelle à un serveur distant via les appels $ .get () ou $ .post () de jQuery.

10
Volomike

Vous pouvez utiliser Python pour automatiser des tâches Web à l’aide de pywebkitgtk . Il s’agit d’une liaison Python pour WebKitGtk, qui utilise le moteur WebKit, le même moteur que chrome.

Grâce à cet article de blog, pywebkitgtk - Exécuter JavaScript à partir de Python , j'ai créé une sous-classe de webkit.WebView pour faciliter ces tâches.

import gtk
import webkit
import json

class WebView(webkit.WebView):
    def eval_script(self, script):
        self.execute_script('oldtitle=document.title;document.title="!!!!";document.title=JSON.stringify(eval(' + json.dumps(script) + '));')
        result = json.loads(self.get_main_frame().get_title())
        self.execute_script('document.title=oldtitle;')
        return result
    def wait_for_load(self):
        handle = None
        def load_status_cb(view, frame):
            if frame == view.get_main_frame():
                self.disconnect(handle)
                gtk.main_quit()
        handle = self.connect('load-finished', load_status_cb)
        gtk.main()

J'ai ajouté la fonction appelée eval_script qui ressemble à execute_script, mais vous pouvez obtenir les résultats de la fonction sous forme d'objets Python. Vous devez simplement vous assurer que ce que vous évaluez est sérialisable JSON.

De plus, j'ai ajouté une fonction wait_for_load qui est assez explicite.

Pour configurer une interface utilisateur, vous devez d'abord créer une fenêtre, une fenêtre défilée et une vue Web.

# window
window = gtk.Window()
window.set_default_size(800, 600)

# scroll view
scroll_view = gtk.ScrolledWindow()
scroll_view.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
scroll_view.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC

# web view
web_view = WebView()

# events
window.connect('delete-event', lambda window, event: gtk.main_quit())

# show
scroll_view.add(web_view)
window.add(scroll_view)
window.show_all()

Ensuite, vous pouvez commencer à automatiser les choses! Par exemple, ce code charge la page de connexion de StackOverflow, cliquez sur le bouton de connexion Facebook, renseignez le nom d'utilisateur et le mot de passe (dans ce cas, "test"). Enfin, il affiche le texte du bouton de connexion.

# the script is here
web_view.open('http://www.stackoverflow.com/users/login')
web_view.wait_for_load()

web_view.execute_script('openid.signin("facebook")')
web_view.wait_for_load()

web_view.execute_script('document.querySelector("#email").value = "test"')
web_view.execute_script('document.querySelector("#pass").value = "test"')

print "Login's button text is:", web_view.eval_script('document.querySelector("#buttons input[type=\\"submit\\"]").value')

Dans mon cas, l'interface de Facebook était en thaï et je pouvais voir le texte du bouton de connexion.

Le texte du bouton de connexion est: สู่ ระบบ

Vous pouvez également le faire cliquer sur le bouton d'envoi, simplement en appelant click() sur cet élément. (Remarque: click() fonctionne pour les éléments de bouton, pas sur les liens)}

web_view.execute_script('document.querySelector("#buttons input[type=\\"submit\\"]").click()')
web_view.wait_for_load()

Vous remarquerez que lorsque tous les scripts sont terminés, l'application se ferme sans attendre.

Si vous souhaitez que l'application continue à fonctionner une fois tous les scripts terminés, vous devez ajouter la dernière ligne:

gtk.main()

De même, si vous supprimez la ligne window.show_all() et la dernière ligne gtk.main(). Ensuite, votre application fonctionnera sans interface graphique. (Remarque: vous avez toujours besoin d'un serveur d'affichage.)

À l'heure actuelle, nous n'avons pas encore de bonne documentation pywebkitgtk. Vous devez donc consulter la documentation de WebKitGtk à la place. Bonne chance.

10
Thai

Vous pouvez commander http://qaagent.com . C'est un moyen facile d'automatiser certaines tâches liées au Web.

0
Angel Tsvetkov

Vérifiez certainement Watir ! Je trouve cela extrêmement simple. Cela fonctionne aussi facilement avec Selenium qu'avec Chrome, IE ou Firefox. Bien que la version pour Chrome ne soit pas encore officiellement prise en charge, ils prétendent qu'elle est utilisable. Moi-même, je ne l'ai utilisé que pour Selenium, IE et Firefox.

En outre, Watir s'intègre facilement avec Cucumber , si vous recherchez un développement BDD (Behavior-Driven Development) de pointe. C'est juste du code Ruby, est open source, et hébergé sur gitHub . Prendre plaisir!

0
Nick

Vous pouvez essayer iMacros pour Chrome . C'est un système d'automatisation assez facile à utiliser.

  1. Ouvrez iMacros
  2. Cliquez sur Enregistrer .
  3. Allez sur votre routine de navigation.
  4. Cliquez sur arrêter.

Je ne pense pas que cela puisse être plus facile que cela. Les scripts qu’il enregistre sont en texte brut; vous pouvez donc les modifier si nécessaire pour un contrôle précis du grain.

0
kzh