将Java变量传递给另一个Java方法中嵌入的JavaScript方法
我有以下Java代码:将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
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。