8 votes

Exposition des variables de l'appel de PhantomJS à injectJS

J'ai suivi les exemples d'injection de jQuery de la page de démarrage et cela fonctionne très bien. J'ai une copie locale de jQuery dans le même répertoire, et je fais quelque chose comme...

if(page.injectJs('jquery.min.js')) {
  page.evaluate(function(){
    //Use jQuery or $ 
  }
}

Lorsque j'essaie d'injecter mon propre script(s), aucune des fonctions n'est disponible pour moi. Disons que j'ai un script appelé myScript.js qui a juste

function doSomething() {
  // doing something...
}

Je ne peux pas ensuite utiliser doSomething comme...

if(page.injectJs('myScript.js')) {
  console.log('myScript injected... I think');
  page.evaluate(function() {
    doSomething();
  });
} else { 
  console.log('Failed to inject myScript'); 
}

J'ai essayé

window.doSomething = function() {};

et

document.doSomething = function() {};

sans succès, et j'ai également essayé de les appeler avec window.doSomething() ou document.doSomething() dans la page suivante.evaluate().

7voto

Pooria Azimi Points 4964

Ce qui suit fonctionne pour moi, peut-être qu'une autre partie de la logique de votre application est fausse :

inject.coffee

page = require('webpage').create()

page.onConsoleMessage = (msg) -> console.log msg

page.open "http://www.phantomjs.org", (status) ->
  if status is "success"
    page.includeJs "http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js", ->
      if page.injectJs "do.js"
        page.evaluate ->
          title = echoAndReturnTitle('hello')
          console.log title
        phantom.exit()

do.coffee :

window.echoAndReturnTitle = (arg) ->
  console.log "echoing '#{arg}'"
  console.log $(".explanation").text()
  return document.title

Résultat :

> phantomjs inject.coffee
echoing 'hello'

            PhantomJS is a headless WebKit with JavaScript API.
            It has fast and native support for various web standards: 
            DOM handling, CSS selector, JSON, Canvas, and SVG.
            PhantomJS is created by Ariya Hidayat.

PhantomJS: Headless WebKit with JavaScript API

ou si vous préférez JavaScript (ils sont générés automatiquement et sont un peu moches) :

`inject.js' :

// Generated by CoffeeScript 1.3.1
(function() {
  var page;

  page = require('webpage').create();

  page.onConsoleMessage = function(msg) {
    return console.log(msg);
  };

  page.open("http://www.phantomjs.org", function(status) {
    if (status === "success") {
      return page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js", function() {
        if (page.injectJs("do.js")) {
          page.evaluate(function() {
            var title;
            title = echoAndReturnTitle('hello');
            return console.log(title);
          });
          return phantom.exit();
        }
      });
    }
  });

}).call(this);

do.js :

// Generated by CoffeeScript 1.3.1
(function() {

  window.echoAndReturnTitle = function(arg) {
    console.log("echoing '" + arg + "'");
    console.log($(".explanation").text());
    return document.title;
  };

}).call(this);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X