我正在使用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文件放在我的localhost上,我使用file:///调用它,然后在外部服务器上尝试了它。没有骰子。
此外,在Java部分,我尝试使用该技巧附加'scr'+'ipt',但它仍然无效。当我使用Firefox的inspect元素检查DOM时,我可以看到它正确加载脚本节点,所以我很困惑。
我也试过这个解决方案,这显然是为另一个版本的Selenium(不是webdriver)制作的,因此没有起到任何作用:Load an external js file containing useful test functions in selenium
答案 0 :(得分:14)
根据这个:http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp
您可能正在使用browserbot获取当前句柄 窗口或测试文件。幸运的是,WebDriver总是如此 在当前窗口的上下文中评估JS,以便您可以使用 “窗口”或“文档”直接。
或者,您可能正在使用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);");
答案 1 :(得分:4)
将我们的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 <script> to <head>
getHeadTag.appendChild(newScriptTag);
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删除所有注释数据的