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

我正在使用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=\"\" type=\"text/javascript\">';"); } } 

我链接的javascript文件的代码是

 alert("hi Nate"); 

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

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

我也尝试过这个解决方案,它显然是为另一个版本的Selenium(不是webdriver)制作的,因此无法在最低限度下工作: 在selenium中加载包含有用测试函数的外部js文件

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

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

或者,您可能正在使用browserbot来定位元素。 在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);"); 

将我们的JS-File注入DOM

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

injectingToDOM.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  

OurSeleniumCode.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作为String传递给executeScript(),则不要在JavaScript代码之间使用任何注释,例如injectingToDOM.js删除所有注释数据。