The Sauce Labs Cookbook

Sauce Headless

Front End Performance Testing

Insights

External Resources

More Info


Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

You can To enable networking capabilities for tests and generate custom log files, use these custom Sauce Labs options with for the Selenium JavaScript Executor, in conjunction with the Extended debugging feature, to control networking capabilities for your tests, and to generate custom logs for extended debugging.

Table of Contents

Tip
titleExtended Debugging Required

You must have Extended Debugging enabled and run your tests on Chrome browsers to use these commands.

Info
titleFor Chrome Only

This feature is only available for testing on Chrome browsers versions 62 and above.

...

titleDemo examples

...

and our extended debugging features. You can find more examples of this feature written in Node.js, Python, and Java

...

Note
titleBeta Feature

This feature is currently in Beta and some commands might not work as expected. Please test the results of these commands under non-critical conditions before deploying to critical production situations.

Test Environment Tools

The Test Environment Tools let you on GitHub.

You must have Extended Debugging enabled to use these commands.

Include Page
_chrome_only
_chrome_only

See the following sections for more information:

Table of Contents
maxLevel3

Test Environment Tools

Test Environment Tools simulate network conditions and manipulate network requests to understand analyze and improve the test performance of your tests

Intercept Network Requests

Allows modifying any request modification of requests made by the browser. You can blacklist, modify, or redirect alter these as required for your tests . For example, you canrequire:

  • Blacklist requests to 3rd party vendors
  • Modify requests to REST API (Mock REST API response)
  • Redirect certain parts of the app 
  • Insert /or change headers
JavaScript Executor CommandRequest ParametersSample Code

sauce:intercept + redirect

url: a string that matches an outgoing request URL. Wildcards are supported, for example https://saucelabs.com/rest/v1/* would match all v1 rest API requests.

redirect is a string representing an absolute URL where the original request is redirected. In the example, this is "https://google.com"

Code Block
languagepy
driver.execute_script('sauce:intercept', {
    "url": "https://saucelabs.com",
    "redirect": "https://google.com"
})

sauce:intercept + response

url: a string that matches an outgoing request URL. Wildcards are supported, for example https://saucelabs.com/rest/v1/* would match all v1 rest API requests.

response: an object that represents the response to send when the requested URL is intercepted. There are three options:

    • statusCode: number representing the request status (200)
    • headers: list of key/value pairs that is set as header variables, for example Cookie: "foo=bar"
    • rawResponse: actual response payload as a string
Code Block
languagepy
driver.execute_script("sauce:intercept", {
	"url": "http://sampleapp.appspot.com/api/todos",
        "response": {
            "headers": {
                "x-custom-header": "foobar"
            },
            "body": [{
                "title": "Hello",
                "order": 1,
                "completed": false,
                "url": "http://todo-backend-express.herokuapp.com/15727"
            }]
        }
    })
sauce:intercept+ error

url: a string that matches an outgoing request URL. Wildcards are supported, for example https://saucelabs.com/rest/v1/* would match all v1 rest API requests.

error: error values are:

  • 'Failed'
  • 'Aborted'
  • 'TimedOut'
  • 'AccessDenied'
  • 'ConnectionClosed'
  • 'ConnectionReset' 
  • 'ConnectionRefused'
  • 'ConnectionAborted'
  • 'ConnectionFailed'
  • 'NameNotResolved'
  • 'InternetDisconnected'
  • 'AddressUnreachable'
Code Block
languagepy
driver.execute_script("sauce:intercept", {
	"url": "https://saucecon.com/wp-content/uploads/2017/07/SauceCon-hero-img-100-2.jpg",
    error: "Failed"}


Network Intercept Example

Code Block
languagepy
titlePython example
driver.execute_script('sauce:intercept', {
    "url": "https://saucelabs.com",
    "redirect": "https://google.com"
})
# or
driver.execute_script('sauce:intercept', {
    "url": "https://saucelabs.com/res7/v1/build/32hmv4j32v4j2j3v4j24v232vj4j",
    "response": {
        "statusCode": 200,
        "headers": {
            "etag": 3244224432,
            "Cookie: "foo=bar",
            ...
        },
        "rawResponse": "{\"username\":\"..."
    }
})

Throttle CPU Capabilities

Mobile devices have less CPU power than most desktops and laptops (or a VM's default configuration). You can use CPU Throttling to simulate how your app will run on slower systems, helping you identify possible performance issues.

JavaScript Executor CommandRequest ParametersExample
sauce:throttleCPU

ratea number defining the amount of slowdown (e.g. 2 ~ 2x slowdown, your CPU will be 2 times slower than usual)

Code Block
languagepy
driver.execute_script('sauce:throttleCPU', {
	"rate": 4
})

Throttle Network Capabilities

With network conditioning you can test your site on a variety of network connections, including Edge, 3G, and even offline. You can throttle the data throughput, including the maximum download and upload throughput, and use latency manipulation to enforce a minimum delay in connection round-trip time (RTT).

JavaScript Executor CommandRequest ParametersExample
sauce:

...

throttleNetwork

condition:

...

a string or object representing

...

browser network conditions.

Code Block
languagepy
driver.execute_script('sauce:throttleNetwork', {
	"condition": "GPRS"
})
# or
driver.execute_script('sauce:throttleNetwork', {
	"condition": {
		"download": 1000,
		"upload": 500,
		"latency": 40
    }
})

Anchor
valid_profiles
valid_profiles

Strings

Profile NameDownload Speed (kb/s)Upload Speed (kb/s)Round Trip Time (ms)
offline000
GPRS5020500
Regular 2G25050300
Good 2G450150150
Regular 3G750250100
Good 3G1Mb/s75040
Regular 4G4Mb/s3Mb/s20ms
DSL2Mb/s1Mb/s5ms
WiFi30Mb/s15Mb/s2ms
online
No Restrictions
No Restrictions
No Restrictions

...

Anchor

...

custom_objects
custom_objects

Custom objects

You can create custom network conditions with objects. You must define the download speed (in bytes/second), upload speed (in bytes/second), and latency (in milliseconds) for the custom condition, as shown in the example.

...

Code Block
languagepy
driver.execute_script('sauce:throttle', {
	"condition": "GPRS"
})
# or
driver.execute_script('sauce:throttle', {
	"condition": {
		"download": 1000,
		"upload": 500,
		"latency": 40
    }
})

Extended Debugging Tools

...

Extended Debugging Tools provide

...

additional logs to analyze

...

test performance. 

Network

...

Log

The Sauce Labs 

...

network

...

Log TypeResponse
sauce:timing
Code Block
titleSample response
{
    "navigationStart": 0
    "unloadEventStart": -1
    "unloadEventEnd": -1
    "redirectStart": 0
    "redirectEnd": 312
    "fetchStart": 312
    "domainLookupStart": 312
    "domainLookupEnd": 312
    "connectStart": 312
    "connectEnd": 312
    "secureConnectionStart": -1
    "requestStart": 39
    "responseStart": 309
    "responseEnd": 312
    "domLoading": 316
    "domInteractive": 359
    "domContentLoadedEventStart": 560
    "domContentLoadedEventEnd": 560
    "domComplete": 622
    "loadEventStart": 622
    "loadEventEnd": 622
}

Application Metrics Log

The Sauce Labs metric log receives application-related metrics. As with the timing log, all metrics are relative to the page load time.

Log TypeResponse
sauce:metrics
(Chrome 64 and higher)
Code Block
titleSample response
{
    "timestamp": 35037.202627,
    "audioHandlers": 0,
    "documents": 3,
    "frames": 2,
    "jsEventListeners": 63,
    "layoutObjects": 435,
    "nodes": 506,
    "resources": 11,
    "layoutCount": 2,
    "recalcStyleCount": 5,
    "layoutDuration": 0.0860430000029737,
    "recalcStyleDuration": 0.00374899999587797,
    "scriptDuration": 0.0770069999925909,
    "taskDuration": 0.297364000020025,
    "jsHeapUsedSize": 6295344,
    "jsHeapTotalSize": 10891264,
    "firstMeaningfulPaint": 35036.03356,
    "domContentLoaded": 35036.122972,
    "navigationStart": 35035.833805,
	"pausableObjects": 23,
    "mediaKeySessions": 0,
    "uaCSSResources": 0,
    "scriptPromises": 0,
    "workerGlobalScopes": 1,
    "mediaKeys": 0,
    "v8PerContextDatas": 1
}
sauce:metrics
(on Chrome 63)

The properties are the same as on Chrome 64, but instead of pausableObjects the property is called suspendableObjects.

Code Block
titlesuspendableObjects property
{
	...
	"suspendableObjects": 23,
	...
}
sauce:metrics
(on Chrome 62)

The properties are named differently when using this command on Chrome 62, as shown in this example response:

Code Block
titleSample Response (Chrome 62)
{
    "timestamp": 75.518,
    "audioHandlerCount": 0,
    "documentCount": 4,
    "frameCount": 2,
    "jsEventListenerCount": 17,
    "layoutObjectCount": 47,
    "nodeCount": 291,
    "resourceCount": 32,
    "layoutCount": 3,
    "recalcStyleCount": 4,
    "layoutDuration": 0.120999999999981,
    "recalcStyleDuration": 0.0130000000000194,
    "scriptDuration": 0.576000000000022,
    "taskDuration": 1.26199999999999,
    "jsHeapUsedSize": 3835180,
    "jsHeapTotalSize": 6995968,
    "firstMeaningfulPaint": 74.729,
    "domContentLoaded": 74.077,
    "navigationStart": 68.32,
    "suspendableObjectCount": 31,
    "mediaKeySessionCount": 0,
    "scriptPromiseCount": 0,
    "workerGlobalScopeCount": 1,
    "mediaKeysCount": 0,
    "v8PerContextDataCount": 1
}

Network Log

...

 log records all network requests being made by the page currently open in the browser.

Log TypeResponse
sauce:network
Code Block
titleSample response
[{
    "url": "http://saucelabs.com/beta/dashboard",
    "statusCode": 200,
    "method": "GET",
    "requestHeaders": {
        ...
    },
    "responseHeaders": {
        ...
    },
    "timing": {
        "blocked": -1,
        "connect": -1,
        "dns": -1,
        "receive": 0,
        "send": 0,
        "ssl": -1,
        "wait": 0
    }
}, {
    ...
}]

Performance Log

...

The Sauce Labs performance log

...

contains performance-related metrics.

Log TypeResponse
sauce:performance
Code Block
titleSample response
{
  "load": 1083,
  "

...

speedIndex":

...

 905,
  "firstInteractive": 1073,
  "

...

firstVisualChange":

...

 576,
  

...

"

...

lastVisualChange":

...

 1243,
  

...

"firstMeaningfulPaint":

...

 1239,
  

...

"

...

firstCPUIdle":

...

 1239,
  

...

"timeToFirstByte":

...

 69,
  "firstPaint": 559,
  "

...

estimatedInputLatency":

...

 16,
  

...

"firstContentfulPaint":

...

 630,
  

...

"

...

score":

...

 0.

...

9947067807295903,
  

...

"domContentLoaded":

...

 1073
}