将Java变量传递给另一个Java方法中嵌入的JavaScript方法

将Java变量传递给另一个Java方法中嵌入的JavaScript方法,java,javascript,Java,Javascript,我有以下Java代码: public void nextElement() { try { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); System.out.println("Execut

我有以下Java代码:

    public void nextElement()
    {
        try
        {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
            System.out.println("Executing...");
            JavascriptExecutor js = (JavascriptExecutor) driver;
            String input_tag = "input";
            js.executeScript(createHTML(input_tag));
            System.out.println("Completed execution..");
        }
        catch(Exception exp)
        {
            exp.printStackTrace();
        }
    }
        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
我现在需要
createHTML()
方法来接受变量
input\u标记的值,并将其传递给
createHTML()
Java方法中嵌入的JavaScript方法

        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
createHTML()
方法看起来有点像这样:

    public String createHTML(String tag) //"tag" accepts value from "input_tag"
    {
        String temp = "";
        temp += "function test(javascript_tagname)"; //"javascript_tagname" should be the value passed in the Java variable "tag"
        temp += "{ ";
        temp += "  var x = document.getElementsByTagName('javascript_tagname');";
        temp += "  var i = 0;";
        temp += "  for (var i=0; i<x.length; i++)";
        temp += "  {";
        temp += "     x[i].onclick = function()";
        temp += "     {";
        temp += "        var previousStyle = this.style.getAttribute('cssText');";
            -----------------
            -----------------
    }
        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
publicstringcreatehtml(stringtag)/“tag”接受来自“input\u tag”的值
{
字符串temp=“”;
temp+=“函数测试(javascript_标记名)”;/“javascript_标记名”应为Java变量“tag”中传递的值
温度+=“{”;
temp+=“var x=document.getElementsByTagName('javascript_标记名');”;
温度+=“变量i=0;”;

temp+=“for(var i=0;i我想你想要的更像这样

public String createHTML(String tag) //"tag" accepts value from "input_tag"
{
    String temp = "";
    temp += "function test()";
    temp += "{ ";
    temp += "var javascript_tagname = \"" + jsonencode(tag) + "\";";
    temp += "  var x = document.getElementsByTagName(javascript_tagname);";
    temp += "  var i = 0;";
    temp += "  for (var i=0; i<x.length; i++)";
    temp += "  {";
    temp += "     x[i].onclick = function()";
    temp += "     {";
    temp += "        var previousStyle = this.style.getAttribute('cssText');";
}
        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
publicstringcreatehtml(stringtag)/“tag”接受来自“input\u tag”的值
{
字符串temp=“”;
temp+=“函数测试()”;
温度+=“{”;
temp+=“var javascript\u标记名=\”“+jsonencode(标记)+“\”;”;
temp+=“var x=document.getElementsByTagName(javascript_标记名);”;
温度+=“变量i=0;”;

temp+=“for(var i=0;i当您从字符串中从头开始创建JavaScript代码时,为什么不简单地用参数替换它呢

String temp = "";
temp += "function test()";
temp += "{ ";
temp += "  var x = document.getElementsByTagName('" + tag + "');";
temp += "  var i = 0;";
temp += "  for (var i=0; i<x.length; i++)";
temp += "  {";     
temp += "     x[i].onclick = function()";
temp += "     {";
temp += "        var previousStyle = this.style.getAttribute('cssText');";
        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
String temp=”“;
temp+=“函数测试()”;
温度+=“{”;
temp+=“var x=document.getElementsByTagName(“+tag+”);”;
温度+=“变量i=0;”;
temp+=“for(var i=0;i如果要将变量的值绑定(硬代码)到脚本源,其他两个答案是可行的。您仍然需要调用该函数

        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
如果要调用函数并传递参数,请不要硬编码脚本中的参数,只需使用invokeFunction方法作为参数传递脚本函数的名称和脚本中定义的函数的参数列表:

        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
不确定您想做什么,但举一个简短的工作示例:

        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
public void nextElement()
{
    try
    {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        System.out.println("Executing...");
        String input_tag = "input";
        engine.eval(createHTML(""));
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname_param" );
    }
    catch(Exception exp)
    {
        exp.printStackTrace();
    }
}

public String createHTML(String tag) //"tag" is not used
{
    String temp = "";
    temp += "function test(javascript_tagname)"; //"javascript_tagname" should be the value passed in the Java variable "tag"
    temp += "{ ";
    temp += "  println(javascript_tagname);";
    temp += "};";
    return temp;

}
输出:

        engine.eval(createHTML());
        Invocable invocableEngine = (Invocable) engine;
        invocableEngine.invokeFunction("test", "javascript_tagname" );
Executing...
javascript_tagname_param

我不熟悉您正在使用的库,但是如何将javascript函数移动到
.js
文件中,将js文件加载到
JavascriptExecutor
,然后执行类似
js.executeScript(String.format(“test(%s);”,escape(input_tag))的操作
调用它?您的脚本只是声明函数,还是实际上正在调用它?@Chris Martin:我不想使用外部.js文件:)@Maurice Perry:我不直接调用函数test()。我只调用函数createHTML().为什么不呢?你可以从类路径加载它。是的,听起来像是go@user1121883:我可能听起来很幼稚,但这些行去哪里了?在方法nextElement()中?是的:它们替换了js.executeScript(createHTML(input_标记));@user3571573而不是js.executeScript(createHTML(input_标记));input_标记是“javascript_标记名”“@user1121883:谢谢您的解释:)但是我需要更多的澄清。我遇到的博客和教程提到engine.eval()方法中的参数总是一个字符串类型,在同一个类中声明并分配了一个值。但是在我的情况下,我需要engine.eval()调用另一个Java方法,然后用参数调用test()方法。有什么帮助吗?我有点迷路了!:(在temp+=“var x=document.getElementsByTagName(“+tag+”);”;我想函数测试仍然不知道参数,对吗?函数之后既没有也不需要任何参数,因为您将Java中的值硬编码为JavaScript。