如何使用Selenium将一个JavaScript文件加载到DOM中?

20

我正在使用Selenium WebDriver尝试将外部JavaScript文件插入DOM中,而不是在executeScript中键入整个脚本。

看起来它正确地将

2个回答

15
根据此网页:http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp 您可能正在使用browserbot获取测试中当前窗口或文档的句柄。幸运的是,WebDriver总是在当前窗口的上下文中评估JS,因此您可以直接使用“window”或“document”。
或者,您可能正在使用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);");

1
是的,它可以!我继续花了一些时间来尝试,我相信问题不在于Selenium或其他任何东西,而是我的使用innerHTML来附加DOM,而不是像https://dev59.com/Z3M_5IYBdhLWcg3w2XLw中所述的appendChild。希望这个问题能帮助未来的某个人,因为我从来没有找到一个使用selenium添加外部javascript文件的工作示例。 - Nate L
不错的代码,伙计,但这个js应该放在哪个路径下? - estemendoza
2
@estemendoza 我猜这是相对的,但可以是根相对的,比如 /js/somescript.js 或者在你本地电脑上 file://home/me/js/somescript.js - HMR
好的,JS文件已加载,因为我通过调用document.head.lastChild看到了它,但是我无法调用文件内定义的任何方法,总是显示“bla未定义”。顺便说一下,我正在使用Python。 - estemendoza
确保脚本已加载,依赖于它的其他脚本可以在脚本元素的onload事件上启动,或者使用setTimeout直到脚本加载完成并且脚本中定义的对象可用。 - HMR
做完后,我遇到了一个错误,类似于“无法加载源为'https://path/to/the/JSFile'的<script>”。有什么解决办法吗? - Burak Kaymakci

6

将我们的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文件作为字符串传递给executeScript(),则不要在JavaScript代码中使用任何注释,例如injectingToDOM.js删除所有注释数据。


在 JavaScript 文件中使用类似于 "document.ourFunction = function(){...}" 的方式后,可以完美地运行。 - TechDog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接