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

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

看起来它正确地将节点放入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)制作的,因此一点也不起作用:加载一个外部js文件,其中包含硒中有用的测试函数。


答案 1

据此:http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

您可能正在使用 browserbot 获取测试的当前窗口或文档的句柄。幸运的是,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);");

答案 2

将我们的 JS 文件注入 DOM

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

注射到多姆.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);

我们的硒代码.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");

OurOwnJavaScriptFile.js

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

注意:如果您要将 JS-File 作为字符串传递给 executeScript(),那么不要在 JavaScript 代码之间使用任何注释,例如注入ToDOM.js删除所有注释数据。