【问题标题】:Is there any way to execute javascript functions from java code有没有办法从java代码执行javascript函数
【发布时间】:2020-02-14 11:25:47
【问题描述】:

我正在尝试从 java 代码执行一个 javascript 函数。

我使用了 selenium 包中的 JavascriptExecutor。

我试过下面的代码

  JavascriptExecutor js;
  js.executeScript("let time;");
  js.executeScript("time = 2;");
  js.executeScript("function f(){console.log(time);}");
  js.executeScript("f()");

这是输出

Exception in thread "Thread 0" 
org.openqa.selenium.JavascriptException: javascript error: f is not defined

有没有办法从java代码执行上面的脚本?有可能吗?

【问题讨论】:

  • @i.bondarenko 谢谢。但我想知道 JavaScriptExecutor 方法是否可行
  • 每次调用executeScript 都会创建一个单独的脚本。您必须将所有这些行放入同一个调用中,以便它们可以看到彼此的结果。
  • @M.Prokhorov 但从上面的 sn-p 中,即使它们是单独的脚本,'time' 变量也会被识别。有什么解释吗?
  • @SameerKhan,你怎么知道它被识别了,因为你从不打印它? myvariable = 1 本身就是有效的 javascript,它意味着全局变量赋值,并创建它尚未存在的变量,除非在严格模式下(你不是)。

标签: javascript java selenium


【解决方案1】:

试试这个:

String script = "let time;time = 2;function f(){console.log(time);}f()";
JavascriptExecutor js;
js.executeScript(script);

【讨论】:

  • 我有一个用例,我必须使用两行不同的 executeScript。还有其他方法吗?
  • 您可以尝试使用 document.write..."" 将您的脚本注入 DOM(我自己从未尝试过。)所以您的第一个电话to execute script 执行注入脚本的脚本。不知道你为什么不把所有的东西都放在一个字符串里。
【解决方案2】:

您可以使用窗口属性(或任何内置的),它们会一直存在:

js.executeScript("window.time = 4");
js.executeScript("window.f = () => console.log(window.time)");
js.executeScript("window.f()");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2017-07-06
    • 2021-03-12
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多