Code Monkey home page Code Monkey logo

protractor-perf's People

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

Watchers

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

protractor-perf's Issues

Jasmine times out when running protractor-perf test as part of a bigger suite of specs

I'm working on a suite of protractor specs where the majority test spec are 'regular' (non-perf). Only one spec uses protractor-perf. Nevertheless I use the protractor-perf runner for the entire suite because I don't want to switch between two different runners and I don't want to maintain two separate jasmine/protractor config files.

The Performance spec runs successfully on its own and runs successfully when it's the first spec that runs. However, when it's the last spec it fails with the following error:
Message: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. Stack: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. at [object Object]._onTimeout (c:\kindl\test\node_modules\protractor-perf\node_modules\protractor\node_modules\jasmine\node_modules\jasmine-core\lib\jasmine-core\jasmine.js:1812:23)

The browser just sits and hangs. At the moment I'm working around the issue by simple putting the Perf spec as the first spec in the suite. But I would like to have a proper solution.

Thanks for your help,
Stoil

multiple protractor-perf operations in one protractor test case.

The protractor test case is like this:

describe("TEST", function() {
    it("test1", function() {
        var perfRunner = new PerfRunner(protractor, browser);
        perfRunner.start();
        // test, like click....
        perfRunner.stop();
        if (perfRunner.isEnabled) {
            perfRunner.getStats().then(function(data) {
                        /////
            });
        }
    });

    it("test2", function() {
        var perfRunner = new PerfRunner(protractor, browser);
        perfRunner.start();
        // test, like click....
        perfRunner.stop();
        if (perfRunner.isEnabled) {
            perfRunner.getStats().then(function(data) {
                        /////
            });
        }
    });
// .....
});

The problem is that: the result is a little weird. The metrics, like readystart of each test ('test1', 'test2'...) are the same (test1.readystart == test2.readystart, test1.navigationstart == test2.navigationstart).
I don't know if I misunderstand the usage of protractor-perf/ browser-perf here...
Could you please help me with it? :)
Thanks.

Process Out of memory while running Protractor Perf

Hi
I am using protractor-perf to measure performance for my angular application
i am using perfRunner.start(); and perfRunner.stop(); two places
when its called first time , working good but at second second time , i am getting error as-

<--- Last few GCs --->

77396 ms: Scavenge 1183.3 (1223.3) -> 1183.3 (1223.3) MB, 0.1 / 0 ms (+ 2.0 m
s in 1 steps since last GC) [allocation failure] [incremental marking delaying m
ark-sweep].
77739 ms: Mark-sweep 1183.3 (1223.3) -> 928.7 (969.4) MB, 342.7 / 0 ms (+ 2.0
ms in 2 steps since start of marking, biggest step 2.0 ms) [last resort gc].
78064 ms: Mark-sweep 928.7 (969.4) -> 928.7 (969.4) MB, 325.2 / 0 ms [last re
sort gc].

<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 000000BE60A373A9
2: /* anonymous /(aka / anonymous */) [D:\Automation\ProtractDemo\node_mod
ules\protractor-perf\node_modules\browser-perf\node_modules\wd\lib\utils.js:~102
] [pc=000003E4A4F230BF](this=000000BE60A04131 ,i=49901230)
3: times [D:\Automation\ProtractDemo\node_modules\protractor-perf\node_modul
es\browser-perf\node_modules\wd\node_modules\lodash\index.js:~11490] [pc=000003E
4A50...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

Code Snippet for second call--

perfRunner.start();
element(by.id('quote_owner:first_name')).sendKeys('Test');
browser.driver.findElement(By.xpath('//*[@id="quote_owner:postal_code"]')).sendKeys('1000');
element(by.id('quote_owner:birth_date')).click();

Is this library dead?

There hasn't been an update for past 7 months, and it does not work with newer versions of Chrome. A bunch of new issues haven't seen a response from the author. Are there any volunteers willing to step up?

Does Protractor-perf give any Special metrics additional to the normal ones when testing Angular Pages ?

I have a doubt regarding the metrics provided by protractor-perf. Normally, when I try to load the URL I am getting the following set of metrics:


{ numAnimationFrames: 34,
numFramesSentToScreen: 34,
droppedFrameCount: 0,
meanFrameTime: 15.745085717312028,
framesPerSec_raf: 63.5118803386685,
unloadEventEnd: 0,
responseEnd: 1433186737166,
responseStart: 1433186737165,
domInteractive: 1433186737274,
domainLookupEnd: 1433186737131,
unloadEventStart: 0,
domComplete: 1433186737393,
domContentLoadedEventStart: 1433186737274,
domainLookupStart: 1433186737131,
redirectEnd: 0,
redirectStart: 0,
connectEnd: 1433186737157,
connectStart: 1433186737131,
loadEventStart: 1433186737393,
navigationStart: 1433186736854,
requestStart: 1433186737157,
secureConnectionStart: 1433186737132,
fetchStart: 1433186737089,
domContentLoadedEventEnd: 1433186737274,
domLoading: 1433186737167,
loadEventEnd: 1433186737406,
firstPaint: 229.165077209473,
Layers: 1,
PaintedArea_total: 234087,
PaintedArea_avg: 234087,
NodePerLayout_avg: 0,
ExpensivePaints: 0,
ExpensiveEventHandlers: 0,
GPUTask: 6.627,
GPUTask_avg: 1.3254,
GPUTask_max: 6.124,
GPUTask_count: 5,
Program: 16.931,
Program_avg: 0.12358394160583942,
Program_max: 2.915,
Program_count: 137,
FireAnimationFrame: 2.203,
FireAnimationFrame_avg: 0.09179166666666666,
FireAnimationFrame_max: 0.432,
FireAnimationFrame_count: 24,
FunctionCall: 7.570000000000001,
FunctionCall_avg: 0.2703571428571429,
FunctionCall_max: 2.515,
FunctionCall_count: 28,
RequestAnimationFrame: 24,
UpdateCounters: 28,
UpdateLayerTree: 23,
CompositeLayers: 0.9110000000000003,
CompositeLayers_avg: 0.039608695652173925,
CompositeLayers_max: 0.149,
CompositeLayers_count: 23,
Paint: 0.199,
Paint_avg: 0.199,
Paint_max: 0.199,
Paint_count: 1,
PaintImage: 0.020999999999999998,
PaintImage_avg: 0.006999999999999999,
PaintImage_max: 0.015,
PaintImage_count: 3,
'Draw LazyPixelRef': 1,
UpdateLayer: 0.286,
UpdateLayer_avg: 0.286,
UpdateLayer_max: 0.286,
UpdateLayer_count: 1,
AnalyzeTask: 0.038,
AnalyzeTask_avg: 0.038,
AnalyzeTask_max: 0.038,
AnalyzeTask_count: 1,
RasterTask: 0.213,
RasterTask_avg: 0.213,
RasterTask_max: 0.213,
RasterTask_count: 1 }


For the next page(which is an angular page) I would like to automate some operations on that. Will I be able to get any different additional metrics as the testing has been done on Angular page ?? or else is it going to be just the same set of metrics data as the above one.

Does protractor-perf has such a feature where some additional metrics gets added when testing angular pages ??

Thanks in Advance.

not working with multiCapabilities in config file

I have the following in my config file:

   multiCapabilities: [
        // firefox - downgrade to firefox 45.0.1 if you need to make it work locally
        // {
        //     browserName: 'firefox',
        //     shardTestFiles: true,
        //     maxInstances: 10
        // },
        //max-desktop-chrome - default screen size
        {
            browserName: 'chrome',
            shardTestFiles: true,
            maxInstances: 10,
            chromeOptions: {
                args: ['--lang=en',
                    '--window-size=1024,3000', '--disable-extensions']
            }
        }
]

This gives me the following error:

node_modules/browser-perf/lib/options.js:84
            if (typeof browserConfig[passedBrowser.browserName] !== 'undefined') {
                                                  ^

TypeError: Cannot read property 'browserName' of undefined

This only gets resolved if i replace multiCapabilities with capabilities.

Any idea? Is there no support to test against multi browsers?

Does protractor-perf have node API?

I found that browser-perf has provided node API which looks like:

browserPerf(x,y)

However, I did not find protractor-perf has that kind of callable function, i.e. the test tasks must be driven from command line.

Plz let me know if there is a way to get or simply implement protractor-perf node API.

Great thanks!!!!!!

error while running with IE driver

the package is working as expected when capabilities.browserName:chrome or firefox but it's giving error when its internet explorer.
Please have a look at the stack trace.
Can you give me some pointers what i'm doing wrong?

Error: [execute("(function(){var getTimeMs=(function(){if(window.performance)\nreturn(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow).bind(window.performance);else\nreturn function(){return new Date().getTime();};})();var requestAnimationFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};})().bind(window);window.__RafRecorder={frames:[],flush:true,record:function(timeStamp){if(__RafRecorder.flush){__RafRecorder.frames=[];__RafRecorder.flush=false;}\n__RafRecorder.frames.push(timeStamp);requestAnimationFrame(__RafRecorder.record);},get:function(){__RafRecorder.flush=true;return __RafRecorder.frames;}};requestAnimationFrame(window.__RafRecorder.record);}());")] Error response status: 13, , UnknownError - An unknown server-side error occurred while processing the command. Selenium error: JavaScript error (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 95 milliseconds
Build info: version: '2.43.1', revision: '5163bce', time: '2014-09-10 16:27:33'
System info: host: 'MIAPG1405200057', ip: '10.212.68.84', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_25'
Session ID: f4697214-f15d-4b66-b54a-1a97a709ab12
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Capabilities [{platform=WINDOWS, javascriptEnabled=true, elementScrollBehavior=0, ignoreZoomSetting=false, enablePersistentHover=true, ie.ensureCleanSession=false, browserName=internet explorer, enableElementCacheCleanup=true, unexpectedAlertBehaviour=dismiss, version=9, ie.usePerProcessProxy=false, cssSelectorsEnabled=true, ignoreProtectedModeSettings=false, requireWindowFocus=false, handlesAlerts=true, initialBrowserUrl=http://localhost:27622/, ie.forceCreateProcessApi=false, nativeEvents=true, browserAttachTimeout=0, ie.browserCommandLineSwitches=, takesScreenshot=true}]
Stacktrace:
Error: [execute("(function(){var getTimeMs=(function(){if(window.performance)\nreturn(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow).bind(window.performance);else\nreturn function(){return new Date().getTime();};})();var requestAnimationFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};})().bind(window);window.__RafRecorder={frames:[],flush:true,record:function(timeStamp){if(__RafRecorder.flush){__RafRecorder.frames=[];__RafRecorder.flush=false;}\n__RafRecorder.frames.push(timeStamp);requestAnimationFrame(__RafRecorder.record);},get:function(){__RafRecorder.flush=true;return __RafRecorder.frames;}};requestAnimationFrame(window.RafRecorder.record);}());")] Error response status: 13, , UnknownError - An unknown server-side error occurred while processing the command. Selenium error: JavaScript error (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 95 milliseconds
Build info: version: '2.43.1', revision: '5163bce', time: '2014-09-10 16:27:33'
System info: host: 'MIAPG1405200057', ip: '10.212.68.84', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_25'
Session ID: f4697214-f15d-4b66-b54a-1a97a709ab12
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Capabilities [{platform=WINDOWS, javascriptEnabled=true, elementScrollBehavior=0, ignoreZoomSetting=false, enablePersistentHover=true, ie.ensureCleanSession=false, browserName=internet explorer, enableElementCacheCleanup=true, unexpectedAlertBehaviour=dismiss, version=9, ie.usePerProcessProxy=false, cssSelectorsEnabled=true, ignoreProtectedModeSettings=false, requireWindowFocus=false, handlesAlerts=true, initialBrowserUrl=http://localhost:27622/, ie.forceCreateProcessApi=false, nativeEvents=true, browserAttachTimeout=0, ie.browserCommandLineSwitches=, takesScreenshot=true}]
at exports.newError (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\lib\utils.js:139:13)
at C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\lib\callbacks.js:75:19
at C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\lib\webdriver.js:174:5
at Request.callback (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\lib\http-utils.js:85:7)
at Request.self.callback (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\node_modules\request\request.js:364:22)
at Request.EventEmitter.emit (events.js:98:17)
at Request. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\node_modules\request\request.js:1318:14)
at Request.EventEmitter.emit (events.js:117:20)
at IncomingMessage. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\browser-perf\node_modules\wd\node_modules\request\request.js:1266:12)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
==== async task ====
at [object Object].start (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\lib\index.js:50:54)
at [object Object]. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\performance.js:18:14)
at C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\jasminewd\index.js:94:14
at [object Object].webdriver.promise.ControlFlow.runInNewFrame
(C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1654:20)
at [object Object].webdriver.promise.ControlFlow.runEventLoop
(C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1518:8)
==== async task ====
Asynchronous test function: it()
at [object Object]. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\jasminewd\index.js:93:33)
at [object Object]. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\async-callback.js:45:37)
at [object Object].jasmine.Block.execute (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:1174:17)
at [object Object].jasmine.Queue.next
(C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2209:31)
at [object Object].onTimeout (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2199:18)
Error
at [object Object]. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\performance.js:10:5)
at [object Object].jasmine.Env.describe
(C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:913:21)
at [object Object].jasmine.Env.describe (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:898:15)
at describe (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\node_modules\protractor-perf\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:658:27)
at Object. (C:\Users\majgotra\sambuca-ta\sambuca-qa\tools\SCT_Automation\performance.js:8:1)

Finished in 2.006 seconds
1 test, 1 assertion, 1 failure

Process finished with exit code 1

Undefined retruned when I try and console log the stats from protractor-perf

I have a simple test that uses protractor-perf:

pr.start();
browser.get('https://www.google.com');
pr.stop();

if (pr.isEnabled) {
  pr.getStats('mean-frame-time').then(function(stats){console.log(stats)});
};

the console shows undefined for the stats -- I have tried meanFrameTime and mean_frame_time. All of them shows undefined.

env: node\r: No such file or directory

After installing, attempting to run the example spec/conf throws env: node\r: No such file or directory. Seems I'm doing something wrong. Can you document how to run the example spec?

Unsupported OS/browser/version/device combo: OS: 'Windows 2003', Browser: 'googlechrome', Version: '54.', Device: 'unspecified'

Hi Parshuram,

I am trying to execute one of my script in saucelabs in windows 7 platform and 54th version of chome. But observing below mentioned error. If I dont specify version and platform details , its trying to execute the script in windows XP and 49 version of chrome. Saucelabs team asked me to reach out to you as they are not sure, how this plugin/library is implemented. It would be much appreciated, if you can help us.

This is working as expected locally. Even in sauce labs but not with platform and version details.
Tried with different platforms and versions as well and observing same error.

capabilities: {
'browserName': 'chrome',
'parent-tunnel': "chi_master",
'platform': 'Windows 7',
'version':'54'
},

Error Details -

[16:26:28] I/sauce - Using SauceLabs selenium server at http://ondemand.saucelabs.com:80/wd/hub
[16:26:28] I/launcher - Running 1 instances of WebDriver
[16:26:28] E/launcher - Unsupported OS/browser/version/device combo: OS: 'Windows 2003', Browser: 'googlechrome', Version: '54.', Device: 'unspecified'
[16:26:28] E/launcher - UnsupportedOperationError: Unsupported OS/browser/version/device combo: OS: 'Windows 2003', Browser: 'googlechrome', Version: '54.', Device: 'unspecified'
at WebDriverError (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:27:10)
at UnsupportedOperationError (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:448:10)
at parseHttpResponse (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\http\index.js:552:11)
at C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\http\index.js:472:11
at ManagedPromise.invokeCallback_ (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
at TaskQueue.execute_ (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
at TaskQueue.executeNext_ (C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
at C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2820:25
at C:\Users\pkashipa\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:639:7
at process._tickCallback (node.js:369:9)
[16:26:28] E/launcher - Process exited with error code 199

image

dump protractor to 3.1.1

Hi,

Please dump protractor to 3.1.1 in package.json, protractor's webdriver already updated to
"selenium": "2.51.0",
"chromedriver": "2.21"

Best Regards,
Joseph

ConfigParser is not a constructor

I just installed this library today and ran into a problem with Protractor 4.0.9. When I tried to run protractor-perf it was throwing the error

C:\**\npm\node_modules\protractor-perf\lib\cli.js:146
 var configParser = new ConfigParser();
               ^

 TypeError: ConfigParser is not a constructor 

I changed line 145 in cli.js from var ConfigParser = require('protractor/built/configParser').default; to var ConfigParser = require('protractor/built/configParser').ConfigParser;

It started running for me after I made this change. Should I have to do this to get it to work? Am I missing something else? Or is it just a breaking change with ptor 4+?

Do I have a way to save my metrics obtained from protractor-perf in MySQL database or any other database?

I am planning to save my metrics obtained from protractor-perf into a database and build a dashboard which would give a good GUI for the users / developers regarding the performance of the web pages.

But, I am not sure whether there is a way for protractor-perf to do this ?? I have done my research and found out regarding " Perfjankie " . But I am curious whether it can be used with protractor-perf ?

As I could see Perfjankie as a monitoring tool which runs based on Browser-perf. So I am guessing there should be a way for protractor-perf to use this tool directly as protractor-perf is based on Browser-perf. Please let me know any info regarding this.

Thank you.

performance - Java heap space

Hi, when we try to run the performance tests:

../node_modules\wd\lib\utils.js:139
  var err = new Error();

Error: [log("performance")] Error response status: 13, , UnknownError - An unknown server-side error occurred while processing the command. Selenium error: Java heap space.

Webdriver-manager reports:

16:25:30.251 INFO - Executing: [fetching logs for: performance])
16:25:35.648 WARN - Exception thrown
      java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space

env: node\r: No such file or directory

I am seeing the below issue with the latest version. Could you please check this one ?

protractor-perf test/conf.js
env: node\r: No such file or directory

I have downgraded the version to 0.1.8 but i am seeing the below issue.

Error: No selenium server jar found at the specified location (/usr/local/lib/node_modules/protractor-perf/node_modules/protractor/selenium/selenium-server-standalone-2.45.0.jar). Check that the version number is up to date.

protractor-perf command not found when installed locally

I have an existing set of protractor tests and was trying to configure this tool but when i run it i see "protractor-perf command not found" error. I see protractor-perf installed in my local node-modules directory, but i don't see a .bin directory immediately as a child of the protractor-perf directory.

How to stop protractor-perf running on a selenium grid to fire up a standalone selenium server

So, when i try and run perf on a selenium grid that is generated via a docker grid, this is what i get:

  ✗ Starting to record metrics... (0.317 sec)
[chrome #01-1]         - Failed: [logTypes()] Error response status: 13, , UnknownError - An unknown server-side error occurred while processing the command. Selenium error: Build info: version: '2.52.0', revision: '4c2593c', time: '2016-02-11 19:06:42'
[chrome #01-1] System info: host: 'MAC1837.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.10.4', java.version: '1.7.0_79'
[chrome #01-1] Driver info: driver.version: unknown
[chrome #01-1]         System info: host: 'MAC1837.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.10.4', java.version: '1.7.0_79'
[chrome #01-1]         Driver info: driver.version: unknown

this happens when i have this in my ptor config file:
seleniumAddress: 'http://localhost:4444/wd/hub - this is the grid hoisted via docker

changing the above to:

selenium: 'http://mygirdaddress:4444/wd/hub', seleniumPort: 4444,
forces it to fire up a local instance of the browser and starts the selenium-standalone server.
Is there anyway to capture the same metrics on the headless browsers that are running on the grid?

unknown error : status 13,

HI Parshuram,
I am getting an error :
Stack:
Error: [logTypes()] Error response status: 13, , UnknownError - An unknown s
rver-side error occurred while processing the command. Selenium error: Command
ot found: GET /session/794a23f4-0d72-451b-af0e-3dba829e2f4c/log/types
Command duration or timeout: 2 milliseconds
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'IBM903-PB61XBM', ip: '9.79.148.87', os.name: 'Windows 7'
My

jasmineNodeOpts: {

defaultTimeoutInterval: 10000000,
}

is set pretty high . still facing the problems Could you please check this?

Crash with ECONNREFUSED on perfRunner.start()

I have a rather annoying issue with protractor-perf, which I couldn't get to the ground.

Starting the test with a manual started selenium server works smoothly. But letting protractor start selenium via Jar or using directconnect crashes with:

Error: [execute("(function(){var getTimeMs=(function(){if(window.performance)\nreturn(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow).bind(window.performance);else\nreturn function(){return new Date().getTime();};})();var requestAnimationFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};})().bind(window);window.__RafRecorder={frames:[],flush:true,record:function(timeStamp){if(__RafRecorder.flush){__RafRecorder.frames=[];__RafRecorder.flush=false;}\n__RafRecorder.frames.push(timeStamp);requestAnimationFrame(__RafRecorder.record);},get:function(){__RafRecorder.flush=true;return __RafRecorder.frames;}};requestAnimationFrame(window.__RafRecorder.record);}());")] connect ECONNREFUSED

I tried it with Chromium binary as well as with Chrome Canary.

I didn't found any difference between the automatic start and the manual selenium start, where I grabbed the exec call from an automatic start, so they are identical. Also the running user etc seems all identical.

I also traced the chromedriver verbose output in both cases and the only difference is, that in the manual start case, the driver gets an executeScript call:

[6.725][INFO]: Done waiting for pending navigations
[6.725][INFO]: RESPONSE ExecuteScript null
[7.044][INFO]: COMMAND ExecuteScript {
   "args": [  ],
   "script": "(function(){var getTimeMs=(function(){if(window.performance)\nreturn(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow).bind(window.performance);else\nre..."
}
[7.055][DEBUG]: DEVTOOLS EVENT Timeline.eventRecorded {

while by using directconnect it gets a quit call at that step:

[5.504][INFO]: Done waiting for pending navigations
[5.504][INFO]: RESPONSE ExecuteScript null
[5.619][INFO]: COMMAND Quit {

}
[5.721][INFO]: RESPONSE Quit

In order to make sure, that neither my application nor the testscript causes the issue, I isolated my testcase and used only the angular.js example.

package.json (using 1.4.0 as protractor_perf is fixing it to 1.4.0 and is failing to find the driver when versions differ)

{
  "name": "properf_test",
  "version": "0.0.0",
  "description": "A test for protractor_perf",
  "devDependencies": {
    "protractor": "~1.4.0",
    "protractor-perf": "*"
  },
  "scripts": {
    "preperftest": "npm run update-webdriver",
    "perftest": "protractor-perf protractor-perf.conf.js",
    "preupdate-webdriver": "npm install",
    "update-webdriver": "webdriver-manager update",
    "start-webdriver": "webdriver-manager start"
  }
}

protractor-perf.conf.js (used underscores to "comment out" running variants")

exports.config = {
    _seleniumAddress: 'http://localhost:4445/wd/hub',
    _seleniumPort: 4445,
    _directConnect: true,

    specs: [
        'tests/perf/*.spec.js'
    ],

    capabilities: {
        browserName: 'chrome',
        _chromeOptions: {
              binary: '/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary',
        }
    },
};

/tests/perf/example.spec.js

var PerfRunner = require('protractor-perf');
describe('angularjs homepage todo list', function() {
    var perfRunner = new PerfRunner(protractor);

    it('should add a todo', function() {
        browser.get('http://www.angularjs.org');

        perfRunner.start();

        element(by.model('todoText')).sendKeys('write a protractor test');
        element(by.css('[value="add"]')).click();

        perfRunner.stop();

        if (perfRunner.isEnabled) {
                    perfRunner.getStats('mean_frame_time').then(function(stats){console.log(stats)});
            //expect(perfRunner.getStats('meanFrameTime')).toBeLessThan(60);
        };

        var todoList = element.all(by.repeater('todo in todos'));
        expect(todoList.count()).toEqual(3);
        expect(todoList.get(2).getText()).toEqual('write a protractor test');

    });
});

Starting the test with: npm run perftest

Any way I can help with digging into the issue, please let me know.

Very keen to find the reason for this, as tests should run fully automatic without manual starting and stopping selenium server.

Btw. firefox doesn't work at all. It hangs and test times out.

How do you restart or clear the stat collection?

I am trying to use your package for simple performance tests with Protractor. The issue I have is I have one spec with 3 tests that navigates to 3 different pages, I am calling perfRunner.start() and .stop() in each of these it blocks. However, every time I call for getStats('loadTime'), it returns the same value for each page which is impossible. How do I reset the perfRunner so I get a new loadTime every time?

Consider the following script:

it('logs in', function () {
    perfRunner.start();

    element(by.model('username')).sendKeys(browser.params.login.username);
    element(by.model('password')).sendKeys(browser.params.login.password);
    element(by.css('button[type="submit"]')).click().then(function () {
        Util.waitForUrlChange(/portfolio/).then(function () {
            perfRunner.stop();

            if (perfRunner.isEnabled) {

                perfRunner.getStats('Javascript').then(function (val) {
                    console.log('Javascript: ' + val);
                });

                perfRunner.getStats('loadTime').then(function (val) {
                    console.log('loadTime: ' + val);
                });

                expect(perfRunner.getStats('loadTime')).toBeLessThan(3000);
                expect(perfRunner.getStats('Javascript')).toBeLessThan(1000);
            });
        };
    });
});

it('goes to overview page', function () {
    perfRunner.start();

    var link = $('a[translate="HEADER.NAV_OVERVIEW"]');
    link.click().then(function () {
        Util.waitForUrlChange(/overview/).then(function () {
            perfRunner.stop();
            if (perfRunner.isEnabled) {

                perfRunner.getStats('Javascript').then(function (val) {
                    console.log('Javascript: ' + val);
                });

                perfRunner.getStats('loadTime').then(function (val) {
                    console.log('loadTime: ' + val);
                });

                expect(perfRunner.getStats('loadTime')).toBeLessThan(3000);
                expect(perfRunner.getStats('Javascript')).toBeLessThan(1000);
            });
        });
    });
});`

I have a console for Javascript and loadTime in each it block and this is what it prints:

✓ logs in
Javascript: 399.71500009298325
Load time: 2171

✓ goes to overview page
Javascript: 1282.9210000038147
Load time: 2171

If I called perfRunner.stop(), why is my JavaScript counter incrementing while the loadTime remains the exact same? I want individual results for each it block, not aggregated values.

How do I reset or clear the perfRunner results? Where is the document that lists all the function options, other than perfRunner.start() and perfRunner.stop()? Is there anything like perfRunner.reset() or .clear() etc?

Running the protractor perf test example results in Failed: [logTypes()] Not JSON response

Can someone help with this?
{code}
$ protractor-perf protractor-perf.conf.js
[13:17:08] I/direct - Using ChromeDriver directly...
[13:17:08] I/launcher - Running 1 instances of WebDriver
Started
Here
F

Failures:

  1. angularjs homepage todo list should add a todo
    Message:
    Failed: [logTypes()] Not JSON response
    Stack:
    Error: [logTypes()] Not JSON response
    at exports.newError (D:\dev\sims-e2e-test\node_modules\wd\lib\utils.js:139:13)
    at D:\dev\sims-e2e-test\node_modules\wd\lib\callbacks.js:59:17
    at D:\dev\sims-e2e-test\node_modules\wd\lib\webdriver.js:174:5
    at Request._callback (D:\dev\sims-e2e-test\node_modules\wd\lib\http-utils.js:87:7)
    at Request.self.callback (D:\dev\sims-e2e-test\node_modules\wd\node_modules\request\request.js:368:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request. (D:\dev\sims-e2e-test\node_modules\wd\node_modules\request\request.js:1219:14)
    at emitOne (events.js:101:20)
    at Request.emit (events.js:188:7)
    {code}

NaN as a response for perfRunner.getStats('MessageLoop::RunTask')

fit('load 500 items in less than 25 seconds', function() {
        element(by.model('some_element'))
        .all(by.tagName('option'))
        .get(2)
        .click();

        perfRunner.start();
        element(by.id('filter')).click();
        element.all(by.id('ready')).get(495).click();

        perfRunner.stop();

        if (perfRunner.isEnabled) {
            expect(perfRunner.getStats('MessageLoop::RunTask')).toBeLessThan(70000);
        }
    });

There is only one test that it is happening. If I run with the other tests, he passes with the same time the test before...

The tests are the same (exactly), only the quantity of return from backend changes.

Anyone have any idea on what could be happening? Or how can I do a deeper debug and find the problem? :)

Thanks

Not getting all metrics back when running with Protractor

Hi,

I'm not getting all of the test results back when running through protractor using the example test code (https://gist.github.com/axemclion/9594795).

If I run through node directly I seem to get all of them.

Specifically interested in all of the metrics unrelated to network, so I'm passing in the metrics: ['TimelineMetrics', 'ChromeTracingMetrics'] param and from node I get a big long list of things, running from protractor I just get two back - { Styles: 0, Javascript: 0 }.

Anything obvious I might have messed up?

Thanks in advance

Crash with ECONNREFUSED on browser.controlFlow().execute()

I'm running the example located on this repo /test and when I run it returns this:

Error: [execute("(function(){var getTimeMs=(function(){if(window.performance)\nreturn(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow).bind(window.performance);else\n
return function(){return new Date().getTime();};})();var requestAnimationFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||
window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};})().bind(window);window.__RafRecorder={frames:[],flush:true,record:function(timeStamp)
{if(__RafRecorder.flush){__RafRecorder.frames=[];__RafRecorder.flush=false;}\n__RafRecorder.frames.push(timeStamp);
requestAnimationFrame(__RafRecorder.record);},get:function(){__RafRecorder.flush=true;return __RafRecorder.frames;}};requestAnimationFrame(window.__RafRecorder.record);}());")] connect ECONNREFUSED

Stacktrace:
     Error: connect ECONNREFUSED
    at errnoException (net.js:905:11)
    at Object.afterConnect [as oncomplete] (net.js:896:19)
From: Task: <anonymous>
    at [object Object].start (/Users/fernandocea/Development/web-ui/node_modules/protractor-perf/lib/index.js:53:37)
    at [object Object].<anonymous> (/Users/fernandocea/Development/web-ui/example.spec.js:7:16)
From: Task: Asynchronous test function: it()
Error
    at [object Object].<anonymous> (/Users/fernandocea/Development/web-ui/example.spec.js:5:3)
    at Object.<anonymous> (/Users/fernandocea/Development/web-ui/example.spec.js:2:1)

(Driver info: chromedriver=2.10.267517,platform=Mac OS X 10.10.3 x86_64)

protractor-perf/browser-perf metrics v/s webpagetest metrics

This is not an issue but more of a question, When I see the test metrics as opposed to when its run on the webpagetest website, the first param of the first view load time would be 5 seconds. what would the exact mapping be in protractor-perf?

I did refer to this:

https://github.com/axemclion/browser-perf/wiki/Metrics

but i still cant figure out what the total time would be for the page to be fully loaded ??

Failed: Cannot read property 'fulfilled' of undefined

I am trying to use protractor-perf with angular2 project with typescript and faced below error on perf.start() statement in my test spec:
× should display panel with user input

  • Failed: Cannot read property 'fulfilled' of undefined
    at ProtractorPerf. (E:\test-proj\node_modules\protractor-perf\lib\index.js:43:34)
    at ManagedPromise.invokeCallback_ (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:1379:14)
    at TaskQueue.execute_ (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2913:14)
    at TaskQueue.executeNext_ (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2896:21)
    at asyncRun (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2820:25)
    at C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:639:7
    at process.tickCallback (internal/process/next_tick.js:109:7)
    From: Task:
    at ProtractorPerf.start (E:\test-proj\node_modules\protractor-perf\lib\index.js:51:37)
    at Object. (E:\test-proj\e2e\app.e2e-spec.ts:13:20)
    at new ManagedPromise (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:1082:7)
    at TaskQueue.execute
    (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2913:14)
    at TaskQueue.executeNext_ (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2896:21)
    at asyncRun (C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:2820:25)
    at C:\Users\username\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\selenium-webdriver\lib\promise.js:639:7
    at process._tickCallback (internal/process/next_tick.js:109:7)

I have initialized and used protracter-perf inside our test spec using following statements:

var PerfRunner = require('protractor-perf');

describe('test-proj App', () => {
var perfRunner = new PerfRunner('protractor', browser);
it('should display panel with user input', () => {
perfRunner.start();
page.navigateTo();
expect(page.getInputsCount()).toEqual(3);
perfRunner.stop();
}

Can anyone help me on this.

Thanks
Ashutosh

Are there specific version combinations of protractor / chrome etc required?

I'm trying to get this running with unfortunately fairly locked down versions of protractor, webdriver, and chrome (corporate dev environment ftw).

I'm running Protractor 3.3.0, wd 0.4.0, and Chrome 35 (:o).

When I try to run the prefRunner.start(); I get:

Message: Failed: [logTypes()] Not JSON response Stack: Error: [logTypes()] Not JSON response at exports.newError (C:\dev\myapp\node_modules\wd\lib\utils.js:139:13) at C:\dev\myapp\node_modules\wd\lib\callbacks.js:59:17 at C:\dev\myapp\node_modules\wd\lib\webdriver.js:174:5 at Request._callback (C:\dev\myapp\node_modules\wd\lib\http-utils.js:87:7) at Request.self.callback (C:\dev\myapp\node_modules\wd\node_modules\request\request.js:368:22) at emitTwo (events.js:87:13) at Request.emit (events.js:172:7) at Request.<anonymous> (C:\dev\myapp\node_modules\wd\node_modules\request\request.js:1219:14) at emitOne (events.js:82:20) at Request.emit (events.js:169:7) at IncomingMessage.<anonymous> (C:\dev\myapp\node_modules\wd\node_modules\request\request.js:1167:12) at emitNone (events.js:72:20) at IncomingMessage.emit (events.js:166:7) at endReadableNT (_stream_readable.js:905:12) at nextTickCallbackWith2Args (node.js:455:9) at process._tickCallback (node.js:369:17)

I can't find what's causing this - I've had a poke about in the stack, but nothing obvious is jumping out. Am I missing something straighforward?

Unable to locate chromedriver.exe

I'm trying to get this working from within Grunt. I've tried registering a task explicitly as per the documentation and including it in grunt.initConfig. I'm getting the following error in both instances:

Error: Error: Could not find chromedriver at <main>\node_modules\protractor-perf\node_modules\protractor\selenium\chromedriver.exe

Getting Type error on running command protractor-perf config.js

Getting below error on using protractor-perf although the browser has been specified in the config file

if (typeof browserConfig[passedBrowser.browserName] !== 'undefined') {
^TypeError: Cannot read property 'browserName' of undefined
at C:\Users\anusha\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\options.js:84:42

NOTE- the code runs perfectly fine with protractor. it also runs when i specify the browser in command line like this ---> protractor-perf config.js --browser=chrome

config file code snippet :--

exports.config={multiCapabilities: [{

browserName:'chrome'

}]
};

using browserstack

Hi,

is there any possibility to pass the browserstack credentials to the underlying browser-perf? I tried and failed to do this.

Regards

trying to get protractor-perf running in my environment

Copied the following lines into my spec file:

var ProtractorPerf = require('protractor-perf');
var perf = new ProtractorPerf(protractor, browser); // Initialize the perf runner

When I try to run with just protractor, after I have instrumented a spec file, I ger the error:
"Cannot find module 'protractor-perf'" (I do have the location of protractot-perf in my PATH).

When I try to run with "protractor-perf" I get an error:

                    if (typeof browserConfig[passedBrowser.browserName] !== 'undefined') {
                                                          ^

TypeError: Cannot read property 'browserName' of undefined
at C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\options.js:84:42
at Array.forEach (native)
at opts.accesskey (C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\options.js:79:18)
at C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\options.js:197:10
at Array.forEach (native)
at Object.module.exports.scrub (C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\options.js:196:14)
at new Runner (C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\node_modules\browser-perf\lib\runner.js:12:22)
at Function.module.exports.getConfig (C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\lib\index.js:89:15)
at Object. (C:\Users\mjackson1\AppData\Roaming\npm\node_modules\protractor-perf\lib\cli.js:149:15)
at Module._compile (module.js:434:26)

UnknownError - An unknown server-side error occurred while processing the command.

I am running tests on SauceLabs where I see the below issue. Could you please help me out?

https://gist.github.com/umagsfx/8edffe6d69216120ebf0

Failed: [logTypes()] Error response status: 13, , UnknownError - An unknown server-side error occurred while processing the command. Selenium error: Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16'
System info: host: 'sfx-uma.local', ip: '192.168.232.200', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.10.5', java.version: '1.8.0_60'
Driver info: driver.version: unknown

Cannot find module 'node_modules/protractor/built/configParser'

this was working fine till yest but now i see this:

Cannot find module 'node_modules/protractor/built/configParser'
    at Function.Module._resolveFilename (module.js:337:15)
    at Function.Module._load (module.js:287:25)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (..../node_modules/protractor-perf/lib/cli.js:145:20)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)

any idea why this could be happening?

Is it possible for perfjankie Tool to pull the data from my database ?

Continuation to #10

Ok. I will try to write the database connection code . But Will I be able to use perfjankie tool ?

protractor-perf --> SomeDB (couchDB, MongoDB, any possible DB) --> Perfjankie Tool ??

Is the above flow possible ? Especially the last step i.e., Can we use perfjankie Tool to display the dashboard by getting the data from some external DB where I have stored my Metrics Information which I got from protractor-perf ??

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.