2013-06-29 49 views
9

我使用Selenium WebDriver嘗試將外部JavaScript文件插入到DOM中,而不是將整個事件輸入到executeScript中。如何使用硒將JavaScript文件加載到DOM中?

看起來它正確地將節點放入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文件,我把它叫做使用文件:///,我在外部服務器上試過。沒有骰子。

此外,在Java部分,我嘗試使用該技巧追加'scr'+'ipt',但它仍然無效。當我使用Firefox的inspect元素檢查DOM時,我可以看到它正確加載腳本節點,所以我很困惑。

我也試過這個解決方案,這顯然是爲硒(不webdriver的)的另一個版本製成,因此在毫釐不工作:Load an external js file containing useful test functions in selenium

回答

8

根據這個: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);"); 
+1

是的!我最終弄亂了它一段時間,我相信這個問題不是用Selenium或類似的東西,而是用我使用innerHTML來追加DOM,而不是appendChild,按照http://stackoverflow.com/questions/1197575/can-scripts-be-inserted-with-innerhtml 希望這個問題可以幫助未來的人,因爲我從來沒有找到一個使用硒來添加外部javascript文件的工作示例 –

+0

Nice code ,夥計,但這個js應該在哪條路上? – estemendoza

+2

@estemendoza我想它是相對的,但可以像'/ js/somescript.js'或在你的計算機上的文件:file:// home/me/js/somescript.js – HMR

2

注入我們的JS-文件到DOM

從本地服務器注入我們的JS-文件到瀏覽器的應用程序,這樣我們就可以使用文檔對象訪問我們的函數。

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-文件作爲字符串executeScript()則不要在JavaScript之間的代碼中使用任何意見,像injectingToDOM.js刪除所有評論數據。

+0

在js文件中使用像「document.ourFunction = function(){.....}」後完美的作品 – TechDog

相關問題