如何从Java运行casperjs脚本

如何从Java运行casperjs脚本,java,phantomjs,casperjs,Java,Phantomjs,Casperjs,我有以下casperjs脚本: var casper = require('casper').create({ verbose: true, logLevel: 'debug',//needed for debugging pageSettings: { webSecurityEnabled: false, } }); casper.start('http://toolsqa.com/automation-practice-form/',func

我有以下casperjs脚本:

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug',//needed for debugging
    pageSettings: {
        webSecurityEnabled: false,

    }
});
casper.start('http://toolsqa.com/automation-practice-form/',function() {
    var path = 'C:/WINDOWS/TEMP';
    this.download(casper.cli.get("url"),path + "/test.xls");
});

casper.run(function() {
    this.echo('Done.').exit();
});
脚本通过CLI执行时运行,并将文件下载到Temp文件夹中。我通过CLI传递url,执行脚本的命令如下:

--C:\js examples>casperjs testfile path --url="url of file to be downloaded"
--C:\js examples>casperjs CaspetTest.js --url="http://20tvni1sjxyh352kld2lslvc.wpengine.netdna-cdn.com/wp-content/uploads/2016/09/Test-File-to-Download.xlsx"
现在我有两项任务:

  • 要从java运行此脚本,请执行以下命令:

    Process Process=Runtime.getRuntime().exec(“C:/Program Files(x86)/PhantomJS/PhantomJS-2.1.1-windows/bin/PhantomJS download.js”)

  • 命令运行,但未下载任何文件。 从java执行此脚本的正确方法是什么

  • 在java中执行时将url作为参数传递,就像我通过CLI所做的那样。我们怎么能做到呢
  • 编辑: 我尝试使用脚本引擎eval函数:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    engine.eval(new java.io.FileReader(System.getProperty("user.dir")+"/resources/CasperTest.js"));
    
    但在这种情况下,我得到以下例外:

    javax.script.ScriptException: ReferenceError: "require" is not defined in <eval> at line number 1
        at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:455)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:439)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:401)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:397)
        at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:147)
        at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
        at loginpage.main(loginpage.java:91)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    Caused by: <eval>:1 ReferenceError: "require" is not defined
        at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
        at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319)
        at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291)
        at jdk.nashorn.internal.objects.Global.__noSuchProperty__(Global.java:914)
        at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:1)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:636)
        at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:229)
        at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:387)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:437)
        ... 10 more
    [INFO  - 2017-05-12T07:27:05.869Z] ShutdownReqHand - _handle - About to shutdown
    
    javax.script.ScriptException:ReferenceError:“require”未在第1行中定义
    位于jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:455)
    位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:439)
    位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:401)
    位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:397)
    位于jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:147)
    位于javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
    位于loginpage.main(loginpage.java:91)
    在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
    位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
    位于java.lang.reflect.Method.invoke(Method.java:497)
    位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    由::1 ReferenceError引起:未定义“require”
    位于jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
    位于jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319)
    位于jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291)
    在jdk.nashorn.internal.objects.Global.\uuuuNoSuchProperty\uuuuuu(Global.java:914)
    在jdk.nashorn.internal.scripts.Script$^eval\:程序(:1)
    位于jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:636)
    位于jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:229)
    位于jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:387)
    位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:437)
    ... 10多
    [信息-2017-05-12T07:27:05.869Z]关机请求手动-手柄-即将关机
    
    看一看调用外部javascript文件的示例

    您可以按如下方式传递参数:

    java YourClassWithMain方法arg1 arg2等

    public class YourClassWithMainMethod {
        public static void main (String[] args) {
            String firstArg = args[0];
            String scndArg = args[1];
            // etc
            // do your stuff with input
        }
    }
    

    使用脚本引擎类不起作用。我得到了“ScriptException:ReferenceError:“require”未定义”,正如问题中提到的,您很可能必须首先加载它