为了账号安全,请及时绑定邮箱和手机立即绑定

从 Java Selenium 执行 JavaScript 库和函数

从 Java Selenium 执行 JavaScript 库和函数

30秒到达战场 2021-09-04 17:25:16
我在 Eclipse 中,编写 Java GUI/脚本,运行无头 chromedriver,我在尝试在驱动程序中加载 html2canvas.js [1] [2]库时遇到问题,然后调用我在其上编写的函数浏览器中的库;我收到此代码的未定义错误:String ss1ScriptLoc = "C:\\Users\\me\\Desktop\\resources\\html2canvas.min.js";String ss2ScriptLoc = "C:\\Users\\me\\Desktop\\resources\\takeScreenShot.js";je.executeScript(        "var headID1 = document.getElementsByTagName('head')[0]; "        + "var newScript1 = document.createElement('script'); "        + "newScript1.type = 'text/javascript'; "        + "newScript1.src = '" + ss1ScriptLoc + "'; "        + "headID1.appendChild(newScript1); "        + "var headID2 = document.getElementsByTagName('head')[0]; "        + "var newScript2 = document.createElement('script'); "        + "newScript2.type = 'text/javascript'; "        + "newScript2.src = '" + ss2ScriptLoc + "'; "        + "headID2.appendChild(newScript2); "        + "$(document).ready( function () { takeScreenShot(); });"    );这会导致未定义函数“takeScreenShot();”的错误 我以为我已经在本地 .js 文件中定义了它。Starting ChromeDriver 75.0.3770.140 (-refs/branch-heads/3770@{#1155}) on port 48415Only local connections are allowed.Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.Aug 05, 2019 9:36:53 AM org.openqa.selenium.remote.ProtocolHandshake createSessionINFO: Detected dialect: W3Cjava.util.concurrent.ExecutionException: org.openqa.selenium.JavascriptException: javascript error: takeScreenShot is not defined  (Session info: headless chrome=75.0.3770.142)Caused by: org.openqa.selenium.JavascriptException: javascript error: takeScreenShot is not defined  (Session info: headless chrome=75.0.3770.142)Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:48'System info: host: '', ip: '', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_191'Driver info: org.openqa.selenium.chrome.ChromeDriver
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

出于安全原因,Chrome 不允许您加载本地资源。您需要将文件放在驱动程序可以访问的地方(网络驱动器/服务器/存储库等),或者读取文件并将其作为参数传递。


以下是第二个选项的工作原理:不要src在脚本元素上指定


je.executeScript(

    $"var headID1 = document.getElementsByTagName('head')[0]; "

    + "var newScript1 = document.createElement('script'); "

    + "newScript1.type = 'text/javascript'; "

    + "var code = {fileText}; "

    + "newScript1.appendChild(document.createTextNode(code)); "

    + "headID1.appendChild(newScript1); "

    + "takeScreenShot();"

);


查看完整回答
反对 回复 2021-09-04
?
largeQ

TA贡献2039条经验 获得超7个赞

这是我使用 Selenium 执行/注入本地存储的“.js”文件的方法:


  File newJSFile = new File(path_to_local_js_file);

        if (newJSFile.exists())

        {

            try

            {

                  Scanner sc = new Scanner(new FileInputStream(newJSFile));

        String js_TxtFile = ""; 

            while (sc.hasNext()) {          

                String[] s = sc.next().split("\r\n");   

                for (int i = 0; i < s.length; i++) {

                    js_TxtFile += s[i];

                    js_TxtFile += " ";

                }   


            }

              try

                {

                ((JavascriptExecutor)driver).executeScript(js_TxtFile);

                }

                catch (Exception ex)

                {

                     System.out.println ("Exception when running Javascript: " + ex.toString());

                }


            }

            catch (Exception ex)

            {

            System.out.println(ex.toString());

            }

        }


查看完整回答
反对 回复 2021-09-04
  • 2 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信