webdriverio-boneyard / gulp-webdriver

gulp-webdriver is a gulp plugin to run selenium tests with the WebdriverIO testrunner
http://webdriver.io
MIT License
76 stars 33 forks source link

Error: spawn .\node_modules\webdriverio\bin\wdio ENOENT #17

Closed mhoyer closed 9 years ago

mhoyer commented 9 years ago

Just tried to use gulp-webdriver following these reproduction steps (in an empty folder):

npm install gulp gulp-webdriver webdriver --save-dev
node_modules\.bin\wdio config

I confirmed all wdio questions with default values:

=========================
WDIO Configuration Helper
=========================

? Where do you want to execute your tests? On my local machine
? Which framework do you want to use? mocha
? Where are your test specs located? ./test/specs/**/*.js
? Which reporter do you want to use? (see http://webdriver.io/guide/testrunner/reporters.html) dot
? Level of logging verbosity: silent
? In which directory should screenshots gets saved if a command fails? ./errorShots/
? What is the base url? http://localhost

Configuration file was created successfully!
To run your tests, execute:

        $ wdio wdio.conf.js

Then I create the gulpfile.js as simple as possible:

var gulp = require('gulp'),
    webdriver = require('gulp-webdriver');

gulp.task('test:e2e', function() {
    return gulp.src('wdio.conf.js').pipe(webdriver());
});

This is what I finally got when trying to run it:

c:\Temp\e2e>gulp test:e2e
[14:45:18] Using gulpfile c:\Temp\e2e\gulpfile.js
[14:45:18] Starting 'test:e2e'...
[14:45:18] spawn wdio with these attributes:
 c:\Temp\e2e\wdio.conf.js
--logLevel=verbose
--waitforTimeout=10000
--reporter=spec
events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: spawn c:\Temp\e2e\node_modules\webdriverio\bin\wdio ENOENT
    at exports._errnoException (util.js:746:11)
    at Process.ChildProcess._handle.onexit (child_process.js:1053:32)
    at child_process.js:1144:20
    at process._tickCallback (node.js:355:11)

Environment: Win7x64, NodeJs v0.12.7

mhoyer commented 9 years ago

I just investigated to find the origin of this issue:

Error: spawn c:\Temp\e2e\node_modules\webdriverio\bin\wdio ENOENT
                                                      ^^^^

Trying to spawn a child process with use of given path to wdio does not work under Windows. The file exists, but cannot be executed.

The path to the executable should also consider non-linux environments. Besides that, isn't there a better approach to generate this path? (see https://github.com/webdriverio/gulp-webdriver/blob/051bd74/index.js#L17) Especially when webdriverio npm package isn't a (non-dev) dependency of gulp-webdriver: see https://github.com/webdriverio/gulp-webdriver/blob/051bd74/package.json

mhoyer commented 9 years ago

Workaround

In your task definition in gulpfile.js defined the wdioBin parameter like so:

var path = require('path'),
    gulp = require('gulp'),
    webdriver = require('gulp-webdriver');

gulp.task('test:e2e', function() {
    return gulp.src('wdio.conf.js').pipe(webdriver({
        wdioBin: path.join('node_modules', '.bin', 'wdio.cmd') // FIX
    }));
});
kmturley commented 8 years ago

I was getting this error on Windows too and wondered why the fix didn't work. I ended up removing the wdio.cmd paths to make:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\..\bin\wdio" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\..\bin\wdio" %*
)