我在同一目录中有两个文件:
<html>
<head>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.js"></script>
<script type="text/javascript">
require(["fakeTest"], function () {});
</script>
</head>
<body>
</body>
</html>
和
define(["require", "exports"], function (require, exports) {
alert('foo');
});
如果我在Chrome / FireFox中运行此功能,我会得到我的期望。如果我尝试用CMD运行:
phantomjs --remote-debugger-port=9000 testFile.html
我收到错误:
错误:找不到模块'fakeTest'
phantomjs://bootstrap.js:299 in require
phantomjs://bootstrap.js:263 in require
我尝试过使用最新的PhantomJS和旧版本,与RequireJS一样。我看过谷歌,但一直找不到任何解决方案。我有其他人在他们的计算机上尝试这个,他们看到了同样的问题。我已经尽可能地简化了文件,并且不确定在这一点上还有什么可以尝试。
答案 0 :(得分:1)
如果您直接运行PhantomJS,则需要创建一个脚本来加载页面。请参阅下面的示例。也就是说,如果您正在尝试测试您的网页,那么headless testing frameworks旨在与PhantomJS一起使用。这些框架在运行测试时会处理加载HTML,脚本和其他资源的详细信息。就个人而言,我使用Karma Test Runner和karma-requirejs plugin来运行单元测试。
如果您尝试直接运行PhatomJS,则需要创建一个脚本来打开HTML页面。在下面的简单示例中,运行run.js,打开'testFile.html'页面,然后打印页面标题。然后设置100ms超时再次打印标题然后退出。
var page = require('webpage').create();
page.open('testFile.html', function(status) {
var title = page.evaluate(function() {
return document.title;
});
console.log('Page title is ' + title);
setTimeout(function () {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
phantom.exit()
}, 100);
});
以下是运行命令的输出示例:
phantomjs run.js
Page title is Original Title
Page title is Title Updated
超时的原因是AMD模块是异步加载的,您需要在run.js脚本中构建一种方法来考虑AMD模块的异步性质。我强烈建议使用与RequireJS集成的现有测试运行器之一,而不是重新发明轮子。
要查看此操作,请将testFile.html修改为:
<html>
<head>
<title>Original Title</title>
<script type="text/javascript"
src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.js">
</script>
<script type="text/javascript">
require(["fakeTest"], function () {});
</script>
</head>
<body>
</body>
</html>
fakeTest.js是:
define(["require", "exports"], function (require, exports) {
document.title = 'Title Updated';
});