如何从WebDriver动态加载'内联'javascript

时间:2012-01-27 11:44:25

标签: jquery webdriver

我正在实现一些针对WebDriver API编码的AXAJ测试。在它上面,我可以执行任意javascript代码,但我需要为我的测试中的任何进一步引用提供一些自定义实用程序函数。 问题是我需要动态加载驻留在客户端类路径中的文件中的“内联”自定义javascript。所以我无法使用依赖于操作script.src的常用方法。我试图操纵script.text但没有成功,我得到一个javascript错误,如:“missing; before statement”。 你觉得我的做法有什么问题吗?还有其他想法怎么做?

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);

修改 其实我的例子不正确。因为在实践中,我从驻留在类路径中的文件加载注入的脚本。那里的脚本用换行符格式化。 所以问题正如错误信息所说:“......缺失;”。这是因为我尝试分配给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 个答案:

答案 0 :(得分:1)

如果你改变了这个:

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

对此:

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

它应该完美地运作......

如果您没有执行单个语句,那么WebDriver需要将脚本包装在花括号中。