web-dev-qa-db-ja.com

セレンを使用してJavaScriptファイルをDOMにロードするにはどうすればよいですか?

ExecuteScriptにすべてを入力するのではなく、Selenium WebDriverを使用して、外部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ファイルをローカルホストに配置し、file:///を使用して呼び出し、外部サーバーで試しました。サイコロはありません。

また、Javaの部分では、そのトリックを使用して「scr」+「ipt」を追加しようとしましたが、それでも機能しませんでした。Firefoxのinspect要素を使用してDOMを検査すると、次のことができます。スクリプトノードが正しく読み込まれるので、かなり混乱しています。

私はこの解決策も試しましたが、これは明らかにSeleniumの別のバージョン(webdriverではない)用に作成されたため、最低限機能しませんでした: Seleniumで有用なテスト関数を含む外部jsファイルをロードします

17
Nate L

これによると: http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

ブラウザボットを使用して、テストの現在のウィンドウまたはドキュメントへのハンドルを取得している可能性があります。さいわい、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);");
15
HMR

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-Fileを文字列としてexecuteScript()に渡す場合、injectingToDOM.jsなどのJavaScriptコードの間にコメントを使用しないでください。すべてのコメントを削除しますデータ

6
Yash