是否可以将WSH(wscript)与nodejs结合

时间:2012-06-29 18:41:13

标签: node.js dom wsh

作为QA,我使用WSH脚本在IE中进行自动上传,部署和一些Web测试。使用JavaScript的WSH(wscript)可以打开IE窗口,激活它并访问DOM模型来执行某些操作或验证一些预期的结果。它是一种Selenium 1.0方法,但不需要JAVA和任何环境配置,因此可以在任何开发人员/ qa windows机器上进行即时执行。

最近我发现了NodeJS及其所有功能,除了使用Windows IE DOM进行操作。找不到如何运行我的旧WSH脚本来测试IE DOM的方法,同时使用一些NodeJS模块来解析XML或运行测试报告服务器。

所以问题:是否可以运行WSH JavaScripts和Node.js并使用来自两个世界的所有好东西? 我担心,事实并非如此,但希望有人有解决方法......

作为解决方法,也许有人在NodeJS中找到了启动IE窗口访问其DOM的方法(...添加自己的js脚本或运行SendKeys到它)!

我知道NodeJS不是为了执行Windows管理任务而设计的。

3 个答案:

答案 0 :(得分:9)

虽然问题不需要结婚,但评论中的@o_nix提出了对https://github.com/idobatter/node-win32ole的建议。

我建议这个模块可以满足从Google到达这里的人们的许多问题(就像我一样)。 它也可以从npm这里获得:https://www.npmjs.com/package/win32ole

该模块也有很多例子,例如: https://github.com/idobatter/node-win32ole/blob/dev0.1.3/examples/activex_filesystemobject_sample.js

  var win32ole = require('win32ole');
  . . . 
  var withReadFile = function(filename, callback){
    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var fullpath = fso.GetAbsolutePathName(filename);
    var file = fso.OpenTextFile(fullpath, 1, false); // open to read
    try{
      callback(file);
    }finally{
      file.Close();
    }
  };
  var withEachLine = function(filename, callback){
    withReadFile(filename, function(file){
//    while(file.AtEndOfStream != true) // It works. (without unary operator !)
//    while(!file.AtEndOfStream) // It does not work.
      while(!file.AtEndOfStream._) // *** It works. oops!
        callback(file.ReadLine());
    });
  };
  withEachLine(testfile, function(line){
    console.log(line);
  });

所以,对我而言,这与将旧的WSH脚本结合起来一样好。当然会涉及调整,但随后它再见了WSH。

更具体地说,对于手头的问题,这是一个演示IE脚本的片段: https://github.com/idobatter/node-win32ole/blob/master/examples/ie_sample.js

  var win32ole = require('win32ole');
  . . . 
  var ie = new ActiveXObject('InternetExplorer.Application');
  ie.Visible = true;
  for(var i = 0; i < uris.length; ++i){
    console.log(uris[i]);
    ie.Navigate(uris[i]);
    win32ole.sleep(15000, true, true);
  }
  ie.Quit();

答案 1 :(得分:2)

WSH是来自nodejs的不同运行时和一组库。我能想到的唯一简单的解决方案是使用child_process来运行WSH脚本并捕获输出并解析它。

其他选项包括:

  • 看看其他浏览器自动化模块 - selenium不是你唯一的选择,也有无头浏览器,可能会安抚这种情况:zombiejs,phantomjs等
  • 将本机绑定写入WSH用于nodejs的API
  • 合并WSH和nodejs的事件循环,并将WSH的API暴露给nodejs:对于这样一个狭窄的用例不是一个好主意。

答案 2 :(得分:0)

触发子进程的好处是WSH能够发出HTTP请求。显然,Node可以提供HTTP服务。

可以想象一个Node.js库可以完全代理ActiveXObject,并为Node.js提供与WSH相同的功能。