Giter Club home page Giter Club logo

karma-sauce-launcher's Introduction

karma-sauce-launcher

js-standard-style npm version npm downloads semantic-release

Build Status

Karma Plus Sauce

Run your unit tests on Sauce Labs' browser cloud!

Installation

Install karma-sauce-launcher as a devDependency in your package.json:

npm install karma-sauce-launcher --save-dev

Usage

This launcher is typically used in CI to run your unit tests across many browsers and platforms on Sauce Labs. However, you can also use it locally to debug tests in browsers not available on your machine. It is expected that you are already familiar with Karma when configuring this launcher, so if you are new to Karma, head over to the Karma website.

The Sauce Labs platform configurator can help to find the correct configuration for your desired test platform.

Adding karma-sauce-launcher to an existing Karma config

To configure this launcher, you need to add two properties to your top-level Karma config, sauceLabs and customLaunchers, set the browsers array to use Sauce Labs browsers, and add the sauceLabs reporter.

The sauceLabs object defines global properties for each browser/platform while the customLaunchers object configures individual browsers. The sauceLabs reporter allows your tests results to be properly displayed on https://saucelabs.com. Here is a sample Karma config to get the launcher running:

module.exports = function(config) {
  // Example set of browsers to run on Sauce Labs
  // Check out https://saucelabs.com/platforms for all browser/platform combos
  var customLaunchers = {
    // Old JSONWP way of setting the capabilities
    sl_chrome: {
      base: 'SauceLabs',
      browserName: 'chrome',
      platform: 'Windows 10',
    },
    sl_firefox: {
      base: 'SauceLabs',
      browserName: 'firefox',
      version: 'latest'
    },
    sl_ie_11: {
      base: 'SauceLabs',
      browserName: 'internet explorer',
      platform: 'Windows 8.1',
    },
    // Mobile settings
    // 1. Go to https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/
    // 2. Select Appium iOS,Android
    // 3. Configure your device
    //    Don't forget to provide the `appiumVersion`
    sl_ios_safari: {
      base: 'SauceLabs',
      deviceName: 'iPhone 11 Simulator',
      platformVersion: '13.4',
      platformName: 'iOS',
      browserName: 'Safari',
      appiumVersion: '1.17.1',
      deviceOrientation: 'portrait'
    },
    // !!!!IMPORTANT!!!!
    // If you want to use an Android emulator then you can't use localhost.
    // Because an Android emulator is a VM it will go to it's own localhost
    // and the test will fail. Make change the `hostname` to your
    // local ip
    sl_android: {
      base: 'SauceLabs',
      deviceName: 'Android GoogleAPI Emulator',
      platform: 'Android',
      version: '11.0',
      browserName: 'chrome',
      appiumVersion: '1.18.1',
      deviceOrientation: 'portrait'
    },
    // For W3C way of setting the capabilities check
    // https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/
    // And select WebDriver (W3C) Selenium 3/4, Webdriver.io
    sl_chromeW3C: {
      base: 'SauceLabs',
      browserName: 'chrome',
      browserVersion: 'latest',
      'sauce:options':{
        tags: ['w3c-chrome']
      }
    },
  }

  config.set({

    // The rest of your karma config is here
    // ...
    sauceLabs: {
        testName: 'Web App Unit Tests'
    },
    customLaunchers: customLaunchers,
    browsers: Object.keys(customLaunchers),
    reporters: ['dots', 'saucelabs'],
    singleRun: true
  })
}

Note: this config assumes that process.env.SAUCE_USERNAME and process.env.SAUCE_ACCESS_KEY are set.

Example karma-sauce-launcher configs

For example configs using this launcher (using Travis CI), check out this repo's karma file, or AngularJS' Karma config.

Example results in Sauce Labs

Version 4.2.0 and lower of this module will give you the following result in Sauce Labs, no matter how many tests you execute.

Sauce Logs

As of version 4.3.0 the logs are replaced with the test names and results of the individual tests that have been executed on Sauce Labs, including the execution url in the logs.

Successful run Sauce Successful Logs

Unsuccessful run Sauce Successful Logs

Execution url Sauce Successful Logs

sauceLabs config properties shared across all browsers

username

Type: String Default: process.env.SAUCE_USERNAME

Your Sauce Labs username (if you don't have an account, you can sign up here).

accessKey

Type: String Default: process.env.SAUCE_ACCESS_KEY

Your Sauce Labs access key which you will see on your account page.

region

Type: String

Detect datacenter to run tests in. Can be either eu or us.

headless

Type: Boolean

If set to true tests are being run on Sauce Labs headless platform on us-east-1. This option will be ignored if region is set.

proxy

Type: String

Proxy for connecting to Sauce REST API, which is used to communicate job updates of pass/fail.

startConnect

Type: Boolean Default: true

If true, Sauce Connect will be started automatically. Set this to false if you are launching tests locally but want to start Sauce Connect via a binary manually in the background to improve test speed.

connectOptions

Type: Object Default:

{
  username: 'yourUsername',
  accessKey: 'yourAccessKey',
  tunnelIdentifier: 'autoGeneratedTunnelID'
}

Options to send to Sauce Connect.

Check here for all available options. All parameters have to be applied camel cased instead of with hyphens.

build

Type: String Default: One of the following environment variables: process.env.BUILD_NUMBER process.env.BUILD_TAG process.env.CI_BUILD_NUMBER process.env.CI_BUILD_TAG process.env.TRAVIS_BUILD_NUMBER process.env.CIRCLE_BUILD_NUM process.env.DRONE_BUILD_NUMBER

ID of the build currently running. This should be set by your CI.

testName

Type: String Default: 'Karma test'

Name of the unit test group you are running.

tunnelIdentifier

Type: String

Sauce Connect can proxy multiple sessions, this is an id of a session.

tags

Type: Array of Strings

Tags to use for filtering jobs in your Sauce Labs account.

recordVideo

Type: Boolean Default: false

Set to true if you want to record a video of your Karma session.

recordScreenshots

Type: Boolean Default: true

Set to false if you don't want to record screenshots.

public

Type: String Default: null

Control who can view job details. Available visibility levels are documented on the SauceLabs website.

customData

Type: Object Default: {}

Send arbitrary data alongside your tests. See the SauceLabs documentation for more details.

customLaunchers config properties

The customLaunchers object has browser names as keys and configs as values. Documented below are the different properties which you can configure for each browser/platform combo.

Note: You can learn about the available browser/platform combos on the Sauce Labs platforms page, platforms configurator page and REST API page.

base

Type: String Required: true

This defines the base configuration for the launcher. In this case it should always be SauceLabs so that browsers can use the base Sauce Labs config defined at the root sauceLabs property.

browserName

Type: String Required: true

Name of the browser.

browserVersion

Type: String Default: Latest browser version for all browsers except Chrome

Version of the browser to use.

platformName

Type: String Default: 'Linux' for Firefox/Chrome, 'Windows 7' for IE/Safari

Name of platform to run browser on.

sauce:options

Specific Sauce Labs capability options.

Behind the scenes

This launcher uses Sauce Connect in the background. If you are interested in security or want to see the system requirements, head over to the documentation.

karma-sauce-launcher's People

Contributors

axemclion avatar christian-bromann avatar chriswren avatar devversion avatar dignifiedquire avatar inspector-ambitious avatar jackspirou avatar jdmarshall avatar johanneswuerbach avatar johnjbarton avatar joshmgrant avatar julkue avatar limonte avatar mjeanroy avatar onioni avatar petejohanson avatar pkozlowski-opensource avatar rcebulko avatar rkistner avatar sahat avatar santiycr avatar sebv avatar semantic-release-bot avatar shahata avatar taak77 avatar taymoork2 avatar vikerman avatar vojtajina avatar wswebcreation avatar zzo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

karma-sauce-launcher's Issues

Upgrade to wd 0.1.5

Saucelabs currently fail to start Firefox with the current wd version (0.0.34). I tested locally and it seems you just need to update package.json and no code changes are required.

Concurrency limit

Is there any way of setting the concurrency (parallel) limit when testing with sauce? Because right now I'm unable to
test more than 3 browsers because I'm hitting my parallel cap of my open sauce account.

Have a look at https://github.com/axemclion/grunt-saucelabs which have the concurrency option.

Error status get reported when a browser fails to start initially but works OK on second try

With mobile browsers (mostly IPhone on iOS) I can quite often see the following situation:

(1) Karma tries to start a browser. This initial start fails with:

ERROR [launcher.sauce]: Can not start iphone 7.1 (OS X 10.9)

[get("http://localhost:9876/?id=87195675")] Unexpected data in simpleCallback.

ERROR Job xxx is not in progress. It may have recently finished, or experienced an error. You can learn more at https://saucelabs.com/jobs/xxx

(2) This is fine, Karma tries to start the same browser again:

INFO [launcher]: Trying to start iphone 7.1 (OS X 10.9) on SauceLabs again (1/2).

and this time a mobile browser starts OK and tests are passing just fine.

Now the problem: when I inspect what gets reported to SauceLabs is the same status twice: once as Error and second time as Pass. Funnily enough SauceLabs takes the first (Error) result into account when displaying its badge so we've got IPhone build marked as errored even if it passed just fine.

I'm not super-clear where the actual problem should be fixed: Karma reporting or Sauce badge display but since we've got @ChrisWren wearing 2 hats I figured I will start here. On my side I will dig into the code but if anyone has ideas / input, it would be very much appreciated.

pendingHeartBeat timeout not cleared properly

In ceratin circumstences the timeout here:

pendingHeartBeat = setTimeout(function() {
is not cleared properly and prevents Node.js process from exiting. This is not great since it makes the Gulp+Karma integration story more difficult. Manifestation of the situation can be sometimes in SauceLabs builds with this error:

ERROR [launcher.sauce]: Heartbeat to chrome 35 (Linux) failed

[title()] Not JSON response

ERROR Job xxx is not in progress. It may have recently finished, or experienced an error. You can learn more at https://saucelabs.com/jobs/xxx 

This error is logged since a heartbeat is scheduled even if a given browser finished its run.

Concurrency issue

I'm not sure if this is the actual problem but here's what I have been running into:

I have a free open source account on Sauce Labs running tests in 9 different browsers, but the max parallel tests I can run is 3 at a time. Since karma waits for all browsers to connect before running the tests, it just gets 3 connected browsers and then sits there waiting. And since no tests are run, Sauce Labs doesn't spawn more browsers and sits there waiting too. The whole thing just gets stuck.

Is there anything I can do to get around this? Thanks.

Build never exits

With startConnect: true and singleRun: true the node process is never existing on Mac and Linux (Travis).

This is the last displayed output with verbose.

INFO [launcher.sauce]: Shutting down Sauce Connect
2013-07-05 12:38:27,710 - received SIGTERM
2013-07-05 12:38:27,720 - Shutting down tunnel remote VM (please wait)
2013-07-05 12:38:28,326 - Tunnel remote VM is halting ..
2013-07-05 12:38:34,936 - Finished shutting down tunnel remote VM
2013-07-05 12:38:34,937 - \ Finished /

IE6 freeze

Hi all!

I have been trying to test my javascript with Grunt/Karma/Jasmine on SauceLabs and I get a recurrent error: internet explorer 6 (Windows XP) on SauceLabs have not captured in 120000 ms, killing.

Is this a know issue? is there a "ritgh way to do this?"

All other IE work on my tests, just IE6 doesn't. I Can see on SauceLabs "Karma is running" but nothing more happens.

Getting the timeout error while trying to run tests using sauce connect

Error message :
{ [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' }

sauceLabs : {
testName : 'Karma and Sauce Labs demo',
recordScreenshots : true,
host : 'ondemand.saucelabs.com',
port : '443',
recordVideo : true,
startConnect : true,
connectOptions : {
username : process.env.SAUCE_USERNAME,
accessKey : process.env.SAUCE_ACCESS_KEY,
verbose : false,
logger : console.log,
port : 5757
}
}

I am behind the corporate firewall. Please help me to get away this proxy issue.

Thanks
Dinesh

Support Custom Firefox Profiles in launcher

Firefox has the ability to define support custom profiles. This is
important for allowing users to enable custom or experimental features
for testing. An example of this is webgl support, which partially
works on Sauce Labs.

Using a library called firefox-profile, the sauce labs launcher should
allow users to define custom properties.

Safari/Edge DISCONNECTED after 50 tests

Hi,

I am trying to test my library using karma and saucelabs, but I can't complete my tests in Edge and Safari browsers because they disconnect after 50 tests both.

If I run karma in my local environment (same so, same browsers), it's all ok, so it seems an issue with the launcher.

Thanks,
Edoardo

Sauce Connect can close before tests complete, causing a race condition

The logic that closes Sauce Connect appears to have a race condition where the tunnel can be closed before tests have completed running. For example, at the tutorial found at the following link....

https://docs.saucelabs.com/tutorials/js-unit-testing/

If one were to run the tutorial with a less than optimal connection to Sauce Labs (EG, geolocation far from Northern California). Then the tutorial will fail as the tunnel is closed before the tests actually complete.

You can simulate this process by adding a sleep of 5 to 10 seconds in the test or by using a sub-optimal connection. As a workaround, adding a one minute wait before closing Sauce will resolve the issue. However, what should happen is that Sauce Connect is not shutdown until the tests have completed.

dont close sauce-launcher

In new wersion used next code in lib/sauce_launcher.js
this.on('kill', function(done) {
if (sessionIsReady) {
....
driver.get('about:blank').catch().quit().nodeify(allDone);
sessionIsReady = false;
} else {
pendingCancellations++;
process.nextTick(allDone);
}
});
};

when i run karma with existing Virtual Tunnel and setted startConnect: false - all work excellent
but when i run with creating Virtual Tunel (default) tunnel not closing
and event driver.get('about:blank').catch().quit().nodeify(allDone);
do not fired

// karma.conf.js
var customLaunchers = {
'SL_Chrome': {
base: 'SauceLabs',
browserName: 'chrome'
}
};

.....
sauceLabs: {
testName: 'Karma and Sauce Labs demo'
},
customLaunchers: customLaunchers,
browsers: Object.keys(customLaunchers),
browserNoActivityTimeout: 60000,
captureTimeout: 120000,
singleRun: true,

Saucelabs not getting registered

Having trouble getting this running in my personal project. I've tried the example repo, but it seems to have the same issue. The the errors below are from the sample project. Nothing has been modified in any file.

I've tried with the connection started via binaries and sauceConnect set to false. I've tried unencrypted username and accessKey and encrypted.

Karma version: 0.12.37
Node Version: 0.12.2
OS: Mac OS X 10.10.3

Same thing seems to happen on node v0.10.x, but it adds an error message referencing jasmine not being present.

[AAV:.../github/karma-sauce-example]$ karma start karma.conf-ci.js                                                                                 (master)
WARN [reporter]: Can not load "saucelabs", it is not registered!
  Perhaps you are missing some plugin?
INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/
WARN [launcher]: Can not load "SL_Chrome"!
  Error: No provider for "launcher:SauceLabs". Can not use provider from the parent!
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:84:17
    at Array.forEach (native)
    at createChild (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:82:27)
    at module.(anonymous function) (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/config.js:180:25)
    at Array.invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)
    at get (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:48:43)
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:57:72
    at Array.forEach (native)
    at launch (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:40:11)
    at invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)
WARN [launcher]: Can not load "SL_InternetExplorer"!
  Error: No provider for "launcher:SauceLabs". Can not use provider from the parent!
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:84:17
    at Array.forEach (native)
    at createChild (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:82:27)
    at module.(anonymous function) (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/config.js:180:25)
    at Array.invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)
    at get (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:48:43)
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:57:72
    at Array.forEach (native)
    at launch (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:40:11)
    at invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)
WARN [launcher]: Can not load "SL_FireFox"!
  Error: No provider for "launcher:SauceLabs". Can not use provider from the parent!
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:84:17
    at Array.forEach (native)
    at createChild (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:82:27)
    at module.(anonymous function) (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/config.js:180:25)
    at Array.invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)
    at get (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:48:43)
    at /Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:57:72
    at Array.forEach (native)
    at launch (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/lib/launcher.js:40:11)
    at invoke (/Users/AAV/.nvm/versions/node/v0.12.2/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15)

bump sauce-connect-launcher to >= 0.3.5

sauce-connect-launcher <= 0.3.3 does not work on linux, because of hearbleed emergency changes. 0.3.5 fixes that, but its still possible for ~0.3.0 to fetch 0.3.3 (its happening for me on travis).

So can you please indicate version >= 0.3.5 for sauce-connect-launcher and bump karma-sauce-launcher?

[TypeError: Object #<Object> has no method 'split']

So, this issue that was surfacing in the past is not quite fixed :-/ The improved the situation, but it might happen that the err.data is an object, ex.:

{ status: 13,
    message: 'Job bed4c78028ed4dcca01b8c2b6169559f has already finished, and can\'t receive further commands. It may have experienced an error. You can learn more at https://saucelabs.com/jobs/bed4c78028ed4dcca01b8c2b6169559f',
    value: {
        message: 'Job bed4c78028ed4dcca01b8c2b6169559f has already finished, and can\'t receive further commands. It may have experienced an error. You can learn more at https://saucelabs.com/jobs/bed4c78028ed4dcca01b8c2b6169559f'
    } }

This object doesn't have the split method so the whole thing fails. We need to explicitly test for the presence of the split method or get rid of it altogether (actually, I'm not sure we really want to be so into formatting this error - IMO it is more important to see it than to see it from time to time nicely formatted).

Documentation about sl_* keys in customLaunchers object?

There isn't anything stated in the README.md about the key names in the customLaunchers object. Is there any documentation about it available?

If not: How is it assembled? I see for example there is the name sl_chrome, then a name with OS name like sl_ios_safari and also a name without OS name but with abbreviated name and version number, like sl_ie_11.

Kill workers during run

Sauce is limiting the number of browsers running in parallel.

If I try to use more browser combinations (3) than I'm allowed to run in parallel (2) the test suite is never finishing as 2 workers are running and the 3rd is always queued.

We should kill workers asap after they completed their test run.

launcher fails to start Sauce Connect

Every time I try to run a test using Karma and this launcher agains SL, I get the following message:

INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome (Windows 8.1) on SauceLabs
ERROR [launcher.sauce]: Can not start Chrome (Windows 8.1)
    Failed to start Sauce Connect:
    Could not start Sauce Connect. Exit code 1 signal: null

Finished in 0 secs / 0 secs

My karma.conf.js file looks like:

"use strict";


var label,
    files = require("./misc/files");


module.exports = function (config) {

    config.set({

        /**
         * Autowatch
         */

        autoWatch: true,


        /**
         *
         * Browsers
         *
         * Chrome
         * ChromeCanary
         * PhantomJS
         * Firefox
         * Opera
         * Internet Explorer
         * Safari
         *
         */

        browsers: [
            "PhantomJS"
        ],


        /**
         * Browser Config
         */

        browserDisconnectTimeout: 15 * 1000,
        browserDisconnectTolerance: 2,
        browserNoActivityTimeout: 60 * 1000,


        /**
         * Client
         */

        client: {
            mocha: {
                reporter: "html",
                ui: "bdd"
            }
        },


        /**
         * Custom Browsers
         */

        customLaunchers: {
            "SL_Android_4.0": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "4.0"
            },
            "SL_Android_4.1": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "4.1"
            },
            "SL_Android_4.2": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "4.2"
            },
            "SL_Android_4.3": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "4.3"
            },
            "SL_Android_4.4": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "4.4"
            },
            "SL_Android_5.0": {
                base: "SauceLabs",
                browserName: "Android",
                platform: "Linux",
                version: "5.0"
            },
            "SL_Chrome": {
                base: "SauceLabs",
                browserName: "Chrome",
                platform: "Windows 8.1"
            },
            "SL_Chrome_Linux": {
                base: "SauceLabs",
                browserName: "Chrome",
                platform: "Linux"
            },
            "SL_Chrome_OSX": {
                base: "SauceLabs",
                browserName: "Chrome",
                platform: "OS X 10.10"
            },
            "SL_Firefox": {
                base: "SauceLabs",
                browserName: "Firefox",
                platform: "Windows 8.1"
            },
            "SL_Firefox_Linux": {
                base: "SauceLabs",
                browserName: "Firefox",
                platform: "Linux"
            },
            "SL_Firefox_OSX": {
                base: "SauceLabs",
                browserName: "Firefox",
                platform: "OS X 10.10"
            },
            "SL_IE_9": {
                base: "SauceLabs",
                browserName: "Internet Explorer",
                platform: "Windows 7",
                version: "9"
            },
            "SL_IE_10": {
                base: "SauceLabs",
                browserName: "Internet Explorer",
                platform: "Windows 8",
                version: "10"
            },
            "SL_IE_11": {
                base: "SauceLabs",
                browserName: "Internet Explorer",
                platform: "Windows 8.1",
                version: "11"
            },
            "SL_IOS_6": {
                base: "SauceLabs",
                browserName: "iPhone",
                platform: "OS X 10.8",
                version: "6.1"
            },
            "SL_IOS_7": {
                base: "SauceLabs",
                browserName: "iPhone",
                platform: "OS X 10.9",
                version: "7.1"
            },
            "SL_IOS_8": {
                base: "SauceLabs",
                browserName: "iPhone",
                platform: "OS X 10.10",
                version: "8.1"
            },
            "SL_Opera": {
                base: "SauceLabs",
                browserName: "opera",
                platform: "Windows 7"
            },
            "SL_Opera_Linux": {
                base: "SauceLabs",
                browserName: "opera",
                platform: "Linux"
            },
            "SL_Safari_5": {
                base: "SauceLabs",
                browserName: "Safari",
                platform: "OS X 10.6",
                version: "5"
            },
            "SL_Safari_6": {
                base: "SauceLabs",
                browserName: "Safari",
                platform: "OS X 10.8",
                version: "6"
            },
            "SL_Safari_7": {
                base: "SauceLabs",
                browserName: "Safari",
                platform: "OS X 10.9",
                version: "7"
            },
            "SL_Safari_8": {
                base: "SauceLabs",
                browserName: "Safari",
                platform: "OS X 10.10",
                version: "8"
            }
        },


        /**
         * Files
         */

        files: [].concat(
            files.test.unit.dependencies,
            files.src,
            files.test.unit.src
        ),


        /**
         * Frameworks
         */

        frameworks: [
            "mocha",
            "sinon-chai"
        ],


        /**
         *
         * Logging
         *
         * config.LOG_DISABLE
         * config.LOG_ERROR
         * config.LOG_WARN
         * config.LOG_INFO
         * config.LOG_DEBUG
         *
         */

        logLevel: config.LOG_INFO,


        /**
         * Plugins
         */

        plugins: [
            "karma-chrome-launcher",
            "karma-firefox-launcher",
            "karma-ie-launcher",
            "karma-mocha",
            "karma-mocha-reporter",
            "karma-phantomjs-launcher",
            "karma-safari-launcher",
            "karma-sinon-chai",
            "karma-sauce-launcher"
        ],


        /**
         * Port
         */

        port: 9876,


        /**
         * Preprocessors
         */

        preprocessors: {},


        /**
         * Reporters
         */

        reporters: [
            "mocha"
        ],


        /**
         * SauceLabs
         */

        sauceLabs: {
            testName: "Angular VScroller UNIT",
            startConnect: true
        }
    });

    if (process.env.TRAVIS)
    {
        label = "TRAVIS #" + process.env.TRAVIS_BUILD_NUMBER + " (" + process.env.TRAVIS_BUILD_ID + ")";

        config.captureTimeout = 0;
        config.logLevel = config.LOG_DEBUG;
        config.transports = [
            "websocket"
        ];

        config.sauceLabs.build = label;
        config.sauceLabs.startConnect = false;
        config.sauceLabs.recordScreenshots = true;
        config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER;
    }
};

The SAUCE_USERNAME and SAUCE_ACCESS_KEY are available as env variables so the launcher should be able to start SC using those, but it fails every time and I cannot seem to figure out the cause of it.

Build failures due to use of ~ on dependency in `adm-zip`

Hi -

This project has a dependency on adm-zip, which in turn depends on fidonet-mailer-binkp-crypt.

The problem is, you're using ~ on a < 1 dependency, which opens the door to down stream updates, chaos, and ennui. Since those people downstream of you are using "fidonet-mailer-binkp-crypt": ">0.0.20", you're now going to get every downstream change, like it or not. Sadly, that project published an update recently, which now causing failures on Linux systems (like our CI server). That means I get 60 broken builds, developers are in tears, and an entire new economy based on putting funny captions on cat photos is in jeopardy.

FYI, here's the npm install error:

> [email protected] install /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma-sauce-launcher/node_modules/sauce-connect-launcher/node_modules/adm-zip/node_modules/fidonet-mailer-binkp-crypt
> node-gyp configure build

make: Entering directory `/apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma-sauce-launcher/node_modules/sauce-connect-launcher/node_modules/adm-zip/node_modules/fidonet-mailer-binkp-crypt/build'
  CXX(target) Release/obj.target/crypt/crypt.o
make: g++: Command not found
make: *** [Release/obj.target/crypt/crypt.o] Error 127
make: Leaving directory `/apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma-sauce-launcher/node_modules/sauce-connect-launcher/node_modules/adm-zip/node_modules/fidonet-mailer-binkp-crypt/build'
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/home/qabasel/tools/nodejs/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:797:12)
gyp ERR! System Linux 2.6.32-504.1.3.el6.x86_64
gyp ERR! command "node" "/home/qabasel/tools/nodejs/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "build"
gyp ERR! cwd /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma-sauce-launcher/node_modules/sauce-connect-launcher/node_modules/adm-zip/node_modules/fidonet-mailer-binkp-crypt
gyp ERR! node -v v0.10.26
gyp ERR! node-gyp -v v0.12.2
gyp ERR! not ok 
npm ERR! [email protected] install: `node-gyp configure build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] install script.
npm ERR! This is most likely a problem with the fidonet-mailer-binkp-crypt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp configure build
npm ERR! You can get their info via:
npm ERR!     npm owner ls fidonet-mailer-binkp-crypt
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 2.6.32-504.1.3.el6.x86_64
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! cwd /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST
npm ERR! node -v v0.10.26
npm ERR! npm -v 1.4.3
npm ERR! code ELIFECYCLE
npm ERR! Error: ENOENT, lstat '/apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html'
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 2.6.32-504.1.3.el6.x86_64
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! cwd /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST
npm ERR! node -v v0.10.26
npm ERR! npm -v 1.4.3
npm ERR! path /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html
npm ERR! fstream_path /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/node_modules/coralui-grunt-testrunner/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /home/qabasel/tools/nodejs/lib/node_modules/npm/node_modules/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /apps/jenkins/workspace/xBuild_Coral_coralui3-component-TEST/npm-debug.log
npm ERR! not ok code 0

The dependency trace looks like this:

            "sauce-connect-launcher": {
              "version": "0.6.1",
              "from": "sauce-connect-launcher@>=0.6.0 <0.7.0",
              "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.6.1.tgz",
              "dependencies": {
                "lodash": {
                  "version": "2.4.1",
                  "from": "[email protected]",
                  "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
                },
                "async": {
                  "version": "0.9.0",
                  "from": "async@>=0.9.0 <0.10.0",
                  "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
                },
                "adm-zip": {
                  "version": "0.4.5",
                  "from": "adm-zip@>=0.4.3 <0.5.0",
                  "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.5.tgz",
                  "dependencies": {
                    "fidonet-mailer-binkp-crypt": {
                      "version": "0.0.25",
                      "from": "fidonet-mailer-binkp-crypt@>0.0.20",
                      "resolved": "https://registry.npmjs.org/fidonet-mailer-binkp-crypt/-/fidonet-mailer-binkp-crypt-0.0.25.tgz",
                      "dependencies": {
                        "nan": {
                          "version": "1.6.2",
                          "from": "nan@>0.0.0",
                          "resolved": "https://registry.npmjs.org/nan/-/nan-1.6.2.tgz"
                        }
                      }
                    }
                  }
                },

We're going to try and work around with npm-shrinkwrap, but thought I would share this here since it's likely causing people besides us a bit of a headache.

Issues running against sauce labs

I'm getting the following error "Fatal error: Cannot call method 'apply' of undefined" when running against the following browsers.

Any insight would be greatly appreciated!

{ 'chrome-31-Windows-7':
   { base: 'SauceLabs',
     browserName: 'chrome',
     version: 31,
     platform: 'Windows 7' },
  'chrome-31-Windows-8':
   { base: 'SauceLabs',
     browserName: 'chrome',
     version: 31,
     platform: 'Windows 8' },
  'chrome-31-OS-X-10-9':
   { base: 'SauceLabs',
     browserName: 'chrome',
     version: 31,
     platform: 'OS X 10.9' },
  'chrome-31-Linux':
   { base: 'SauceLabs',
     browserName: 'chrome',
     version: 31,
     platform: 'Linux' } }
DEBUG [launcher.sauce]: Testing tunnel ready
INFO [launcher.sauce]: chrome 31 (Linux) session at https://saucelabs.com/tests/3404cd184b8248e1bcab53cc64e0bacd
DEBUG [launcher.sauce]: WebDriver channel for chrome 31 (Linux) instantiated, opening http://localhost:9876/?id=82169057
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/karma.js
INFO [launcher.sauce]: chrome 31 (Windows 7) session at https://saucelabs.com/tests/6d4a6a0754ac495d8c5a2f8261857458
DEBUG [launcher.sauce]: WebDriver channel for chrome 31 (Windows 7) instantiated, opening http://localhost:9876/?id=25735867
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/client.html
INFO [launcher.sauce]: chrome 31 (OS X 10.9) session at https://saucelabs.com/tests/b48a60164ba94711bd8a9e977e010385
DEBUG [launcher.sauce]: WebDriver channel for chrome 31 (OS X 10.9) instantiated, opening http://localhost:9876/?id=76199352
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/karma.js
INFO [launcher.sauce]: chrome 31 (Windows 8) session at https://saucelabs.com/tests/e9c5640c83934407b631a87ad15647ed
DEBUG [launcher.sauce]: WebDriver channel for chrome 31 (Windows 8) instantiated, opening http://localhost:9876/?id=80241601
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/karma.js
DEBUG [web-server]: serving: /Users/nickradford/code/cx-cui/node_modules/karma/static/karma.js
DEBUG [karma]: A browser has connected on socket IU9UMgowEJjTAJetcIu6
INFO [Chrome 31.0.1650 (Linux)]: Connected on socket IU9UMgowEJjTAJetcIu6
DEBUG [karma]: A browser has connected on socket Ztn0qQRWUVPfRdbVcIu7
INFO [Chrome 31.0.1650 (Windows 7)]: Connected on socket Ztn0qQRWUVPfRdbVcIu7
DEBUG [karma]: A browser has connected on socket k0yoFcoMGhVry5PRcIu8
INFO [Chrome 31.0.1650 (Windows 8)]: Connected on socket k0yoFcoMGhVry5PRcIu8
DEBUG [karma]: A browser has connected on socket 67vFduXVtMJE-xflcIu9
INFO [Chrome 31.0.1650 (Mac OS X 10.9.0)]: Connected on socket 67vFduXVtMJE-xflcIu9
DEBUG [launcher.sauce]: Heartbeat to Sauce Labs (chrome 31 (Linux)) - fetching title
Fatal error: Cannot call method 'apply' of undefined

Sauce Connect fails on Travis unless `startConnect: false` and `tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER` are specified in config

After spending a day trying to use karma sauce launcher with Travis CI, I found the following:

in Karma config sauceLabs.startConnect should be set to false, otherwise the following error is received:

17 07 2015 18:57:26.407:ERROR [launcher.sauce]: Can not start chrome
  Failed to start Sauce Connect:
  17 Jul 18:57:21 - Sauce Connect could not establish a connection.
17 Jul 18:57:21 - Please check your firewall and proxy settings.
17 Jul 18:57:21 - You can also use sc --doctor to launch Sauce Connect in diagnostic mode.
17 Jul 18:57:21 - Cleaning up.

Also, tunnelIdentifier should be set to process.env.TRAVIS_JOB_NUMBER (as per documentation), otherwise browsers never send back the result.

Overall, here are the relevant parts of my karma.config.js file:

module.exports = function(config) {
    var configuration = {

        // ...
        plugins: [
            'karma-jasmine',
            'karma-mocha-reporter',
            'karma-jasmine-jquery',
            'karma-chrome-launcher',
            'karma-firefox-launcher',
            'karma-safari-launcher',
            'karma-sauce-launcher'
        ],

        // ...

        // start these browsers
        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
        browsers: [
            'Chrome',
            'Firefox'
        ],

        customLaunchers: {
            'SL_Chrome': {
                base: 'SauceLabs',
                browserName: 'chrome'
            },
            'SL_InternetExplorer': {
                base: 'SauceLabs',
                browserName: 'internet explorer',
                version: '11'
            },
            'SL_FireFox': {
                base: 'SauceLabs',
                browserName: 'firefox'
            }
        },

        sauceLabs: {
            testName: 'Web App Unit Tests',
            tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
            username: process.env.SAUCE_USERNAME,
            accessKey: process.env.SAUCE_ACCESS_KEY,
            startConnect: false,
            connectOptions: {
                port: 5757,
                logfile: 'sauce_connect.log'
            }
        },

        captureTimeout: 0,

        // Continuous Integration mode
        // if true, Karma captures browsers, runs the tests and exits
        singleRun: false
    };

    if(process.env.TRAVIS){
        configuration.browsers = ['SL_Chrome', 'SL_FireFox'];
    }

    config.set(configuration);
};

If this is by design, then the docs and the example should be updated.

[QUESTION] How can I reduce log verbosity?

Hello,

Is it possible to reduce the log verbosity? We run our tests via Travis and it complains that the log is too big. We have specified LOG_ERROR level in karma config file, but it seems it is not being taken in consideration, because there are a lot of messages like:

Safari 5.1.7 (Windows 7): Executed 87 of 306 SUCCESS (0 secs / 0.031 secs)
 SUCCESS (2.708 secs / 0.975 secs)
Safari 5.1.7 (Windows 7): Executed 88 of 306 SUCCESS (0 secs / 0.032 secs)
 SUCCESS (2.708 secs / 0.975 secs)
Safari 5.1.7 (Windows 7): Executed 89 of 306 SUCCESS (0 secs / 0.032 secs)

Looking in the code here it seems the log level is debug. Is there a way to change this?

Thanks,

iPhone 4.3 cannot be called via Karma-sauce-launcher

When putting the following into karma.conf-ci.js...(using the example to demonstrate)

'TestyBesty': {
base: 'SauceLabs',
browserName: 'iPhone',
version: '4.3',
platform: 'OS X 10.6',
'device-orientation': 'portrait'
}

or the simplier...

'TestyBesty': {
base: 'SauceLabs',
browserName: 'iPhone',
version: '4.3'
}

And running a test on Sauce Labs the test will fail with the following error.

INFO [launcher.sauce]: iPhone 4.3 (OS X 10.6) session at https://saucelabs.com/tests/edf6e39a27d847388238f3f12a5d2362
ERROR [launcher.sauce]: Can not start iPhone 4.3 (OS X 10.6)
[get("http://localhost:9876/?id=21124579")] Error response status: 13, UnknownError - An unknown server-side error occurred while processing the command. Selenium error: Error communicating with the remote browser. It may have died.
Build info: version: '2.28.0', revision: '18364', time: '2013-01-10 00:47:46'
System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.6.8', java.version: '1.6.0_65'
Driver info: driver.version: EventFiringWebDriver

A session is still created on the Sauce labs side, as you can see at https://saucelabs.com/tests/edf6e39a27d847388238f3f12a5d2362, but for some reason the runner is unaware of it.

As tests, I have tried...

  • Not using Sauce Connect for the test.
  • Swapping in the Sauce Connect 4.3.5 binary.

And the tests continued to fail in the same manner.

As additional tests...

  • Using the same desired capabilities in a simple node.js test.
  • Using the same desired capabilities in other languages and runners.

And these passed, which I feel isolates the issue to how karma sauce is handling the communication. What is different about the response from a 4.3 emulator I am not sure though, hence I am opening the case here for assistance.

Having many browsers fails

Hi,

I have 11 browsers that I want to run on saucelabs. When running the browsers in batches of 4-4-3, everything works perfectly. When running all 11 browsers, things are not working.

This is what's happening:

  1. I get the INFO message in my console saying INFO [launcher]: Starting browser ... on SauceLabs 11 times, which is expected.
  2. I see all 11 browsers appear on SauceLabs, queueing to run (I can only run 2 in parallel).
  3. Two of the 11 queued browsers on SauceLabs starts to run, and the session message appears in the console `INFO [launcher.sauce]: safari 7 (Mac 10.9) session at https://saucelabs.com/tests/0b0c09c45f7144a3837dadd7c14888ba
    INFO [launcher.sauce]: firefox 28 (Mac 10.9) session at https://saucelabs.com/tests/6474f7dee7fb4e0cb9a9e7deb3516a5f``
  4. Nothing happens.
  5. Selenium reports error of the two running browsers: "Test did not see a new command for 90 seconds. Timing out."
  6. 3 to 5 repeats for all remaining queued browsers.

Any thoughts?

Thanks

Something in Sauce launcher prevents Karma from exiting cleanly

Check the minimal reproduce scenario in this repo:
https://github.com/pkozlowski-opensource/gulp-karma-sauce

There is something in the sauce launcher / its dependencies that prevents Karma from exiting cleanly when tests finished. Here is the simple run on Travis with verbose logging turned on: https://travis-ci.org/pkozlowski-opensource/gulp-karma-sauce/builds/29215140

The last log is listing outstanding timeout(s):

process._getActiveHandles().forEach(function(timeout){
      if (timeout._idleNext && timeout._idleNext._onTimeout) {
        console.log(timeout._idleNext._onTimeout.toString());
      }
});

but this seems to be part of the node's setInterval routine.... so not sure what is going on here....

Slow shutdown

In several builds on Travis I see the exit after "INFO [launcher.sauce]: Shutting down Sauce Connect" takes 2-3 minutes. I'm not sure whether this is a karma or sauce connect launcher problem.

Do you have any idea? Browsers used are FF 20 (Win 8), IE 10 (Win 8) and Chrome (Linux)

Lack of contributors / Acceptance of Contributors?

@zzo I saw that you pushed the last release. I'm sure that you're busy just like all of us. Your work on this project is phenomenal. Now let's talk about the bad. The documentation is out of sync, there are issues and PR's stacking up and people wanting to help.

Shit, I'd contribute. Again, awesome work; please start accepting PR's and allowing contributors to help.

Mocha tests not running using Safari 8 with Mac OS 10.10

Hi there,
We are having an issue with our mocha tests starting while using Safari 8 as a platform with the karma-sauce-launcher plugin. We have tried all other combinations of Windows 8.1/8/7 and Mac OSx 10.10/10.9 with Chrome 43/42/41, Firefox 36/35/34, and Safari 7 - which do not seem to have this issue. Locally, we have also tested Safari 8 with success - so we are sure that it is not an issue with the actual browser. I have read through posts on stack-exchange which recommend increasing the browser timeout limit, as well as disconnection limits, but these fixes do not seem to work for this specific browser.
Any advice would be very appreciated,
Thanks.

SauceLabs custom-data

Hey guys,
First of all, thank you for these project around karma.
I see that sauceLabs allows us to post "custom-data" informations.
I also see that "custom-data" is used to store result of testing (pass/fail).

Is there a possibility to add custom "custom-data" and retrieve them on SauceLabs dashboard (For my case some Jenkins informations) ?

False Pass Result

The Sauce Reporter grabs the browser.lastResult object and uses the failed and error properties to determine if the final result should be pass or fail. Normally this is ok but in my situation this produces a false positive. I've had strange sessions occur where the tests aren't actually run at all and while there's no error, the success and failed counts are a zero. One thing I did notice is that the disconnect property is also set to true and the total property is accurate. So it seems if you add a check for disconnected to add fail or ensure that the success count equals the total, it would be more accurate.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.