2013-06-29 15 views
9

Używam Selenium WebDriver, aby spróbować wstawić zewnętrzny plik javascript do DOM, zamiast wpisywać całą rzecz w executeScript.Jak załadować plik javascript do DOM przy użyciu selenu?

Wygląda na to, że poprawnie umieszcza węzeł w DOM, ale potem po prostu lekceważy źródło, tj. Funkcja na wspomnianym źródłowym pliku js nie działa.

Oto mój kod:

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

Kod pliku javascript Mam łączącej się to

alert("hi Nate"); 

umieściłem plik js na moim localhost, nazwałem go przy użyciu pliku : ///, i wypróbowałem to na serwerze zewnętrznym. Nie ma kości.

Również w części Java próbowałem dodać "scr" + "ipt" używając tej sztuczki, ale nadal nie działało. Kiedy sprawdzam DOM za pomocą elementu inspekcji Firefox, widzę, że ładuje on węzeł skryptu poprawnie, więc jestem całkiem zdezorientowany.

Próbowałem też to rozwiązanie, które najwyraźniej zostało dokonane dla innej wersji selenu (nie webdriver), a więc nie działa w najmniejszym stopniu: Load an external js file containing useful test functions in selenium

Odpowiedz

8

Zgodnie z tym: http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

Być może korzystasz z przeglądarki, aby uzyskać uchwyt do bieżącego okna lub dokumentu testu z okresu . Na szczęście WebDriver zawsze ocenia JS w kontekście bieżącego okna, dzięki czemu można bezpośrednio używać "okna" lub "dokumentu" o nazwie .

Alternatywnie możesz użyć browserbota do zlokalizowania elementów. W WebDriver, idiomem do tego jest najpierw zlokalizować element, , a następnie przekazać go jako argument do Javascript. Tak więc:

Tak działa następna praca w webdriverze?

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

Tak jest! Skończyło się na tym, że przez jakiś czas robiłem sobie z tym problem i uważam, że problem nie dotyczył Selenium czy czegoś w tym stylu, ale z moim użyciem innerHTML do dołączenia DOM, zamiast appendChild, jak na http://stackoverflow.com/questions/1197575/can-scripts-be-inserted-with-innerhtml Mam nadzieję, że to pytanie pomoże komuś w przyszłości, ponieważ nigdy nie znalazłem działającego przykładu użycia selenu do dodania zewnętrznego pliku javascript. –

+0

Ładny kod , koleś, ale w jakiej ścieżce to powinno być? – estemendoza

+2

@estemendoza Domyślam się, że jest względny, ale może być względny jak np. '/ Js/somescript.js' lub na twoim komputerze' ': // home/me/js/somescript.js' – HMR

2

Wstrzykiwanie naszą JS-Plik do DOM

Wstrzykiwanie naszą JS-pliku do aplikacji przeglądarek z naszym lokalnym serwerze, dzięki czemu możemy uzyskać dostęp do funkcji przy użyciu naszego obiektu dokumentu.

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

Uwaga: Jeśli jesteś przejazdem JS-File As String do executeScript() to nie należy używać żadnych uwag w między kodu JavaScript, np injectingToDOM.js usunąć wszystkie dane komentarzach.

+0

Działa idealnie po użyciu jak "document.ourFunction = function() {.....}" w pliku js – TechDog

Powiązane problemy