2013-06-29 7 views
9

Selenium WebDriver'ı kullanıyorum, tüm olayı executeScript içine yazmak yerine DOM'a harici bir javascript dosyası eklemeyi denemek için kullanıyorum. Düzgün DOM'ye düğümünü yerleştirir gibiSelenyum kullanılarak DOM'a javascript dosyası nasıl yüklenir?

görünüyor, ama sonra sadece kaynağı js dosyası çalışmaz söyledi üzerinde yani fonksiyon, kaynak göz ardı eder. İşte

benim kodudur:

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

Ben bağlama am javascript dosyasının kod benim localhost js dosyasını yerleştirdiğiniz

alert("hi Nate"); 

olduğunu, ben dosyasını kullanarak denir : /// ve bunu harici bir sunucuda denedim. Nafile. Ayrıca

Java bölümünde, Bu numarayı kullanarak 'ut' 'scr' + ekleme çalıştı, ama yine de işe yaramadı. Firefox’un kontrol elemanını kullanarak DOM’ı incelediğimde, betik düğümünü düzgün bir şekilde yüklediğini görebiliyorum, bu yüzden oldukça kafam karıştı. Buna göre Load an external js file containing useful test functions in selenium

cevap

8

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

Ayrıca görünüşe göre az biraz çalışmadı böylece Selenyum (değil webdriver) başka bir versiyonu için yapılmış ve bu çözelti, güvenilir Geçerli penceresine veya sınama belgesine bir tanıtıcı elde etmek için tarayıcı botunu kullanıyor olabilirsiniz. Neyse ki, WebDriver her zaman geçerli pencerenin bağlamında JS'yi değerlendirir, böylece “window” veya “document” ı doğrudan kullanabilirsiniz.

Alternatif olarak, elemanlar bulmak için browserbot kullanıyor olabilir. WebDriver'da, bunu yapmak için deyim ilk olarak öğeyi bulmak, ve sonra bunu Javascript'e bir argüman olarak iletmektir. Böylece:

Yani webdriver aşağıdaki çalışır?

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

Evet öyle! Ben bir süre daha onunla uğraşmak zorunda kaldım ve bu sorunun Selenium ya da bunun gibi bir şeyle değil, benim http://stackoverflow.com'a göre appendChild yerine DOM eklemek için innerHTML kullanmamla ilgili olduğuna inanıyorum./questions/1197575/can-scripts-dahil-with-innerhtml Umarım bu soru gelecekte birilerine yardımcı olacaktır, çünkü bir dış javascript dosyası eklemek için selenyum kullanma konusunda bir çalışma örneği bulamadım çünkü –

+0

Nice code adamım ama bu js hangi yolda olmalı? – estemendoza

+2

@estemendoza Göreceli olduğunu düşünüyorum ama '/ js/somescript.js' veya lical bilgisayarınızdaki '' root: // home/me/js/somescript.js' gibi – HMR

2

biz belge nesnesini kullanarak bizim işlevini erişebileceği şekilde, yerel sunucudan tarayıcılar uygulamasına bizim JS-File enjekte DOM içine

bizim JS-File enjekte ediliyor.

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

Not: Eğer executeScript için as String JS-File geçiyoruz injectingToDOM.js tüm yorumlar verileri kaldırmak gibi() sonra, JavaScript arasındaki kodunda herhangi bir yorum kullanmayın.

+0

Js dosyasında "document.ourFunction = function() {.....}" ifadesini kullandıktan sonra mükemmel çalışır – TechDog