如何使用 selenium 将 javascript 文件加载到 DOM 中?

IT技术 java javascript selenium selenium-webdriver
2021-03-11 18:47:50

我正在使用 Selenium WebDriver 尝试将外部 javascript 文件插入到 DOM 中,而不是将整个内容输入到 executeScript 中。

看起来它正确地将节点放入 DOM 中,但是它只是忽略了源,即所述源 js 文件上的函数没有运行。

这是我的代码:

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Example  {
    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://google.com");
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("document.getElementsByTagName('head')[0].innerHTML += '<script src=\"<PATH_TO_FILE>\" type=\"text/javascript\"></script>';");
    }
}

我链接到的 javascript 文件的代码是

alert("hi Nate");

我已将 js 文件放在本地主机上,使用 file:/// 调用它,然后在外部服务器上进行了尝试。没有骰子。

此外,在 Java 部分,我尝试使用该技巧附加 'scr'+'ipt',但仍然无效。当我使用 Firefox 的检查元素检查 DOM 时,我可以看到它正确加载了脚本节点,所以我很困惑。

我也尝试过这个解决方案,它显然是为另一个版本的 Selenium(不是 webdriver)制作的,因此至少没有工作:加载一个包含有用的 selenium 测试功能的外部 js 文件

2个回答

根据这个:http : //docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

您可能正在使用浏览器机器人来获取当前窗口或测试文档的句柄。幸运的是,WebDriver 总是在当前窗口的上下文中评估 JS,因此您可以直接使用“窗口”或“文档”。

或者,您可能正在使用浏览器机器人来定位元素。在 WebDriver 中,这样做的习惯用法是首先定位元素,然后将其作为参数传递给 Javascript。因此:

那么下面的工作在 webdriver 中吗?

WebDriver driver = new FirefoxDriver();
((JavascriptExecutor) driver)
  .executeScript("var s=window.document.createElement('script');\
  s.src='somescript.js';\
  window.document.head.appendChild(s);");
确保脚本加载了其他脚本,这取决于它可以在脚本元素的 onload 事件上启动,或者使用 setTimeout 直到脚本加载完毕并且脚本中定义的对象可用。
2021-04-24 18:47:50
不错的代码,伙计,但是这个 js 应该在哪条路径上?
2021-04-30 18:47:50
好的,js文件已经加载了,因为我是通过调用document.head.lastChild看到的,但是我不能调用文件中定义的任何方法,总是“bla未定义”。顺便说一句,我正在使用python。
2021-05-05 18:47:50
@estemendoza 我猜它是相对的,但可以是相对的,例如/js/somescript.js或在您的本地计算机上file://home/me/js/somescript.js
2021-05-11 18:47:50
是的,它确实!我最终弄乱了它一段时间,我相信问题不在于 Selenium 或类似的东西,而是根据stackoverflow.com/questions/1197575,我使用 innerHTML 来附加 DOM,而不是 appendChild /... 希望这个问题将来能对某人有所帮助,因为我从来没有找到使用 selenium 添加外部 javascript 文件的工作示例
2021-05-16 18:47:50

将我们的 JS 文件注入 DOM

将我们的 JS 文件从本地服务器注入浏览器应用程序,以便我们可以使用文档对象访问我们的函数。

注入到DOM.js

var getHeadTag = document.getElementsByTagName('head')[0]; 
var newScriptTag = document.createElement('script'); 
newScriptTag.type='text/javascript'; 
newScriptTag.src='http://localhost:8088/WebApplication/OurOwnJavaScriptFile.js';
// adding <script> to <head>
getHeadTag.appendChild(newScriptTag);

我们的SeleniumCode.java

String baseURL = "http://-----/";
driver = new FirefoxDriver();
driver.navigate().to(baseURL);
JavascriptExecutor jse = (JavascriptExecutor) driver;
Scanner sc = new Scanner(new FileInputStream(new File("injectingToDOM.js")));
String inject = ""; 
    while (sc.hasNext()) {          
        String[] s = sc.next().split("\r\n");   
        for (int i = 0; i < s.length; i++) {
            inject += s[i];
            inject += " ";
        }           
    }       
    jse.executeScript(inject);
    jse.executeScript("return ourFunction");

我们自己的JavaScriptFile.js

document.ourFunction =  function(){ .....}

注意 :如果你将 JS-File 作为 String 传递给 executeScript() ,那么不要在 JavaScript 代码之间使用任何注释,比如 injectingToDOM.js 删除所有注释数据。

在js文件中使用“document.ourFunction = function(){ .....}”后完美运行
2021-04-28 18:47:50