【问题标题】:How to resume nightwatch tests after running a terminal command using nodejs exec child process使用nodejs exec子进程运行终端命令后如何恢复夜间测试
【发布时间】:2018-04-20 11:04:16
【问题描述】:

我已经编写了守夜测试,其中一项测试需要执行终端命令。我已经在 nightwatch 的自定义命令部分编写了终端命令。但是当我执行我的测试时,在执行终端命令后,执行停止。

我想要的是当终端命令执行时,控制权应该返回到 nightwatch 并且它应该恢复剩余的测试。有可能吗?

这是我写的代码:

it('Should have Stream URL, Stream Key and Status', function (browser) {
      const sessionsPage = browser.page.sessions()
      const sourcesPanel = sessionsPage.section.sources
      sourcesPanel
        .assert.containsText('@stream_details', 'Stream URL')
        .assert.containsText('@stream_details', 'Stream key')
        .assert.containsText('@stream_details', 'Status')
})
it(' ---- START STREAM ----', function (browser) {
      const sessionsPage = browser.page.sessions()
      sessionsPage.fire_custom_command()
})
it('Some other test', function (browser) {
      // test code
})

上面的代码触发了下面写的自定义命令:

exports.command = function() {
  var spawn = require('child_process').spawn;

  //kick off process of listing files
  var child = spawn('ls', ['-l', '/']);

  //spit stdout to screen
  child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

  //spit stderr to screen
  child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

  child.on('close', function (code) { 
    console.log("Finished with code " + code);
  });
}

执行自定义命令后会发生什么情况,测试只是暂停,并且永远不会继续进行下一个测试。我想要的是在执行完自定义命令并且子进程退出后,上面写的'some other test'应该会被执行。

我也尝试过execSync,但它没有按预期工作。

const ls = 'ls';

    const execSync = require('child_process').execSync;
    var cmd = execSync(ls);

抱歉,如果我没有正确解释我的问题,请提前致谢。

【问题讨论】:

    标签: javascript node.js nightwatch.js


    【解决方案1】:

    我曾使用此方法启动一个控制台应用程序,该应用程序以前从 Exchange 获取电子邮件。我使用spawnSync 来做到这一点。鉴于您上面的 sn-p,我认为您可以通过执行以下操作来使其正常工作:

    function() {        
        const spawnSync = require('child_process').spawnSync;                
    
        const result = spawnSync('ls', ['-l', '/']);   
    
        if(result.output[1]) {
            console.log('stdout: ', result.output[1].toString());
        }
    
        if(result.output[2]) {
            console.log('stderr: ', result.output[2].toString());
        }
    
        if(result.status !== 0) {
            return false;
        }
    
        return true;
    }
    

    来自node docschild_process.spawnSync() 方法通常与child_process.spawn() 相同,只是该函数在子进程完全关闭之前不会返回。

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 2021-10-16
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      相关资源
      最近更新 更多