本文介绍了将PhantomJS调用中的变量暴露给injectJS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经按照示例从入门页面注入jQuery,并且效果很好.我在同一目录中有jQuery的本地副本,并执行类似的操作...

I've followed examples for injecting jQuery from the getting started page and that works just fine. I have a local copy of jQuery in the same directory, and do something like...

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

当我尝试注入自己的脚本时,我无法使用任何功能.假设我有一个名为myScript.js的脚本,

When I try to inject my own script(s), none of the functions are available to me. Say I have a script called myScript.js that just has

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

然后我不能再使用doSomething了...

I cannot then use doSomething like...

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

我尝试过

window.doSomething = function() {};

document.doSomething = function() {};

也没有运气,以及尝试在随后的page.evaluate()中使用window.doSomething()或document.doSomething()来调用它们.

as well with no luck, as well as trying to call them with window.doSomething() or document.doSomething() in the subsequent page.evaluate().

推荐答案

以下内容对我有用,也许您的应用逻辑的其他部分是错误的:

The following works for me, maybe some other part of your app logic is wrong:

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

结果:

> 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


或者您更喜欢JavaScript(它们是自动生成的,而且有点难看):


or if you prefer JavaScript (they're auto-generated and a little ugly):

`inject.js':

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

这篇关于将PhantomJS调用中的变量暴露给injectJS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-22 14:27