phantomjs和requirejs

文件main.js中的代码是这样的:
phantom.injectJs("libs/require-1.0.7.js");
      require.config(
        {
          baseUrl: "" 
        }
      );
      require([],function(){});

当我在命令行中运行“phantomjs main.js”时,requirejs在main.js中运行不正常.我知道如何在浏览器中运行的页面中使用requirejs(包括phantomjs的方式:page.open(url,callback)),但不像上面那样.我尝试使用像main.js这样的requirejs,我觉得这是一个很受欢迎的问题.谢谢!

解决方法

我只是挣扎了一段时间.我的解决方案并不干净,但它确实有效,而且由于来自phantomjs的未完成的api文档,我很满意.

罗嗦的解释

你需要三个文件.一个是你的amd phantomjs测试文件,我称之为“amd.js”.第二个是你要加载的html页面,我将其命名为“amd.html”.最后我称之为“amdTestModule.js”的浏览器测试.

在amd.html中,按正常方式声明脚本标记

<script data-main="amdTestModule.js" src="require.js"></script>

在你的phantomjs测试文件中,这就是hacky的地方.创建页面,然后加载’fs’模块.这允许您打开相对文件路径.

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

page.open('file://' + fs.absolute('tests/amd.html'));

现在因为requirejs异步加载文件,我们不能只是将回调传递给page.open并期望事情顺利进行.我们需要一些方法
1)在浏览器中测试我们的模块,并将结果传回我们的phantomjs上下文.要么
2)告诉我们的phantomjs上下文,在加载所有资源时,运行测试.

对我来说,#1更简单.我通过以下方式完成了

page.onConsoleMessage = function(msg) {
    msg = msg.split('=');
    if (msg[1] === 'success') {
        console.log('amd test successful');
    } else {
        console.log('amd test Failed');
    }
    phantom.exit();
};

**请参阅下面的完整代码获取我的console.log消息.

现在phantomjs显然有一个内置的事件api但它没有记录.我还成功地从他们的page.onResourceReceived和page.onResourceRequested获取请求/响应消息 – 这意味着您可以在加载所有必需模块时进行调试.然而,为了传达我的测试结果,我只使用了console.log.

现在如果从未运行console.log消息会发生什么?我能想到解决这个问题的唯一方法就是使用setTimeout

setTimeout(function() {
    console.log('amd test Failed - timeout');
    phantom.exit();
},500);

应该这样做!

完整代码

目录结构

/projectRoot  
  /tests  
    - amd.js  
    - amdTestModule.js  
    - amd.html  
    - require.js (which I symlinked)  
    - <dependencies> (also symlinked)

amd.js

'use strict';
var page = require('webpage').create();
var fs = require('fs');

/*
page.onResourceRequested = function(req) {
    console.log('\n');
    console.log('REQUEST');
    console.log(JSON.stringify(req,null,4));
    console.log('\n');
};
page.onResourceReceived = function(response) {
    console.log('\n');
    console.log('RESPONSE');
    console.log('Response (#' + response.id + ',stage "' + response.stage + '"): ' + JSON.stringify(response,4));
    console.log('\n');
};
*/

page.onConsoleMessage = function(msg) {
    msg = msg.split('=');
    if (msg[1] === 'success') {
        console.log('amd test successful');
    } else {
        console.log('amd test Failed');
    }
    phantom.exit();
};

page.open('file://' + fs.absolute('tests/amd.html'));

setTimeout(function() {
    console.log('amd test Failed - timeout');
    phantom.exit();
},500);

amd.html

<!DOCTYPE html>
<html>

<head>
    <Meta charset="UTF-8">
</head>

<body>
    <script data-main='amdTestModule.js' src='require.js'></script>
</body>

</html>

amdTestModule.js

require([<dependencies>],function(<dependencies>) {
    ...
    console.log(
        (<test>) ? "test=success" : "test=Failed"
    );
});

安慰

$phantomjs tests/amd.js
amd test successful

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)
原生JS实现别踩白块小游戏(七)
原生JS实现别踩白块小游戏(二)