2013-06-29 1 views
9

Ich benutze Selenium WebDriver, um zu versuchen, eine externe Javascript-Datei in das DOM einzufügen, anstatt das Ganze in executeScript zu schreiben.Wie lade ich eine JavaScript-Datei mit Selen in das DOM?

Es sieht so aus, als ob es den Knoten richtig in das DOM platziert, aber dann ignoriert es einfach die Quelle, d. H. Die Funktion auf der Quelle js-Datei läuft nicht.

Hier ist mein Code:

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>';"); 
    } 
} 

Der Code der JavaScript-Datei

alert("hi Nate"); 

ich auf meinem localhost die js-Datei platziert haben, ist, ich bin Verknüpfung, rief ich sie Datei : ///, und ich habe es auf einem externen Server versucht. Kein Würfel.

Auch im Java-Teil versuchte ich, 'scr' + 'ipt' mit diesem Trick anzuhängen, aber es funktionierte immer noch nicht. Wenn ich das DOM mit dem inspect-Element von Firefox überprüfe, kann ich sehen, dass es den Skriptknoten richtig lädt, also bin ich ziemlich verwirrt.

Ich habe auch versucht, diese Lösung, die offenbar für eine andere Version von Selen hergestellt wurde (nicht WebDriver) und damit nicht im geringsten funktionierte: Load an external js file containing useful test functions in selenium

Antwort

8

Nach diesem: http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

Möglicherweise verwenden Sie den Browserbot, um ein Handle für das aktuelle Fenster oder Dokument des Tests zu erhalten. Glücklicherweise wertet WebDriver immer JS im Kontext des aktuellen Fensters aus, so dass Sie "window" oder "document" direkt verwenden können.

Alternativ können Sie den Browserbot zum Suchen von Elementen verwenden. In WebDriver ist das Idiom dafür, zuerst das Element zu finden und dann als Argument an das Javascript zu übergeben. Also:

Also funktioniert die folgende Arbeit in Webdriver?

WebDriver driver = new FirefoxDriver(); 
((JavascriptExecutor) driver) 
    .executeScript("var s=window.document.createElement('script');\ 
    s.src='somescript.js';\ 
    window.document.head.appendChild(s);"); 
+1

Ja, das tut es! Ich endete damit, dass ich eine Weile länger damit herumhantierte und ich glaube, dass das Problem nicht bei Selenium oder etwas ähnlichem lag, sondern bei meiner Verwendung von innerHTML, um das DOM anzuhängen, anstatt appendChild, wie in http://stackoverflow.com/questions/1197575/can-scripts-be-insert-with-innerhtml Hoffentlich wird diese Frage jemandem in der Zukunft helfen, weil ich kein funktionierendes Beispiel der Verwendung von Selen fand, um eine externe Javascript-Datei hinzuzufügen –

+0

Netter Code Mann, aber in welchem ​​Pfad sollte das sein? – estemendoza

+2

@estemendoza Ich denke, es ist relativ, aber kann Root relativ sein wie '/ js/somescript.js' oder auf Ihrem lical Computer' file: // home/me/js/somescript.js' – HMR

2

Injizieren unsere JS-Datei in DOM

unsere JS-Datei Injektion in Browser-Anwendung von unserem lokalen Server, so dass wir unsere Funktion Dokument-Objekt zugreifen können.

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(){ .....} 

Hinweis: Wenn Sie JS-Datei als String zu ExecuteScript sind vorbei(), dann verwenden Sie keine Kommentare zwischen den JavaScript-Code, wie injectingToDOM.js alle Kommentare Daten entfernen.

+0

Funktioniert perfekt nach Verwendung wie "document.ourFunction = function() {.....}" in js-Datei – TechDog

Verwandte Themen