spectron
                                
                                 spectron copied to clipboard
                                
                                    spectron copied to clipboard
                            
                            
                            
                        Can I run an unmodified WebDriverIO test with Spectron?
We have built an Electron application without any Spectron api calls or specific debugging port support. We have a JS WebDriverIO test for the previous web version of the app that we hope to run against our Electron build by simply modifying its wd.conf.js profile according to the instructions found here: https://electronjs.org/docs/tutorial/using-selenium-and-webdriver
Is this testing configuration supported with Spectron? The Electron app is launched and we receive the "RESPONSE InitSession ERROR unknown error: DevToolsActivePort file doesn't exist" error and the tests do not progress. We have not been able to overcome the error with any of the recommended arguments that can be passed to the Chrome session.
Do we need to incorporate Spectron into our app or can we just update the wdio config file?
Thanks for any help or insights,
Neal
PS We are current with our "npm installs" and versions of Chrome. Attached is our wdio config file for reference.
Using Spectron for a newly created app, we get the same error message:
      (unknown error: DevToolsActivePort file doesn't exist)
      (The process started from chrome location /root/mystique/node_modules/spectron/lib/launcher.js is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
      (Driver info: chromedriver=2.45 (7154f3777129c2f32d160297120b6e200ec29830),platform=Linux 4.18.0-25-generic x86_64)
      at new RuntimeError (node_modules/webdriverio/build/lib/utils/ErrorHandler.js:143:12)
      at Request._callback (node_modules/webdriverio/build/lib/utils/RequestHandler.js:318:39)
      at Request.self.callback (node_modules/request/request.js:185:22)
      at Request.<anonymous> (node_modules/request/request.js:1161:10)
      at IncomingMessage.<anonymous> (node_modules/request/request.js:1083:12)
It seems related to options passed to the ChromeDriver. We are unable to pass any option (no effect whatsoever). It seems that the following options help:
- --no-sandbox
- --whitelisted-ips=
- --disable-dev-shm-usage
In orther words, with these options, I am able to launch manually the ChromeDriver without any problem. But Spectron don't do it, and I couldn't find a way to tell it to do so...
I couldn't find a way to tell it to do so
Pass chromeDriverArgs in the Application constructor.
However that still doesn't work. Here is the driver log:
[1565172664.714][INFO]: Starting ChromeDriver 2.45 (7154f3777129c2f32d160297120b6e200ec29830)
[1565172664.714][INFO]: Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
[1565172664.718][SEVERE]: bind() failed: Cannot assign requested address (99)
[1565172664.718][INFO]: listen on IPv6 failed with error ERR_ADDRESS_INVALID
[1565172664.779][INFO]: [2a2dd34ea88b2885d087e771830c37a8] COMMAND InitSession {
   "desiredCapabilities": {
      "browserName": "electron",
      "chromeOptions": {
         "args": [ "spectron-path=/opt/my-project/node_modules/electron/dist/electron", "spectron-arg0=/opt/my-project/js/main.js", "--no-sandbox", "--disable-dev-shm-usage", "--whitelisted-ips=" ],
         "binary": "/opt/my-project/node_modules/spectron/lib/launcher.js",
         "windowTypes": [ "app", "webview" ]
      },
      "handlesAlerts": true,
      "javascriptEnabled": true,
      "locationContextEnabled": true,
      "loggingPrefs": {
         "browser": "ALL",
         "driver": "ALL"
      },
      "requestOrigins": {
         "name": "webdriverio",
         "url": "http://webdriver.io",
         "version": "4.14.4"
      },
      "rotatable": true
   }
}
[1565172664.781][INFO]: Populating Preferences file: {
   "alternate_error_pages": {
      "enabled": false
   },
   "autofill": {
      "enabled": false
   },
   "browser": {
      "check_default_browser": false
   },
   "distribution": {
      "import_bookmarks": false,
      "import_history": false,
      "import_search_engine": false,
      "make_chrome_default_for_user": false,
      "skip_first_run_ui": true
   },
   "dns_prefetching": {
      "enabled": false
   },
   "profile": {
      "content_settings": {
         "pattern_pairs": {
            "https://*,*": {
               "media-stream": {
                  "audio": "Default",
                  "video": "Default"
               }
            }
         }
      },
      "default_content_setting_values": {
         "geolocation": 1
      },
      "default_content_settings": {
         "geolocation": 1,
         "mouselock": 1,
         "notifications": 1,
         "popups": 1,
         "ppapi-broker": 1
      },
      "password_manager_enabled": false
   },
   "safebrowsing": {
      "enabled": false
   },
   "search": {
      "suggest_enabled": false
   },
   "translate": {
      "enabled": false
   }
}
[1565172664.781][INFO]: Populating Local State file: {
   "background_mode": {
      "enabled": false
   },
   "ssl": {
      "rev_checking": {
         "enabled": false
      }
   }
}
[1565172344.637][INFO]: Launching chrome: /opt/my-project/node_modules/spectron/lib/launcher.js --disable-background-networking --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-automation --enable-blink-features=ShadowDOMV0 --enable-logging --force-fieldtrials=SiteIsolationExtensions/Control --ignore-certificate-errors --load-extension=/tmp/.org.chromium.Chromium.bUTBao/internal --log-level=0 --metrics-recording-only --no-first-run --no-sandbox --password-store=basic --remote-debugging-port=0 --spectron-arg0=/opt/my-project/js/main.js --spectron-path=/opt/my-project/node_modules/electron/dist/electron --test-type=webdriver --use-mock-keychain --user-data-dir=/tmp/.org.chromium.Chromium.H67so9 --whitelisted-ips data:,
_stream_readable.js:671
    dest.end();
         ^
TypeError: dest.end is not a function
    at Socket.onend (_stream_readable.js:671:10)
    at Object.onceWrapper (events.js:286:20)
    at Socket.emit (events.js:203:15)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
[1565172344.766][INFO]: [e0169295f6ff3bdfa500f3bdbb09e706] RESPONSE InitSession ERROR unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /opt/my-project/node_modules/spectron/lib/launcher.js is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
[1565172344.770][DEBUG]: Log type 'driver' lost 4 entries on destruction
[1565172344.770][DEBUG]: Log type 'browser' lost 0 entries on destruction
That is spectron 7.0.0 running in this docker image
FROM node:10-slim
RUN apt-get update && apt-get install -qy \
    libasound2 \
    libgconf-2-4 \
    libgtk2.0-0 \
    libnss3 \
    libxss1 \
    libxtst6 \
    xvfb \
 && rm -rf /var/lib/apt/lists/*
with these commands
export DISPLAY=:9.0
Xvfb :9 -screen 0 1024x768x24 &
npm ci
npx mocha
As far as I can tell, the IPv6 failure shouldn't affect anything.
I haven't been able to get it to write a chrome_debug.log anywhere to be able to check it. I don't see any core dumps (with ulimit -c unlimited) either.
Pass chromeDriverArgs in the Application constructor.
This is what we were doing already, but I changed a few details (electron path). Not running inside a container, but a classical Ubuntu 16.04. The following code fails. As far as I can tell, app.start is never reached. I don't have a webdriver option failure anymore, just a timeout error.
test('Window Loads Properly', async () => {
  var app = new Application({
    path: path.join(__dirname, '../../node_modules/electron/dist/electron'),
    chromeDriverArgs: [
      '--no-sandbox',
      '--whitelisted-ips=',
      '--disable-dev-shm-usage'
    ],
    args: [path.join(__dirname, '../../src/main.js')]
  })
  await app.start()
//  await app.client.waitUntilWindowLoaded()
  const win = app.browserWindow
  const client = app.client
  expect(await client.getWindowCount()).toBe(1)
  app.stop()
})
Try setting the remote debugging port in your capabilities file:
'--remote-debugging-port=9515'
I think maybe I have the same issue, or I'm getting the same errors at least for some reason, no luck on fixing stuff. I don't think I'm doing anything too weird
The spectron readme says that stuff won't work if you use --remote-debugging-port (changed the error for me but still didn't work) and refers to this issue https://github.com/electron-userland/spectron/issues/19
This is my latest (still not working) code (I've also tried some of the suggestions in this issue).
I have the same issue here. Does anyone find a way to fix this ?
I have the same issue with Spectron version 4-10 (with the matching electron version) on ubuntu 18.04 running with xvfb. And with xvfb on a xenial, 16.04, image in travis
Update
I experienced the issue for only two days. Late yesterday, after a npm install my problem was solved. I was in development, so I hadn't committed my changes in my package-lock.json yet. So I can't say what solved the problem for me. Right now my application works with an empty chromeDriverArgs and with the following xvfb commands:
export DISPLAY=':99.0'
Xvfb :99 -screen 0 1024x600x24 > /dev/null 2>&1 &
If you want to determine if your problems are related to your system or your app. Try my app, hero-display, https://github.com/tue-robotics/hero-display.
I am also experiencing this issue. An I am also new with automation. can you please suggest on what steps to do?
Application launch "before each" hook for "Shows an initial window": Error: Failed to create session. unknown error: Chrome failed to start: was killed. (unknown error: DevToolsActivePort file doesn't exist)
I am using Node.js 12.14.1, Chromium 83.0.4103.122, and Electron 9.1.2.
Same issue. Running on CircleCI's circleci/node:latest-browser Docker image, ships w/ Node v14.6.0 and Chromium 83.0. Absolutely no idea how to resolve this. I've passed all the above flags to Chromium, exported $DISPLAY, started a Xvfb session, even ran a JS webcrawler to find every SE/SO question on this damn error. Of course, nothing works at all and I have probably just lost 2 months off of my lifespan. I'd rather pass kidney stones than to do any more of this
Same issue. Did anyone get a solution?
@zhex900 did you check my earlier comment? https://github.com/electron-userland/spectron/issues/357#issuecomment-645843885
Hi everyone, I can run Spectron tests with Github actions now after working around every solution in this issue. Hope this helps!
- ci.yml
name: CI
on:
  pull_request:
    types: [opened, synchronize, reopened]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js 14.x
        uses: actions/[email protected]
        with:
          node-version: 14.x
      - name: Install yarn
        run: npm install -g yarn
      - name: Install dependencies
        run: yarn install
      - name: Install xvfb
        run: sudo apt-get install xvfb
      - name: Run tests with xvfb
        run: xvfb-run --auto-servernum yarn test
- package.json
{
  "main": "./dist/index.js",
  "scripts": {
    "compile": "tsc",
    "pretest": "yarn compile",
    "test": "jest --detectOpenHandles --forceExit",
  },
  ...
  "devDependencies": {
    ...
    "electron": "12.0.5",
    ...
    "jest": "^27.0.6",
    ...
    "spectron": "14.0.0",
    ...
    "typescript": "^4.0.2"
  },
  ...
}
Set up tests with Spectron:
import { Application } from 'spectron'
import electronPath from 'electron'
import path from 'path'
jest.setTimeout(60000)
let app: Application
beforeAll(() => {
  app = new Application({
    path: electronPath,
    args: ['--no-sandbox', path.join(__dirname, '../')],
    env: {
      NODE_ENV: 'test',
      SPECTRON: true,
      ELECTRON_ENABLE_LOGGING: true,
      ELECTRON_ENABLE_STACK_DUMPING: true,
    },
    port: 9515,
    chromeDriverLogPath: 'chromedriverlog.txt',
    chromeDriverArgs: [`remote-debugging-port=9222`],
  })
})
afterAll(() => {
  if (app && app.isRunning()) {
    return app.stop()
  }
})
test('Login', async () => {...})