我在一个js文件中使用PhantomJs,CasperJs和Js来运行cmd.
想象一下,我们有两个文件(test1.js和test2.js).这两个文件都有一个url/site变量,用于将测试定向到特定地址.每当环境发生变化或目标位置发生变化时,我们都需要更新此变量.
为了避免更新文件,我想通过命令行传递值,以测试它的位置.
有没有办法在运行文件时通过cmd声明字符串变量?
例如:
casperjs test.js "var site='http://google.com';"
Run Code Online (Sandbox Code Playgroud) 我试图测试我的React组件并得到以下错误.
不变违规:无法在"连接()"的上下文或道具中找到"存储".将根组件包装在<Provider>中,或者显式地将"store"作为prop传递给"Connect()".
在测试中渲染Component时出错.
beforeEach(() => {
Component = TestUtils.renderIntoDocument(<SideMenu />);
});
Run Code Online (Sandbox Code Playgroud)
在页面上呈现Component时,它工作正常.但是在测试中,我无法将存储明确地传递给Component.
有人能指出正确的方向吗?
在PhantomJS脚本中,我想加载一个自定义模块,但似乎相对路径在PhantomJS中不起作用?
的script.js:
var foo = require('./script/lib/foo.js');
foo.bar('hello world');
phantom.exit();
Run Code Online (Sandbox Code Playgroud)
foo.js:
exports.bar = function(text){
console.log(text);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
编辑:
inject()并不重要,因为我不需要向HTML页面注入JS,而是加载我自己的模块,如require('fs')但具有相对路径.
一点背景......我对javascript和phantom.js有点新,所以我不知道这是一个javascript还是phantom.js bug(功能?).
以下成功完成(对于缺少的phantom.exit(),您只需要在完成后按ctrl + c):
var page = require('webpage').create();
var comment = "Hello World";
page.viewportSize = { width: 800, height: 600 };
page.open("http://www.google.com", function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
} else {
page.includeJs('http://code.jquery.com/jquery-latest.min.js', function() {
console.log("1: ", comment);
}, comment);
var foo = page.evaluate(function() {
return arguments[0];
}, comment);
console.log("2: ", foo);
}
});
Run Code Online (Sandbox Code Playgroud)
这有效:
page.includeJs('http://code.jquery.com/jquery-latest.min.js', function() {
console.log("1: ", comment);
}, comment);
Run Code Online (Sandbox Code Playgroud)
输出:1: Hello World
但不是:
page.includeJs('http://code.jquery.com/jquery-latest.min.js', function(c) { …Run Code Online (Sandbox Code Playgroud) 我试图在node.js进程中包装PhantomJS脚本.幻像脚本从命令行上提供的参数中获取URL并输出pdf(非常类似于pahntom安装中包含的rasterize.js示例).
我的幻像脚本工作正常,只是我的雇主想要一个节点脚本,如果可能的话.没问题,我可以使用node-phantom节点模块来包装它.
但现在我遇到了绊脚石,我的幻像脚本有:
var page = require('webpage').create();
Run Code Online (Sandbox Code Playgroud)
因此,node.js正在尝试查找名为"网页"的模块,"网页"模块内置于幻像安装中,因此节点无法找到它.据我所知,没有名为'网页'的npm模块.
'网页'使用如下:
page.open(address, function (status) {
if (status !== 'success') {
// --- Error opening the webpage ---
console.log('Unable to load the address!');
} else {
// --- Keep Looping Until Render Completes ---
window.setTimeout(function () {
page.render(output);
phantom.exit();
}, 200);
}
});
Run Code Online (Sandbox Code Playgroud)
其中address是命令行中指定的url,输出是另一个参数,即文件的名称和类型.
谁能帮我吗?这是一个非常抽象的,所以如果我诚实的话,我并没有期待太多,但值得一试.
谢谢.
编辑 - 约2小时后
我现在有这个抛出PDF:
var phanty = require('node-phantom');
var system = require('system');
phanty.create(function(err,phantom) {
//var page = require('webpage').create();
var address;
var output;
var size;
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用phantomJS来捕获URL的屏幕截图,但是当我调用phantomJS(来自命令行或web应用程序)时,它会挂起并且看不到执行"exit()"调用.我似乎无法找到任何错误消息,它一直运行,直到我杀了它.这是传递给phantomjs命令的JS文件:
var page = require('webpage').create();
var system = require('system');
var script_address = '';
var page_to_load = '';
var members_id = '';
var activities_id = '';
var folder_path = '';
if (system.args.length < 5)
{
console.log('Usage: phantom_activity_fax.js script_address page_to_load members_id activities_id folder_path');
console.log('#Args: '+system.args.length);
phantom.exit();
}//END IF SYSTEM.ARGS.LENGTH === 1
//ASSIGN OUR ARGUMENTS RECIEVED
script_address = system.args[0];
page_to_load = system.args[1];
members_id = system.args[2];
activities_id = system.args[3];
folder_path = system.args[4];
console.log(system.args[0]);
console.log(system.args[1]);
console.log(system.args[2]);
console.log(system.args[3]);
console.log(system.args[4]);
//OPEN OUR PAGE WITH THE VALUES PROVIDED …Run Code Online (Sandbox Code Playgroud) 现在我正在使用以下命令来运行 phantomJS
exec('./phantomjs table.js',$op,$er);
Run Code Online (Sandbox Code Playgroud)
var page = require('webpage').create();
page.open('table.php', function () {
page.render('table.png');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
这符合目的.但现在我需要使用动态变量,即date.那么是否可以在exec命令行中传递PHP或Javascript变量,以便我可以在里面使用该变量table.js?
我尝试根据此处发布的解决方案修改我的代码.通过exec将变量传递给PhantomJS
exec('./phantomjs table.js http://www.yahoo.com',$op,$er);
Run Code Online (Sandbox Code Playgroud)
var args = require('system').args;
var page = require('webpage').create();
var address = system.args[1];
page.open(address, function () {
page.render('table.png');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
但这导致了两个问题:
如果我删除修改后的代码,一切都按预期工作.
在table.js里面我用过这个:
var args = require('system').args;
args.forEach(function(arg, i) {
console.log(i+'::'+arg);
});
var page = require('webpage').create();
var address = 'http://www.gmail.com';
page.open(address, function () { …Run Code Online (Sandbox Code Playgroud) 我试图运行PhantomJS从内selenium.webdriverCentOS的服务器上.PhantomJS在路径中并且从终端正常运行.但是在脚本中它似乎已启动,但之后无法在指定端口上到达(我尝试了2个不同的打开端口,来自我的提供程序29842和60099,它们都不工作,并且没有指定端口也没有启动它).
错误发生在selenium.webdriver.common.utils:
try:
socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_.settimeout(1)
socket_.connect(("localhost", port))
socket_.close()
return True
except socket.error:
return False
Run Code Online (Sandbox Code Playgroud)
这是从我的脚本(我尝试没有任何参数,以及编写可执行文件的完整路径,但都没有工作):
self.browser = webdriver.PhantomJS(
port=29842,
desired_capabilities={
'javascriptEnabled': True,
'platform': 'windows',
'browserName': 'Mozilla',
'version': '5.0',
'phantomjs.page.settings.userAgent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36"
}
)
Run Code Online (Sandbox Code Playgroud)
这是初始化webdriver的脚本selenium.webdriver.phantomjs.service.我检查并subprocess.Popen实际上lauches phantomjs,错误发生在while循环:
try:
self.process = subprocess.Popen(self.service_args,
stdout=self._log, stderr=self._log)
except Exception as e:
raise WebDriverException("Unable to start phantomjs with ghostdriver.", e)
count = 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用Node.JS和Express在Web应用程序上与一个小组合作.我们需要能够生成可以打印为硬拷贝和硬拷贝形式的报告.我们希望在服务器上为报告和手写表单动态生成PDF.我们目前正在服务器上使用EJS模板.
我认为能够使用模板来构建表单/报告并从生成的HTML中生成PDF会很方便,但是我这样做的选项在我能找到的范围内看起来有限.我看了两种不同的解决方案:
编辑:我找到了另一个Node.JS模块,它能够从HTML生成名为node-wkhtml的 PDF,它依赖于wkhtmltopdf.我现在正在比较使用node-phantom和node-wkhtml.我已经能够在节点服务器上生成具有这两者的PDF,并且它们似乎都能够满足我的需要.
我已经看到了一些使用PhantomJS从网站呈现PDF文档的例子,但我见过的所有例子都使用了一个URL而不是一串HTML.我不确定是否可以使用模板进行此工作以动态生成PDF报告.
当我收到报告请求时,我希望从EJS模板生成HTML,并使用它生成PDF.反正我是否使用Phantom在服务器上完全动态创建页面而不提出请求?
我的另一个选择是使用PDFkit,它允许动态生成PDF,但它是一个类似画布的API,据我所知,它并不真正支持任何模板概念.
有谁知道我是否可以使用PhantomJS和Node从模板生成的HTML动态生成PDF?或者是否有人知道我可以用来从我的Node/Express后端生成和提供可打印报告/表单的任何其他解决方案.
我们一直在使用Jasmine编写JavaScript业务逻辑的规范.我们能够在浏览器中运行我们的测试套件,但是我们如何在TeamCity中集成它?我们最好不要使用NodeJS,而是尽可能简单.
phantomjs ×10
javascript ×5
node.js ×2
casperjs ×1
cmd ×1
ghostdriver ×1
jasmine ×1
jquery ×1
pdf ×1
port ×1
python ×1
react-redux ×1
reactjs ×1
redux ×1
rendering ×1
requirejs ×1
teamcity ×1
templates ×1
web-scraping ×1