2012-04-14 28 views
8

Podążyłem za przykładami wstrzykiwania jQuery ze strony początkowej i to działa dobrze. Mam lokalną kopię jQuery w tym samym katalogu, a zrobić coś takiego ...Wystawianie zmiennych z wywołania PhantomJS do injectJS

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

Kiedy próbuję wprowadzić mój własny skrypt (-y), żadna z funkcji są dostępne do mnie. Że mam skrypt o nazwie myScript.js że po prostu musi

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

nie może użyć doSomething jak ...

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

Próbowałem

window.doSomething = function() {}; 

i

document.doSomething = function() {}; 

jak również bez powodzenia, a także próbuje wywołać je za pomocą window.doSomething() lub document.doSomething() w kolejnej page.evaluate().

Odpowiedz

7

Poniższy pracuje dla mnie, a może jakaś inna część swojej aplikacji logiki jest źle:

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 

Wynik:

> 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 

lub jeśli wolisz JavaScript (są generowane automatycznie i trochę brzydki):

`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); 
+0

Dzięki, to mi bardzo pomogło! –