2012-01-27 8 views
0

私はWebDriver APIに対してコードするいくつかのAXAJテストを実装しています。その上に、私は任意のjavascriptコードを実行することができますが、いくつかのカスタムユーティリティ関数を、私のテストでさらに参照できるようにする必要があります。 問題は、クライアントクラスパスのファイルにある「インライン」カスタムjavascriptを動的にロードする必要があることです。だから私はscript.srcを操作することに依存する通常の方法を使用することができませんでした。私はscript.textを操作しようとしましたが、成功しなかったので、javascriptのエラーが表示されます: "missing; before statement"。 私のアプローチに間違いがありますか?他のアイデアはどのようにこれを行うには?WebDriverから動的に「インライン」JavaScriptをロードするには

private static final String LOAD_DYNAMIC_JS = 
"(function(){" + 
"var em = document.createElement('script'); em.type = 'text/javascript';" + 
"em.text=\"<![CDATA[" + 
"function testalert(){" + 
"alert(\"test\");" + 
//"}" + 
"]]>\";" + 
"var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(em, s);"+ 
"})();"; 
((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS); 

EDIT 実は私の例が間違っていました。実際には、クラスパスにあるファイルから挿入されたスクリプトをロードしています。そのスクリプトは改行で整形されています。 この問題は、エラーメッセージに「... missing;」と表示されたのとまったく同じです。これは、script.textに代入しようとしているスクリプトが、実際には囲み関数()の文字列リテラルなのでです。 JavaScript文字列リテラルは、 '\'文字で終わらない限り、いくつかの行に伸びることができませんでした。また、デバッグ中は、webdriverがJavaScriptをブラウザに挿入するために、囲み関数()が必要ではないことに気付きました。 CDATAセクションも必要ありません。だから、最終的に働いていた私のインライン注入スクリプトは次のとおりです。

private static final String LOAD_DYNAMIC_JS = 
"var em = document.createElement('script'); em.type = 'text/javascript';" + 
"em.text= 'function testalert(){alert('test');};'"+ 
"var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(em, s);"; 
((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS); 

答えて

1

あなたはこの変更した場合:これに

((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS); 

((JavascriptExecutor)driver).executeScript("{" + LOAD_DYNAMIC_JS + "}"); 

をそれは完璧に動作するはずです...

単一のステートメントを実行していない場合、WebDriverはスクリプトを中括弧で囲む必要があります。

関連する問題