Search code examples
cmdcypress

systematic failure when trying to execute a system command with Cypress


I'm new to Cypress and Javascript

I'm trying to send system commands through Cypress. I've been through several examples but even the simplest does not work. it always fails with the following message

Information about the failure:
Code: 127

Stderr:
/c/Program: Files\Git\usr\bin\bash.exe: No such file or directory`

I'm trying cy.exec('pwd') or 'ls' to see where it is launched from but it does not work. Is there a particular include I am missing ? some particular configuration ?

EDIT : indeed, I'm not clear about the context I'm trying to use the command in. However, I don't set any path explicitely.

I send requests on a linux server but I also would like to send system commands.

My cypress project is in /c/Cypress/test_integration/cypress I work with a .feature file located in /c/Cypress/test_integration/cypress/features/System and my scenario calls a function in a file system.js located in /c/Cypress/test_integration/cypress/step_definitions/generic.

System_operations.features:
Scenario: [0004] - Restore HBox configuration
    Given I am logging with "Administrator" account from API
    And I store the actual configuration
...

Then I my .js file, I want to send a system command

system.js:
Given('I store the actual configuration', () => {
    let nb_elem = 0
    
    cy.exec('ls -l')
...
})

I did no particular path configuration in VS Code for the use of bash command (I just configured the terminal in bash instead of powershell)


Solution

  • Finally, with some help, I managed to call system functions by using tasks. In my function I call :

    cy.task('send_system_cmd', 'pwd').then((output) => {
      console.log("output = ", output)
    })
    

    with a task created as follows:

      on('task', {
        send_system_cmd(cmd) {
          console.log("task test command system")
    
        const execSync = require('child_process').execSync;
        const output = execSync(cmd, { encoding: 'utf-8' }); 
        return output
          }
      })
    

    this works at least for simple commands, I haven't tried much further for the moment.

    UPDATE for LINUX system commands as the previous method works for WINDOWS

    (sorry, I can't remember where I found this method, it's not my credit. though it fulfills my needs)

    This case requires node-ssh

    Still using tasks, the function call is done like this

    cy.task('send_system_cmd', {cmd:"<my_command>", endpoint:<address>,user:<ssh_login>, pwd:<ssh_password>}).then((output) => {
        <process output.stdout or output.stderr>
    })
    

    with the task being build like this:

      // send system command - remote
      on('task', {
        send_system_cmd({cmd, endpoint, user, pwd}) {     
          return new Promise((resolve, reject) => {
    
            const { NodeSSH } = require('node-ssh')
    
            const ssh = new NodeSSH()
            let ssh_output = {}
    
            ssh.connect({
              host: endpoint,
              username: user,
              password: pwd
            })
            .then(() => {
              if(!ssh.isConnected())
                reject("ssh connection not set")
    
              //console.log("ssh connection OK, send command")
              ssh.execCommand(cmd).then(function (result) {
                ssh_output["stderr"] = result.stderr
                ssh_output["stdout"] = result.stdout
    
                resolve(ssh_output)
              });
            })
            .catch((err)=>{
              console.log(err)
              reject(err)
            })
          })
        }
      })