8

作为 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 管理任务而设计的。

4

3 回答 3

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();
于 2015-01-22T07:20:49.247 回答
3

WSH 是与 nodejs 不同的运行时和库集。对于您的用例,我能想到的唯一简单解决方案是使用 child_process 运行您的 WSH 脚本并捕获输出并解析它。

其他选项是:

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

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

可以想象一个 Node.js 库,它会以这种方式完全代理 ActiveXObject,并赋予 Node.js 与 WSH 相同的所有功能。

于 2012-11-29T10:36:22.467 回答