如何使用Selenium的JavascriptExecutor将<script>添加到Head中

总结

我想找出一种方法,使用 's 将标签添加到 DOM 的头部,或者任何其他方法都可以。<script>SeleniumJavascriptExecutor


我尝试了很多方法,也发现了一些类似的主题,但没有一个解决了我的问题,这就是为什么我觉得有必要在这里问它。


例如:


这个问题中建议的解决方案并没有解决我的问题。有些人说这对他们有用,但不,它不适合我。


我一直在尝试执行什么?

以下是我要执行的代码的小片段:


            WebDriver driver = new FirefoxDriver();

            JavascriptExecutor jse = (JavascriptExecutor) driver;


            jse.executeScript("var s = document.createElement('script');");

            jse.executeScript("s.type = 'text/javascript';");

            jse.executeScript("s.text = 'function foo() {console.log('foo')}';");

            jse.executeScript("window.document.head.appendChild(s);");

我只是跳过了上面的代码,您可以使用等导航到网页,然后尝试执行脚本。driver.get()


另外,将包含我想使用的实际脚本,所以我只是放了一个函数来给出这个想法。s.textfoo()


上面的代码会在您运行它时引发此错误:

Exception in thread "main" org.openqa.selenium.JavascriptException: ReferenceError: s is not defined


到目前为止,我已经尝试了在互联网上找到的所有可能的解决方案,但似乎没有一个有效。


慕码人2483693
浏览 168回答 2
2回答

达令说

OP提出了以下解决方案:jse.executeScript("var s=window.document.createElement('script');" +&nbsp;"s.type = 'text/javascript';" + "s.text = function foo() {console.log('foo')};" +&nbsp;"window.document.head.appendChild(s);");

慕森卡

首先,此行无效。&nbsp;&nbsp;&nbsp;&nbsp;jse.executeScript("s.text&nbsp;=&nbsp;'function&nbsp;foo()&nbsp;{console.log('foo')}';");请注意如何将单引号文本括在单引号中。将一个集合用作“\””我个人会通过做(编辑使其成为全局函数)来做到这一点:using&nbsp;OpenQA.Selenium.Support.Extensions; driver.ExecuteJavascript("window.foo&nbsp;=&nbsp;function&nbsp;foo()&nbsp;{console.log('foo')}");就这么简单。您正在通过执行此操作将 foo 注册为方法。执行此javascript后,您可以手动进入浏览器开发人员工具并调用“foo()”进行检查。此外,您可以通过直接在控制台中注册来检查这一点。只需在浏览器控制台中输入“function foo() {console.log('foo')}”,然后调用“foo()”。无需将其添加为脚本标记。编辑#2:我修复了上面的代码建议,以便将方法分配给窗口,从而可以全局访问,并且在javascript执行器运行代码的匿名脚本之外。这不起作用的原始问题已通过此解决,至少在我对它的测试中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java