From e9e33bbcb8dca21391f14d73d0ba52145f21f7ed Mon Sep 17 00:00:00 2001 From: Peter Hedenskog Date: Mon, 21 Jan 2019 14:55:00 +0100 Subject: [PATCH] Docs 8.0 (#2254) --- docs/_config.yml | 11 +- docs/_includes/anchor_headings.html | 93 ++++ docs/_includes/css/sitespeed.css | 21 + docs/_includes/index/box6.md | 4 +- docs/_includes/index/install.md | 2 +- docs/_layouts/default.html | 6 +- docs/_layouts/startpage.html | 3 + ...21-sitespeed.io-8.0-and-browsertime.4.0.md | 249 +++++++++++ docs/blog/index.md | 6 +- docs/css/prism-1.15.css | 200 +++++++++ .../browsertime/configuration/index.md | 4 +- .../browsertime/details/index.md | 6 +- .../browsertime/graphite/index.md | 2 +- docs/documentation/browsertime/index.md | 2 +- .../browsertime/installation/index.md | 8 +- docs/documentation/chrome-har/index.md | 2 +- docs/documentation/pagexray/index.md | 10 +- .../sitespeed.io/best-practice/index.md | 11 +- .../sitespeed.io/browsers/index.md | 16 +- .../sitespeed.io/configuration/index.md | 49 ++- .../sitespeed.io/connectivity/index.md | 14 +- .../sitespeed.io/docker/index.md | 12 +- .../sitespeed.io/graphite/index.md | 2 +- docs/documentation/sitespeed.io/index.md | 33 +- .../sitespeed.io/installation/index.md | 2 +- .../sitespeed.io/metrics/index.md | 12 +- .../sitespeed.io/mobile-phones/index.md | 4 +- .../sitespeed.io/performance-budget/index.md | 112 ++++- .../performance-dashboard/index.md | 14 +- .../sitespeed.io/plugins/index.md | 38 +- .../sitespeed.io/prepostscript/index.md | 150 ++----- docs/documentation/sitespeed.io/s3/index.md | 2 +- .../sitespeed.io/scripting/index.md | 401 ++++++++++++++++++ docs/documentation/sitespeed.io/spa/index.md | 72 ++++ .../sitespeed.io/upgrade/index.md | 75 +--- .../sitespeed.io/webpagereplay/index.md | 8 +- .../sitespeed.io/webpagetest/index.md | 23 +- docs/examples/index.md | 2 +- docs/img/new-dashboard-8.0.jpg | Bin 0 -> 156052 bytes docs/img/user-journey.png | Bin 0 -> 87649 bytes docs/js/clipboard-2.0.4.min.js | 7 + docs/js/prism-1.15.js | 10 + 42 files changed, 1355 insertions(+), 343 deletions(-) create mode 100644 docs/_includes/anchor_headings.html create mode 100644 docs/_posts/2019-01-21-sitespeed.io-8.0-and-browsertime.4.0.md create mode 100644 docs/css/prism-1.15.css create mode 100644 docs/documentation/sitespeed.io/scripting/index.md create mode 100644 docs/documentation/sitespeed.io/spa/index.md create mode 100644 docs/img/new-dashboard-8.0.jpg create mode 100644 docs/img/user-journey.png create mode 100755 docs/js/clipboard-2.0.4.min.js create mode 100644 docs/js/prism-1.15.js diff --git a/docs/_config.yml b/docs/_config.yml index 66ae224b6..f35977566 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -5,14 +5,9 @@ compress_html: clippings: all endings: all include: ["_headers"] +highlighter: none kramdown: - enable_coderay: false - coderay: - coderay_wrap: div - coderay_line_numbers: inline - coderay_line_number_start: 1 - coderay_tab_width: 4 - coderay_bold_every: 10 - coderay_css: style + syntax_highlighter_opts: + disable : true gems: diff --git a/docs/_includes/anchor_headings.html b/docs/_includes/anchor_headings.html new file mode 100644 index 000000000..8b6e063ac --- /dev/null +++ b/docs/_includes/anchor_headings.html @@ -0,0 +1,93 @@ +{% capture headingsWorkspace %} + {% comment %} + Version 1.0.2 + https://github.com/allejo/jekyll-anchor-headings + + "Be the pull request you wish to see in the world." ~Ben Balter + + Usage: + {% include anchor_headings.html html=content %} + + Parameters: + * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll + + Optional Parameters: + * beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content + * anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available + * anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space + * anchorTitle (string) : '' - The `title` attribute that will be used for anchors + * h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored + * h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored + * bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content + * bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content + + Output: + The original HTML with the addition of anchors inside of all of the h1-h6 headings. + {% endcomment %} + + {% assign minHeader = include.h_min | default: 1 %} + {% assign maxHeader = include.h_max | default: 6 %} + {% assign beforeHeading = include.beforeHeading %} + {% assign nodes = include.html | split: ' + {% if headerLevel < 1 or headerLevel > 6 %} + {% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %} + {% continue %} + {% endif %} + + {% assign _workspace = node | split: '' | first }}>{% endcapture %} + {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} + + + {% capture anchor %}{% endcapture %} + + {% if html_id and headerLevel >= minHeader and headerLevel <= maxHeader %} + {% capture anchor %}href="#{{ html_id}}"{% endcapture %} + + {% if include.anchorClass %} + {% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %} + {% endif %} + + {% if include.anchorTitle %} + {% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', header }}"{% endcapture %} + {% endif %} + + {% capture anchor %}{{ include.anchorBody | replace: '%heading%', header | default: '' }}{% endcapture %} + + + {% if beforeHeading %} + {% capture anchor %}{{ anchor }} {% endcapture %} + {% else %} + {% capture anchor %} {{ anchor }}{% endcapture %} + {% endif %} + {% endif %} + + {% capture new_heading %} + ]({{site.baseurl}}/documentation/browsertime) -We've been working on releasing 3.0 of Browsertime for some time and now it's here! You should use Browsertime if you want a raw JSON result for timings and/or execute your own JavaScript. Browsertime is perfect if you wanna build your own performance tool, as VoxMedia did when they created [Lightbike](https://github.com/voxmedia/lightbike) built on top of Browsertime. +Browsertime 4.0 supports testing multiple pages within the same browser session and scriptinmg. You should use Browsertime if you want a raw JSON result for timings and/or execute your own JavaScript. Browsertime is perfect if you wanna build your own performance tool, as VoxMedia did when they created [Lightbike](https://github.com/voxmedia/lightbike) built on top of Browsertime. diff --git a/docs/_includes/index/install.md b/docs/_includes/index/install.md index c1c867455..00c3ec97d 100644 --- a/docs/_includes/index/install.md +++ b/docs/_includes/index/install.md @@ -4,7 +4,7 @@ Use our [Docker container](https://hub.docker.com/r/sitespeedio/sitespeed.io/) to get an environment with Firefox, Chrome, XVFB and sitespeed.io up and running as fast as you can download them. They work [extremely well]({{site.baseurl}}/documentation/sitespeed.io/performance-dashboard/) together with Graphite/InfluxDB and Grafana. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ ~~~ #### npm diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index d3caf767d..bd0ebdb28 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -43,8 +43,10 @@ layout: compress + - {% include analythics.js %} + + @@ -53,7 +55,7 @@ layout: compress
- {{ content }} + {% include anchor_headings.html html=content anchorBody='#' anchorClass='anchor' h_max=4 h_min=2 %}
diff --git a/docs/_layouts/startpage.html b/docs/_layouts/startpage.html index f7504f6f6..c5cd62f74 100644 --- a/docs/_layouts/startpage.html +++ b/docs/_layouts/startpage.html @@ -45,6 +45,9 @@ layout: compress + + + diff --git a/docs/_posts/2019-01-21-sitespeed.io-8.0-and-browsertime.4.0.md b/docs/_posts/2019-01-21-sitespeed.io-8.0-and-browsertime.4.0.md new file mode 100644 index 000000000..21eaac960 --- /dev/null +++ b/docs/_posts/2019-01-21-sitespeed.io-8.0-and-browsertime.4.0.md @@ -0,0 +1,249 @@ +--- +layout: default +title: Sitespeed.io 8.0 and Browsertime 4.0 +description: Today we released new sitespeed.io and browsertime with support for testing multiple pages within the same browser session. +authorimage: /img/aboutus/peter.jpg +intro: Finally it is here, the most wanted feature by users ... test multiple pages within the same browser session, scripting the page and choosing yourself when to run your tests. +keywords: sitespeed.io, browsertime, webperf +nav: blog +--- + +# Sitespeed.io 8.0 and Browsertime 4.0 + +There are so many new and great thing in this release and we will focus on a couple of new things in this blog post. You can read about the rest of the changes in the [changelog](https://github.com/sitespeedio/browsertime/blob/master/CHANGELOG.md) for Browsertime and the [changelog](https://github.com/sitespeedio/sitespeed.io/blob/master/CHANGELOG.md) for sitespeed.io. + +Lets talk about: +- [Testing multiple pages within a browser session](#testing-multiple-pages-within-a-browser-session) +- [Testing a single page application](#testing-a-single-page-application) +- [New privacy advice in Coach 3.0](#new-privacy-advice-in-coach-30) +- [New and improved dashboards](#new-and-improved-dashboards) +- [New budget configuration](#new-budget-configuration) +- [Upgrading Browsertime](#upgrading-browsertime) +- [Upgrading sitespeed.io](#upgrading-sitespeedio) +- [What you can do](#what-you-can-do) + +## Testing multiple pages within a browser session +The user journey + +In versions prior 8.0 you could test one page with the browser cache cleared, you could use a ```--preURL``` to pre warm the browser cache or a script, but you could only test one page at a time. With the new version you can pass on multiple URLs and choose to access them one by one within the same browser session without clearing the cache. + +Lets say tou want to test the following user journey: A user first visits the start page [https://www.sitespeed.io](https://www.sitespeed.io) then[https://www.sitespeed.io/documentation/ ](https://www.sitespeed.io/documentation/) and last goes to the [https://www.sitespeed.io/documentation/sitespeed.io](https://www.sitespeed.io/documentation/sitespeed.io/) page. + +You can do that now by just adding the ```--multi``` parameter: + +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --multi https://www.sitespeed.io https://www.sitespeed.io/documentation/ https://www.sitespeed.io/documentation/sitespeed.io/ +~~~ + +If you leave out ```--multi``` each and every URL will be tested by starting a new browser session with the cached cleared between each URL. + +With the new scripting capabilities you can do the same with a script: + +~~~javascript +module.exports = async function(context, commands) { + await commands.measure.start('https://www.sitespeed.io'); + await commands.measure.start('https://www.sitespeed.io/documentation/'); + return commands.measure.start('https://www.sitespeed.io/documentation/sitespeed.io/'); +}; +~~~ + +And run it with +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --multi script.js +~~~ + +The new scripting capabilities adds a couple of commands to make scripting easier ([see the documentation](../documentation/sitespeed.io/scripting/)). And you can still also use raw Selenium if you prefer that. + +Let us look at a little more complicated example. We want to measure the actual login page at Wikipedia and then measure the Barack Obama page as a logged in user. + + +~~~javascript +module.exports = async function(context, commands) { + // We start by navigating to the login page. + await commands.navigate( + 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page' + ); + + // When we fill in a input field/click on a link we wanna + // try/catch that if the HTML on the page changes in the feature + // sitespeed.io will automatically log the error in a user friendly + // way, and the error will be re-thrown so you can act on it. + try { + // Add text into an input field, finding the field by id + await commands.addText.byId('login', 'wpName1'); + await commands.addText.byId('password', 'wpPassword1'); + + // Start the measurement before we click on the + // submit button. Sitespeed.io will start the video recording + // and prepare everything. + await commands.measure.start('login'); + // Find the sumbit button and click it and then wait + // for the pageCompleteCheck to finish + await commands.click.byIdAndWait('wpLoginAttempt'); + // Stop and collect the measurement before the next page we want to measure + await commands.measure.stop(); + // Measure the Barack Obama page as a logged in user + return commands.measure.start( + 'https://en.wikipedia.org/wiki/Barack_Obama' + ); + } catch (e) { + // We try/catch so we will catch if the the input fields can't be found + // The error is automatically logged in Browsertime and re-thrown here + } +}; +~~~ + +You can check out [more examples](../documentation/sitespeed.io/scripting/#examples) in the documentation. + +## Testing a single page application + +Yeah, you can now test a SPA! When you test a single page application you should add the ```--spa``` parameter so that Browsertime/sitespeed.io knows. That will enable: +* Automatically handle URLs with #. +* End testing your page load after X seconds of no activity in the Resource Timing API. This makes sure that when you navigate to different pages, the navigation ends when everything finished loading. + +Here's an example where we navigate and measure the start page of our Grafana installation, and then measure clicking the link to see the data for the last thirty days. + +Lets create a script file and call it *thirtydays.js*. + +~~~javascript +module.exports = async function(context, commands) { + await commands.measure.start('https://dashboard.sitespeed.io/d/000000044/page-timing-metrics?orgId=1'); + try { + await commands.click.byClassName('gf-timepicker-nav-btn'); + await commands.wait.byTime(1000); + // We give the paghe an alias that will be used if the metrics is sent to Graphite/InfluxDB + await commands.measure.start('pageTimingMetricsLast30Days'); + await commands.click.byLinkTextAndWait('Last 30 days'); + await commands.measure.stop(); + } catch (e) { + // If the GUI change and a link is not there, + // the click commands will throw an error. + // sitespeed.io will catch, log and rethrow + // and you can choose if you want to have a different + // user flow + } +}; +~~~ + +And then you run it by passing on the script file, using ```--spa``` to notify that you are testing a single page application and ```--multi``` that you test multiple pages withing one run. + +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} thirtydays.js --spa --multi +~~~ + +Read the full [documentation](../documentation/sitespeed.io/spa/) for testing your single page application. + +## New privacy advice in Coach 3.0 +Privacy is [important to us]({{site.baseurl}}/privacy-policy/) and we have had users complaining about the advice not to use Google Analytics: *"Our customer wants a Best Practice score 100 and they cannot get that since they use GA ...."*. + +Well ... by using Google Analytics your customer is revealing information about a your user's behavior to Google. That's not ok. But maybe the **Best Practice** category wasn't the best place for that advice. That's why we created the **Privacy** category with the following advice: + +* Always use [HTTPS](https://https.cio.gov/everything/). +* Do not mix HTTPS with HTTP, since every unencrypted HTTP request reveals information about your user’s behavior. +* Use a [Referrer Policy header](https://scotthelme.co.uk/a-new-security-header-referrer-policy/) that allows your site to control how much information the browser includes with navigations away from your page. +* Use the [HTTP Strict-Transport-Security response header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security) to let the web site tell browsers that it should only be accessed using HTTPS, instead of using HTTP. +* Avoid including Facebook/Google/AMP/Youtube on your page since you [give away users privacy to large companies](https://2018.ar.al/notes/we-didnt-lose-control-it-was-stolen/). +* Avoid using third party requests since it reveals information about your user's behavior. + + +The new privacy category is super useful for everyone and specific all our users in the public sector: Please make sure that you do not leak your user's behavior. + +## New and improved dashboards + +We have updated our dashboards to include new metrics like Privacy score from the Coach and added more default graphs to make it easier to find regression. The [timing metrics dashboard](https://dashboard.sitespeed.io/d/000000044/page-timing-metrics?orgId=1) now includes "Compares to last week" graphs, inspired by [Timo Tijhof](https://twitter.com/timotijhof) work at Wikimedia. + +![Compare to last week]({{site.baseurl}}/img/new-dashboard-8.0.jpg) +{: .img-thumbnail} + +You can get the [updated dashboards from Github](https://github.com/sitespeedio/grafana-bootstrap-docker/tree/master/dashboards/graphite) and check them out at [dashboard.sitespeed.io](https://dashboard.sitespeed.io/d/000000044/page-timing-metrics?orgId=1). + +## New budget configuration +One problem before 8.0 was that it was really hard to configure a performance budget: You needed to use the internal data structure and that sucks. Looking at other tools we could see that configuring a budget is usually hard. That's why we are introducing a new way in 8.0 (if you where using the old configuration pre 8.0, don't worry, that will continue to work). + +You can configure default values and specific for a URL. In the budget file there are 5 couple of sections: + +* timings - are Visual and technical metrics and are configured in milliseconds (ms) +* requests - the max number of requests per type or total +* transferSize - the max transfer size (over the wire) per type or total +* thirdPatrty - max number of requests or trasnferSize for third parties +* score - minimum score for Coach advice + + +The simplest version of a budget file that will check for SpeedIndex higher than 1000 ms looks like this: + +~~~json +{ + "budget": { + "timings": { + "SpeedIndex":1000 + } + } +} +~~~ + +All URLs that you test then needs to have a SpeedIndex faster than 1000. But if you have one URL that you know are slower? You can override budget per URL. + +~~~json +{ + "budget": { + "https://www.sitespeed.io/documentation/": { + "timings": { + "SpeedIndex": 3000 + } + }, + "timings": { + "SpeedIndex":1000 + } + } +} +~~~ + +[Read the documentation](/documentation/sitespeed.io/performance-budget/) on how to setup your budget file. + +## Upgrading Browsertime +There are a couple of breaking changes introduce in 4.0. This only matters if you run Browsertime as a standalone tool (without using sitespeed.io). + +1. New structure of the result JSON. In 4.0 we introduce the ability to test multiple pages. That means that instead of returning one result object, we return an array. In 3.x the result looks like this: +~~~json + { + "info": { + "browsertime": { + "version": "3.0.0" + }, ... +~~~ + And the new one returns a array, where each tested page is an result in that array. + ~~~json + [{ + "info": { + "browsertime": { + "version": "4.0.0" + }, ... + }}] +~~~ +2. New naming of result files. Before files was named by iteration: 1-video.mp4. In the latest version all extra files are stored in a folder structure and referenced in the JSON, starting with /pages/ (following the same pattern as sitespeed.io). +3. New layout of Selenium scripting. We simplified the layout of the script. The new version will be able to do the exact same thing as older versions but with a simpler layout: + +~~~javascript + module.exports = async function(context, commands) { + // code + } +~~~ + +Pre/post scripts also follows the new script format. + +## Upgrading sitespeed.io + +Upgrading should be pretty straight forward and work out of the box. If you used pre/post scripts, you need to upgrade them to the new signature: + +~~~javascript + module.exports = async function(context, commands) { + // code + } +~~~ + +And read the [new documentation about scripting](/documentation/sitespeed.io/scripting/). + +## What you can do. +Sitespeed.io 8.0 and Browsertime 4.0 is a major major change. We need your help to try it out and please create [issues](https://github.com/sitespeedio/sitespeed.io/issues/new) when you find something that seems wrong. + +/Peter \ No newline at end of file diff --git a/docs/blog/index.md b/docs/blog/index.md index b104629e7..79698425f 100644 --- a/docs/blog/index.md +++ b/docs/blog/index.md @@ -19,8 +19,4 @@ nav: blog [>> Read more]({{site.baseurl}}{{ post.url }}) - - - * * * - -{% endfor %} +{% endfor %} \ No newline at end of file diff --git a/docs/css/prism-1.15.css b/docs/css/prism-1.15.css new file mode 100644 index 000000000..e1e224b5e --- /dev/null +++ b/docs/css/prism-1.15.css @@ -0,0 +1,200 @@ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=clike+javascript+bash+docker+json&plugins=toolbar+copy-to-clipboard */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +div.code-toolbar { + position: relative; +} + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} + +div.code-toolbar:hover > .toolbar { + opacity: 1; +} + +div.code-toolbar > .toolbar .toolbar-item { + display: inline-block; +} + +div.code-toolbar > .toolbar a { + cursor: pointer; +} + +div.code-toolbar > .toolbar button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; /* for button */ + -moz-user-select: none; + -ms-user-select: none; +} + +div.code-toolbar > .toolbar a, +div.code-toolbar > .toolbar button, +div.code-toolbar > .toolbar span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); + border-radius: .5em; +} + +div.code-toolbar > .toolbar a:hover, +div.code-toolbar > .toolbar a:focus, +div.code-toolbar > .toolbar button:hover, +div.code-toolbar > .toolbar button:focus, +div.code-toolbar > .toolbar span:hover, +div.code-toolbar > .toolbar span:focus { + color: inherit; + text-decoration: none; +} + diff --git a/docs/documentation/browsertime/configuration/index.md b/docs/documentation/browsertime/configuration/index.md index afed745fb..23c86d87c 100644 --- a/docs/documentation/browsertime/configuration/index.md +++ b/docs/documentation/browsertime/configuration/index.md @@ -20,8 +20,8 @@ twitterdescription: Configuration for Browsertime. Browsertime is highly configurable, let's check it out! ## The options -You have the following options when running sitespeed.io within docker (run docker run sitespeedio/browsertime --help to get the list on your command line): +You have the following options when running Browsertime within docker (run docker run sitespeedio/browsertime --help to get the list on your command line): -~~~help +~~~shell {% include_relative config.md %} ~~~ diff --git a/docs/documentation/browsertime/details/index.md b/docs/documentation/browsertime/details/index.md index 9d9b98cf4..b288a5c27 100644 --- a/docs/documentation/browsertime/details/index.md +++ b/docs/documentation/browsertime/details/index.md @@ -23,7 +23,7 @@ twitterdescription: Use our Docker image (with Chrome, Firefox, XVFB and the dependencies needed to record a video): ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/browsertime-results sitespeedio/browsertime:{% include version/browsertime.txt %} --video --visualMetrics https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/browsertime-results sitespeedio/browsertime:{% include version/browsertime.txt %} --video --visualMetrics https://www.sitespeed.io/ ~~~ Or using NodeJS: @@ -52,7 +52,7 @@ docker build -t sitespeedio/browsertime . And then just run it: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/browsertime-results sitespeedio/browsertime -n 1 --video --visualMetrics https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/browsertime-results sitespeedio/browsertime -n 1 --video --visualMetrics https://www.sitespeed.io/ ~~~ ## Connectivity @@ -70,5 +70,5 @@ The current version doesn't support Docker so you need to [install the requireme If you want to set connectivity you need to use something like [Pi Network Conditioner](https://github.com/phuedx/pinc). ~~~bash -browsertime --browsertime.chrome.android.package com.android.chrome https://www.sitespeed.io --video --visualMetrics +browsertime --android https://www.sitespeed.io --video --visualMetrics ~~~ diff --git a/docs/documentation/browsertime/graphite/index.md b/docs/documentation/browsertime/graphite/index.md index 833ba0329..fcf2952cc 100644 --- a/docs/documentation/browsertime/graphite/index.md +++ b/docs/documentation/browsertime/graphite/index.md @@ -21,7 +21,7 @@ docker run --shm-size=1g --rm -v "$(pwd)":/browsertime-results sitespeedio/brows Then we pickup the median SpeedIndex from Browsertime and send it to your Graphite instance. -~~~ +~~~shell echo "browsertime.your.key.SpeedIndex.median" $(cat tmp/browsertime.json | jq .statistics.visualMetrics.SpeedIndex.median) "`date +%s`" | nc -q0 my.graphite.com 2003 ~~~ diff --git a/docs/documentation/browsertime/index.md b/docs/documentation/browsertime/index.md index 90d79cd0c..cea8e7521 100644 --- a/docs/documentation/browsertime/index.md +++ b/docs/documentation/browsertime/index.md @@ -9,7 +9,7 @@ image: https://www.sitespeed.io/img/sitespeed-2.0-twitter.png twitterdescription: Documentation for Browsertime. --- -# Documentation v3 +# Documentation v4 Browsertime logo diff --git a/docs/documentation/browsertime/installation/index.md b/docs/documentation/browsertime/installation/index.md index 7a7d1f069..d470c3251 100644 --- a/docs/documentation/browsertime/installation/index.md +++ b/docs/documentation/browsertime/installation/index.md @@ -17,21 +17,21 @@ twitterdescription: Install browsertime using npm, yarn or Docker. {:toc} # Install -You can run Browsertime using our Docker container or using NodeJS. +You can run Browsertime using our Docker container or using NodeJS. If you use Docker everything "just works" and you don't need to install anything extra for getting video and visual metrics to work. ## Docker -We have [Docker images](https://hub.docker.com/r/sitespeedio/browsertime/) with Browsertime, Chrome, Firefox and Xvfb. It is super easy to use (Xvfb is started automatically when you start the container). Here's how to use the container with both Firefox & Chrome (install [Docker](https://docs.docker.com/engine/installation/) first). +We have [Docker images](https://hub.docker.com/r/sitespeedio/browsertime/) with Browsertime, Chrome, Firefox and Xvfb. It is super easy to use (Xvfb is started automatically when you start the container). Here's how to use the container with both Firefox & Chrome (install [Docker](https://docs.docker.com/install/) first). ### Mac & Linux ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/browsertime sitespeedio/browsertime:{% include version/browsertime.txt %} --video --visualMetrics https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/browsertime sitespeedio/browsertime:{% include version/browsertime.txt %} --video --visualMetrics https://www.sitespeed.io/ ~~~ ### Windows -~~~ +~~~shell C:\Users\Vicky> docker pull sitespeedio/browsertime C:\Users\Vicky> docker run --rm -v "$(pwd)":/browsertime sitespeedio/browsertime:{% include version/browsertime.txt %} https://www.sitespeed.io -b firefox ~~~ diff --git a/docs/documentation/chrome-har/index.md b/docs/documentation/chrome-har/index.md index 45aa241e8..1b1ec8830 100644 --- a/docs/documentation/chrome-har/index.md +++ b/docs/documentation/chrome-har/index.md @@ -26,7 +26,7 @@ Chrome-HAR is for tool makers: Get the log from the Chrome Debugging Protocol an Convert your messages to a HAR file. -~~~ +~~~javascript const parser = require('chrome-har'); // you already have the message from Chrome Debugging Protocol diff --git a/docs/documentation/pagexray/index.md b/docs/documentation/pagexray/index.md index f786c904f..f22059346 100644 --- a/docs/documentation/pagexray/index.md +++ b/docs/documentation/pagexray/index.md @@ -32,29 +32,29 @@ We love HAR files but it's hard to actually see how the page is composed only lo ## Install ```bash -$ npm install pagexray -g +npm install pagexray -g ``` ## Run ```bash -$ pagexray /path/to/my.har +pagexray /path/to/my.har ``` Or if you want to prettify the HAR ```bash -$ pagexray --pretty /path/to/my.har +pagexray --pretty /path/to/my.har ``` And if you want to get info per request/response: ```bash -$ pagexray --includeAssets /path/to/my.har +pagexray --includeAssets /path/to/my.har ``` If you want to use it in node, use it like this: -```node +```javascript const pagexray = require('pagexray'); const har = // your HAR const pages = pagexray.convert(har); diff --git a/docs/documentation/sitespeed.io/best-practice/index.md b/docs/documentation/sitespeed.io/best-practice/index.md index c9957b546..9dbe92690 100644 --- a/docs/documentation/sitespeed.io/best-practice/index.md +++ b/docs/documentation/sitespeed.io/best-practice/index.md @@ -1,7 +1,7 @@ --- layout: default title: F.A.Q. and best practice using sitespeed.io -description: Here we keep questions that gets asked on our Slack channel or frequently on Github. +description: Here ewe keep questions that gets asked on our Slack channel or frequently on Github. keywords: best practice, faq nav: documentation category: sitespeed.io @@ -38,7 +38,7 @@ Since 7.2.0 the best way to add a cookie is by using --cookie name=value--preURL the browser starts, then access the preURL and then the URL you want to test within the same session and not clearing the cache. Use this if you want to measure more realistic metrics if your user first hit your start page and then another page (with responses in the cache if the URL has the correct cache headers). -If you use the --preScript feature, it is the same behavior, we don't clear the cache between preScript and the URL you want to test. +If you use the --preScript or --multi feature, it is the same behavior, we don't clear the cache between the URL you want to test. ### My pre/post script doesn't work? We use Selenium pre/post script navigation. You can [read more](/documentation/sitespeed.io/prepostscript/) about of our pre/post script setup and focus on the [debug section](/documentation/sitespeed.io/prepostscript/#debuglog-from-your-script) if you have any problem. @@ -129,7 +129,6 @@ You can also use the --urlAlias if you want to give the page a frie docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --useHash --urlAlias super --urlAlias duper https://www.sitespeed.io/#/super https://www.sitespeed.io/#/duper ~~~ - ## Servers What you should know before you choose where to run sitespeed.io. diff --git a/docs/documentation/sitespeed.io/browsers/index.md b/docs/documentation/sitespeed.io/browsers/index.md index 69a8ce055..fb477a267 100644 --- a/docs/documentation/sitespeed.io/browsers/index.md +++ b/docs/documentation/sitespeed.io/browsers/index.md @@ -91,7 +91,7 @@ When you add your command line switched you should skip the minus. For example: You can get the trace log from Chrome by adding ```--chrome.timeline```. Doing that you will see how much time the CPU spend in different categories and a trace log file that you can drag and drop into your devtools timeline. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --chrome.timeline https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --chrome.timeline https://www.sitespeed.io/ ~~~ You can also choose which Chrome trace categories you want to collect by adding ```--chrome.traceCategories``` to your parameters. @@ -108,15 +108,17 @@ You can choose which version of Chrome you want to run by using the ```--chrome. Our Docker container only contains one version of Chrome and [let us know](https://github.com/sitespeedio/sitespeed.io/issues/new) if you need help to add more versions. ## Choose when to end your test -By default the browser will collect data until [window.performance.timing.loadEventEnd happens + aprox 2 seconds more](https://github.com/sitespeedio/browsertime/blob/d68261e554470f7b9df28797502f5edac3ace2e3/lib/core/seleniumRunner.js#L15). That is perfectly fine for most sites, but if you do Ajax loading and you mark them with user timings, you probably want to include them in your test. Do that by changing the script that will end the test (--browsertime.pageCompleteCheck). When the scripts returns true the browser will close or if the timeout time is reached. +By default the browser will collect data until [window.performance.timing.loadEventEnd happens + aprox 5 seconds more](https://github.com/sitespeedio/browsertime/blob/d68261e554470f7b9df28797502f5edac3ace2e3/lib/core/seleniumRunner.js#L15). That is perfectly fine for most sites, but if you do Ajax loading and you mark them with user timings, you probably want to include them in your test. Do that by changing the script that will end the test (```--browsertime.pageCompleteCheck```). When the scripts returns true the browser will close or if the timeout time is reached. In this example we wait 10 seconds until the loadEventEnd happens, but you can also choose to trigger it at a specific event. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.pageCompleteCheck 'return (function() {try { return (Date.now() - window.performance.timing.loadEventEnd) > 10000;} catch(e) {} return true;})()' +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.pageCompleteCheck 'return (function() {try { return (Date.now() - window.performance.timing.loadEventEnd) > 10000;} catch(e) {} return true;})()' ~~~ -Yoy can also choose to end the test after 5 seconds of inactivity that happens after loadEventEnd. Do that by adding +You can also configure how long time your current check will wait until completing with ```--pageCompleteWaitTime```. By default the pageCompleteCheck waits for 5000 ms after the onLoad event to happen. If you want to increase that to 10 seconds use ```--pageCompleteWaitTime 10000```. This is also useful if you test with *pageCompleteCheckInactivity* and it takes long time for the server to respond, you can use the *pageCompleteWaitTime* to wait longer than the default value. + +You can also choose to end the test after 5 seconds of inactivity that happens after loadEventEnd. Do that by adding ```--browsertime.pageCompleteCheckInactivity``` to your run. The test will then wait for loadEventEnd to happen and no requests in the Resource Timing API the last 5 seconds. Be-aware though that the script will empty the resource timing API data for every check so if you have your own script collecting data using the Resource Timing API it will fail. If you add your own complete check you can also choose when your check is run. By default we wait until onLoad happens (by using pageLoadStrategy normal). If you want control direct after the navigation, you can get that by adding ```--pageLoadStrategy none``` to your run. @@ -129,7 +131,7 @@ Each javascript file need to return a metric/value which will be picked up and r For example say we have one file called scripts.js that checks how many scripts tags exist on a page. The script would look like this: -~~~ +~~~javascript (function() { return document.getElementsByTagName("script").length; })(); @@ -138,7 +140,7 @@ For example say we have one file called scripts.js that checks how many scripts Then to pick up the script, you would run it like this: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.script scripts.js -b firefox +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.script scripts.js -b firefox ~~~ You will get a custom script section in the Browsertime tab. @@ -156,7 +158,7 @@ Bonus: All custom scripts values will be sent to Graphite, no extra configuratio Visual metrics (Speed Index, Perceptual Speed Index, First and Last Visual Complete, and 85-95-99% Visual Complete) can be collected if you also record a video of the screen. If you use our Docker container you automagically get all what you need. Video and Visual Metrics is turned on by default. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ ~~~ On Android you need to follow [these instructions]({{site.baseurl}}/documentation/sitespeed.io/mobile-phones/#video-and-speedindex). diff --git a/docs/documentation/sitespeed.io/configuration/index.md b/docs/documentation/sitespeed.io/configuration/index.md index 45046307c..8a3a1c985 100644 --- a/docs/documentation/sitespeed.io/configuration/index.md +++ b/docs/documentation/sitespeed.io/configuration/index.md @@ -35,15 +35,16 @@ You can analyse a site either by crawling or by feeding sitespeed.io with a list The simplest way to run sitespeed.io is to give it a URL: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io ~~~ -If you want to test multiple URLs, just feed them: +If you want to test multiple URLs, then just add them. Each page will be tested with a new browser session, browser cache cleared between each URL. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io https://www.sitespeed.io/documentation/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io https://www.sitespeed.io/documentation/ ~~~ + You can also use a plain text file with one URL on each line. Create a file called urls.txt: ~~~ @@ -66,38 +67,46 @@ Aliases are great in combination with sending metrics to a TSDB (such as Graphit And run it: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} urls.txt +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} urls.txt ~~~ You can also add alias directly from the command line. Make yore that you pass on the same amount of alias and URLs. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --urlAlias doc https://www.sitespeed.io/documumentation/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --urlAlias doc https://www.sitespeed.io/documumentation/ ~~~ Pass on multiple --urlAlias for multiple alias/URLs. +If you want to test multiple URLs in a sequence (where the browser cache is not cleared) use --multi: + +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --multi https://www.sitespeed.io https://www.sitespeed.io/documentation/ +~~~ + +If you wanna do more complicated things like log in the user, add items to a cart etc, checkout [scripting](../scripting/). + ### Analyse by crawling If you want to find pages that are not so performant it's a good idea to crawl. Sitespeed.io will start with the URL and fetch all links on that page and continue to dig deeper into the site structure. You can choose how deep to crawl (1=only one page, 2=include links from first page, etc.): ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -d 2 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -d 2 ~~~ ### How many runs per URL? When collecting timing metrics, it's good to test the URL more than one time (default is three times). You can configure how many runs like this (five runs): ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -n 5 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -n 5 ~~~ ### Choose browser Choose which browser to use (default is Chrome): ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -b firefox +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io -b firefox ~~~ ### Connectivity @@ -111,13 +120,13 @@ You can set the viewport & user agent, so you can fake testing a site as a mobil The simplest way is to just add --mobile as a parameter. The viewport will be set to 360x640 and the user agent will be Iphone6. If you use Chrome it will use the preset Apple iPhone 6 device. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --mobile +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --mobile ~~~ You can also set a specific viewport and user agent: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.viewPort 400x400 --browsertime.userAgent "UCWEB/2.0 (MIDP-2.0; U; Adr 4.4.4; en-US; XT1022) U2/1.0.0 UCBrowser/10.6.0.706 U2/1.0.0 Mobile" +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --browsertime.viewPort 400x400 --browsertime.userAgent "UCWEB/2.0 (MIDP-2.0; U; Adr 4.4.4; en-US; XT1022) U2/1.0.0 UCBrowser/10.6.0.706 U2/1.0.0 Mobile" ~~~ Mobile testing is always best on actual mobile devices. You can [test on Android phones](../mobile-phones/) using sitespeed.io. @@ -129,12 +138,12 @@ In 4.1 we released support for recording a video of the browser screen and use t In 6.0 video and Visual Metrics is turned on by default, and if you want to turn them off you do like this: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --visualMetrics false https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --visualMetrics false https://www.sitespeed.io/ ~~~ ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --visualMetrics false --video false https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --visualMetrics false --video false https://www.sitespeed.io/ ~~~ @@ -142,14 +151,14 @@ docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io You can categorise requests as first or third parties by adding a regexp. You will then get the size & requests by type both in HTML and sent to Graphite. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --firstParty ".ryanair.com" https://www.ryanair.com/us/en/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --firstParty ".ryanair.com" https://www.ryanair.com/us/en/ ~~~ ### Output folder or where to store the result You can change where you want the data to be stored by setting the --outputFolder parameter. That is good in scenarios where you want to change the default behaviour and put the output in a specific location: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --outputFolder /my/folder ".ryanair.com" https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --outputFolder /my/folder ".ryanair.com" https://www.sitespeed.io/ ~~~ ### Configuration as JSON @@ -158,7 +167,7 @@ You can keep all your configuration in a JSON file and then pass it on to sitesp Create a config file and call it config.json: -~~~ +~~~json { "browsertime": { "iterations": 5, @@ -178,13 +187,13 @@ Create a config file and call it config.json: Then, run it like this: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --config config.json https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --config config.json https://www.sitespeed.io ~~~ If you want to override and run the same configuration but using Firefox, you just override with the CLI parameter: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --config config.json -b firefox https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --config config.json -b firefox https://www.sitespeed.io ~~~ The CLI will always override the JSON config. @@ -195,17 +204,17 @@ The CLI will always override the JSON config. You can send the result of a run to Slack. First, set up a webhook in the Slack API (https://.slack.com/apps/manage/custom-integrations) and then configure it: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --slack.hookUrl https://hooks.slack.com/services/YOUR/HOOK/URL +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --slack.hookUrl https://hooks.slack.com/services/YOUR/HOOK/URL ~~~ You can choose to send just a summary (the summary for all runs), individual runs (with URL), only errors, or everything, by choosing the respective slack.type. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --slack.hookUrl https://hooks.slack.com/services/YOUR/HOOK/URL --slack.type summary +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --slack.hookUrl https://hooks.slack.com/services/YOUR/HOOK/URL --slack.type summary ~~~ ![Slack]({{site.baseurl}}/img/slack.png) {: .img-thumbnail-center} ### Log in the user -We have added a [special section](../prepostscript) for that! +We have added a [special section](../scripting) for that! diff --git a/docs/documentation/sitespeed.io/connectivity/index.md b/docs/documentation/sitespeed.io/connectivity/index.md index 2605e7ad4..37f12733f 100644 --- a/docs/documentation/sitespeed.io/connectivity/index.md +++ b/docs/documentation/sitespeed.io/connectivity/index.md @@ -23,7 +23,7 @@ You can throttle the connection to make the connectivity slower to make it easie ### Docker networks Here's an full example to setup up Docker network bridges on a server that has tc installed: -~~~bash +~~~shell #!/bin/bash echo 'Starting Docker networks' docker network create --driver bridge --subnet=192.168.33.0/24 --gateway=192.168.33.10 --opt "com.docker.network.bridge.name"="docker1" 3g @@ -61,7 +61,7 @@ docker run --shm-size=1g --network=3g --rm sitespeedio/sitespeed.io:{% include v And if you want to remove the networks: -~~~bash +~~~shell #!/bin/bash echo 'Stopping Docker networks' docker network rm 3g @@ -87,9 +87,15 @@ sitespeed.io --browsertime.connectivity.engine throttle -c cable https://www.sit You can also use Throttle inside of Docker but then the host need to be the same OS as in Docker. In practice you can only use it on Linux. And then make sure to run *sudo modprobe ifb numifbs=1* first and give the container the right privileges *--cap-add=NET_ADMIN*. +Firt use modprobe: + +~~~bash +sudo modprobe ifb numifbs=1 ~~~ -$ sudo modprobe ifb numifbs=1 -$ docker run --cap-add=NET_ADMIN --shm-size=1g --rm sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -c 3g --browsertime.connectivity.engine=throttle https://www.sitespeed.io/ + +And then then make user you use the right privileges: +~~~bash +docker run --cap-add=NET_ADMIN --rm sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -c 3g --browsertime.connectivity.engine=throttle https://www.sitespeed.io/ ~~~ diff --git a/docs/documentation/sitespeed.io/docker/index.md b/docs/documentation/sitespeed.io/docker/index.md index 244d35632..4e473f3a2 100644 --- a/docs/documentation/sitespeed.io/docker/index.md +++ b/docs/documentation/sitespeed.io/docker/index.md @@ -24,10 +24,10 @@ We have a ready made container with [Chrome, Firefox & Xvfb](https://hub.docker. ### Structure The Docker structure looks like this: -[NodeJS with Ubuntu 17](https://github.com/sitespeedio/docker-node) -> [VisualMetrics dependencies](https://github.com/sitespeedio/docker-visualmetrics-deps) -> +[NodeJS with Ubuntu 18](https://github.com/sitespeedio/docker-node) -> [VisualMetrics dependencies](https://github.com/sitespeedio/docker-visualmetrics-deps) -> [Firefox/Chrome/xvfb](https://github.com/sitespeedio/docker-browsers) -> [sitespeed.io](https://github.com/sitespeedio/sitespeed.io/blob/master/Dockerfile) -The first container installs NodeJS (latest LTS) on Ubuntu 17. The next one adds the dependencies (FFMpeg, ImageMagick and some Python libraries) needed to run [VisualMetrics](https://github.com/WPO-Foundation/visualmetrics). We then install specific version of Firefox, Chrome and lastly xvfb. Then in last step, we add sitespeed.io and tag it to the sitespeed.io version number. +The first container installs NodeJS (latest LTS) on Ubuntu 18. The next one adds the dependencies (FFMpeg, ImageMagick and some Python libraries) needed to run [VisualMetrics](https://github.com/WPO-Foundation/visualmetrics). We then install specific version of Firefox, Chrome and lastly xvfb. Then in last step, we add sitespeed.io and tag it to the sitespeed.io version number. We lock down the browsers to specific versions for maximum compatibility and stability with sitespeed.io's current feature set; upgrading once we verify browser compatibility. {: .note .note-info} @@ -37,7 +37,7 @@ We lock down the browsers to specific versions for maximum compatibility and sta The simplest way to run using Chrome: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b chrome https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b chrome https://www.sitespeed.io/ ~~~ Note: The shm-size increases the memory for the GPU (default is 64mb and that is too small) see [https://github.com/elgalu/docker-selenium/issues/20](https://github.com/elgalu/docker-selenium/issues/20). @@ -45,13 +45,13 @@ Note: The shm-size increases the memory for the GPU (default is 64mb and that is In the real world you should always specify the exact version (tag) of the Docker container to make sure you use the same version for every run. If you use the latest tag you will download newer version of sitespeed.io as they become available, meaning you can have major changes between test runs (version upgrades, dependencies updates, browser versions, etc). So you should always specify a tag after the container name(X.Y.Z). Know that the tag/version number will be the same number as the sitespeed.io release: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b chrome https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b chrome https://www.sitespeed.io/ ~~~ If you want to use Firefox: ~~~bash -docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:X.Y.Z -b firefox https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b firefox https://www.sitespeed.io/ ~~~ Using `-v "$(pwd)":/sitespeed.io` will map the current directory inside Docker and output the result directory there. @@ -112,7 +112,7 @@ The docker containers have `x11vnc` installed which enables visualisation of the - You will need to run the sitespeed.io image by exposing a PORT for vnc server. By default this port is 5900. If you plan to change your port for VNC server, then you need to expose that port. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io -p 5900:5900 sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ -b chrome +docker run --rm -v "$(pwd)":/sitespeed.io -p 5900:5900 sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ -b chrome ~~~ - Find the container id of the docker container for sitespeed by running: diff --git a/docs/documentation/sitespeed.io/graphite/index.md b/docs/documentation/sitespeed.io/graphite/index.md index fe7378147..3bb5bf4a3 100644 --- a/docs/documentation/sitespeed.io/graphite/index.md +++ b/docs/documentation/sitespeed.io/graphite/index.md @@ -35,7 +35,7 @@ Starting from sitespeed.io version 4 we send a moderated number of metrics per U When you store metrics for a URL in Graphite, you decide from the beginning how long and how often you want to store the data, in [storage-schemas.conf](https://github.com/sitespeedio/docker-graphite-statsd/blob/master/conf/graphite/storage-schemas.conf). In our example Graphite setup, every key under sitespeed_io is caught by the configuration in storage-schemas.conf that looks like: -~~~ +~~~shell [sitespeed] pattern = ^sitespeed_io\. retentions = 10m:60d,30m:90d diff --git a/docs/documentation/sitespeed.io/index.md b/docs/documentation/sitespeed.io/index.md index b1baff882..70de9928f 100644 --- a/docs/documentation/sitespeed.io/index.md +++ b/docs/documentation/sitespeed.io/index.md @@ -9,33 +9,38 @@ image: https://www.sitespeed.io/img/sitespeed-2.0-twitter.png twitterdescription: Documentation for sitespeed.io. --- -# Documentation v7 +# Documentation v8 sitespeed.io logo Sitespeed.io is the complete toolbox to test the web performance of your web site. Use it to monitor your performance or checkout how your competition is doing. You can see all the latest changes in the [Changelog](https://github.com/sitespeedio/sitespeed.io/blob/master/CHANGELOG.md) for the project. +## Start * [Introduction](introduction/) - start here if you are new to the project or web performance testing. * [Installation](installation/) - install using npm, yarn or run our Docker containers. - * [Configuration](configuration/) - there's a lot of things you can do with sitespeed.io, lets checkout how! * [Browsers](browsers/) - collect timings using real browsers. We support Firefox, Chrome and Chrome on Android. + * [Configuration](configuration/) - there's a lot of things you can do with sitespeed.io, lets checkout how! * [Connectivity](connectivity/) - set the connectivity to emulate real users network conditions. - * [Performance Dashboard](performance-dashboard/) - keep track of your metrics and performance. - * [Alerts](alerts/) - send alerts (email/Slack/PagerDuty etc) when you get a performance regression. + * [Docker](docker/) - how to use our Docker containers. * [F.A.Q and Best Practice](best-practice/) - here we keep track of questions we get in Slack. + * [Scripting](scripting/) - test a user journey, test multiple URLs, test login, test adding items to the cart with scripting. + +## More details + * [Alerts](alerts/) - send alerts (email/Slack/PagerDuty etc) when you get a performance regression. + * [Continuous Integration](continuous-integration/) - generate JUnit XML/TAP and use Jenkins, Circle CI, Gitlab CI, Grunt or the Gulp plugin. + * [Developers](developers/) - start here when you want to do PRs or create a plugin. + * [Graphite](graphite/) - how to configure and store your metrics in Graphite (and using StatsD). + * [How to Write a Good Bug Report](bug-report/) - if you write a good bug report, we can spend more time helping you fixing the problem instead of asking you questions + * [Lighthouse](lighthouse/) - run Lighthouse and Google PageSpeed Insights from sitespeed.io. + * [Metrics](metrics/) - configure which metrics you want to use. + * [Mobile phones](mobile-phones/) - test using your mobile phone (Android only). * [Performance Budget](performance-budget/) - make sure you are within your performance budget. + * [Performance Dashboard](performance-dashboard/) - keep track of your metrics and performance. * [Plugins](plugins/) - list/disable/enable or create your own plugin. * [Pre/post scripting](prepostscript/) - run Selenium scripts before/after you test a URL. * [Setup S3](s3/) - how to setup S3 for your html result/videos and screenshots. - * [Metrics](metrics/) - configure which metrics you want to use. - * [Continuous Integration](continuous-integration/) - generate JUnit XML/TAP and use Jenkins, Circle CI, Gitlab CI, Grunt or the Gulp plugin. - * [Docker](docker/) - how to use our Docker containers. - * [Graphite](graphite/) - how to configure and store your metrics in Graphite (and using StatsD). + * [Single Page Application](spa/) - how to test your single page application. * [Video](video/) - all that you can do with the video. - * [Upgrade](upgrade/) - upgrading from 5.x to 6.0 check out our guide here. - * [Mobile phones](mobile-phones/) - test using your mobile phone (Android only). - * [WebPageTest](webpagetest/) - drive WebPageTest and fetch metrics and graph them. - * [Lighthouse](lighthouse/) - run Lighthouse and Google PageSpeed Insights from sitespeed.io. * [WebPageReplay](webpagereplay/) - WebPageReplay is proxy that first records your web site and then replay it locally. That can help you find performance regression in the front-end code easier: Latency/server timings are constant. - * [Developers](developers/) - start here when you want to do PRs or create a plugin. - * [How to Write a Good Bug Report](bug-report/) - if you write a good bug report, we can spend more time helping you fixing the problem instead of asking you questions. + * [WebPageTest](webpagetest/) - drive WebPageTest and fetch metrics and graph them. + diff --git a/docs/documentation/sitespeed.io/installation/index.md b/docs/documentation/sitespeed.io/installation/index.md index 255501c22..c889c0579 100644 --- a/docs/documentation/sitespeed.io/installation/index.md +++ b/docs/documentation/sitespeed.io/installation/index.md @@ -21,7 +21,7 @@ You can run sitespeed.io using our Docker containers or using NodeJS. ## Docker -We have [Docker images](https://hub.docker.com/r/sitespeedio/sitespeed.io/) with sitespeed.io, Chrome, Firefox and Xvfb. It is super easy to use (Xvfb is started automatically when you start the container). Here's how to use the container with both Firefox & Chrome (install [Docker](https://docs.docker.com/engine/installation/) first). +We have [Docker images](https://hub.docker.com/r/sitespeedio/sitespeed.io/) with sitespeed.io, Chrome, Firefox, Xvfb and all the software needed for recording a video of the browser screen and analyze it to get Visual Metrics. It is super easy to use). Here's how to use the container with both Firefox & Chrome (install [Docker](https://docs.docker.com/install/) first). ### Mac & Linux diff --git a/docs/documentation/sitespeed.io/metrics/index.md b/docs/documentation/sitespeed.io/metrics/index.md index e76cb70ea..73b4fd514 100644 --- a/docs/documentation/sitespeed.io/metrics/index.md +++ b/docs/documentation/sitespeed.io/metrics/index.md @@ -31,7 +31,7 @@ The summary holds information per group, or specifically per domain. If you test You can list the metrics that are configured by **\-\-metrics.filterList**. The list is dependent on which plugins you are loading, so you will need to do an actual run to generate the list. The list is stored in the data folder in a file named **configuredMetrics.txt**. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io --metrics.filterList +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --metrics.filterList ~~~ The file will look something like this: @@ -53,7 +53,7 @@ browsertime.pageSummary.statistics.custom.* You can also list all possible metrics that you can send. You can do that by using **\-\-metrics.list**. It will generate a text file named **metrics.txt** in the data folder. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io --metrics.list +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --metrics.list ~~~ @@ -87,7 +87,7 @@ coach.pageSummary.advice.performance.adviceList.thirdPartyAsyncJs.weight The score is ... yes the score and the weight is how important it is. You probably only need the score, so setting a filter like this **coach.pageSummary.advice.performance.adviceList.\*.score** will send them all (setting a wildcard for the name). ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io --metrics.filter coach.pageSummary.advice.performance.adviceList.*.score -n 1 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --metrics.filter coach.pageSummary.advice.performance.adviceList.*.score -n 1 ~~~ The best way to test and verify on your local, is to checkout the sitespeed.io project and then start a TCP server that logs everything: @@ -105,7 +105,7 @@ $ Server listening on :::52860 It will output the port, so you can then use it when you run sitespeed.io: ~~~bash -docker run --net host --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --metrics.list https://www.sitespeed.io -n 1 --metrics.filter coach.pageSummary.advice.performance.adviceList.*.score --graphite.host 127.0.0.1 --graphite.port 52860 +docker run --net host --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --metrics.list https://www.sitespeed.io -n 1 --metrics.filter coach.pageSummary.advice.performance.adviceList.*.score --graphite.host 127.0.0.1 --graphite.port 52860 ~~~ The the previous example it will log all metrics you send to Graphite to the console. @@ -114,7 +114,7 @@ The the previous example it will log all metrics you send to Graphite to the con By default the total score for performance, accessibility and best practice is configured to send to Graphite. Previously we looked at sending all the score for the performance advice. If you want to send all the scores for all advice, you can do that easily, by adding all three categories in the CLI: -~~~ +~~~shell --metrics.filter coach.pageSummary.advice.performance.adviceList.*.score coach.pageSummary.advice.bestpractice.adviceList.*.score coach.pageSummary.advice.accessibility.adviceList.*.score ~~~ @@ -140,5 +140,5 @@ Sitespeed.io does not currently have support removal of a single metric, but you remove all configured metrics with the parameter value *\*-*. Here is an example sending only the **coach.pageSummary.advice.performance.adviceList.\*.score** metrics. ~~~bash -docker run --net host --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --metrics.list https://www.sitespeed.io -n 1 --metrics.filter *- coach.pageSummary.advice.performance.adviceList.*.score --graphite.host 127.0.0.1 --graphite.port 52860 +docker run --net host --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --metrics.list https://www.sitespeed.io -n 1 --metrics.filter *- coach.pageSummary.advice.performance.adviceList.*.score --graphite.host 127.0.0.1 --graphite.port 52860 ~~~ diff --git a/docs/documentation/sitespeed.io/mobile-phones/index.md b/docs/documentation/sitespeed.io/mobile-phones/index.md index 31dbb8a91..a82645c43 100644 --- a/docs/documentation/sitespeed.io/mobile-phones/index.md +++ b/docs/documentation/sitespeed.io/mobile-phones/index.md @@ -45,7 +45,7 @@ sitespeed.io --browsertime.chrome.android.package com.android.chrome https://www Remember: To test on Android using Docker you need to be on Linux (tested on Ubuntu). It will not work on OS X. ~~~bash -docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 1 --browsertime.chrome.android.package com.android.chrome --browsertime.xvfb false https://www.sitespeed.io +docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 1 --browsertime.chrome.android.package com.android.chrome --browsertime.xvfb false https://www.sitespeed.io ~~~ You will get result as you would with running this normally with summaries and waterfall graphs. @@ -72,7 +72,7 @@ sitespeed.io --browsertime.chrome.android.package com.android.chrome --video --s And using Docker (remember: only works in Linux hosts): ~~~bash -docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 1 --browsertime.chrome.android.package com.android.chrome --browsertime.xvfb false https://www.sitespeed.io +docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 1 --browsertime.chrome.android.package com.android.chrome --browsertime.xvfb false https://www.sitespeed.io ~~~ If you want to run Docker on Mac OS X, you can follow Appiums [setup](https://github.com/appium/appium-docker-android) by creating a docker-machine, give ut USB access and then run the container from that Docker machine. diff --git a/docs/documentation/sitespeed.io/performance-budget/index.md b/docs/documentation/sitespeed.io/performance-budget/index.md index c5f5b93d0..bae795990 100644 --- a/docs/documentation/sitespeed.io/performance-budget/index.md +++ b/docs/documentation/sitespeed.io/performance-budget/index.md @@ -25,12 +25,10 @@ When you run sitespeed.io configured with a budget, the script will exit with an The log will look something like this: -~~~ -[2016-10-24 10:53:01] Failing budget pagexray.pageSummary.transferSize for https://www.sitespeed.io/ with value 184.7 KB max limit 97.7 KB -[2016-10-24 10:53:01] Failing budget pagexray.pageSummary.contentTypes.image.transferSize for https://www.sitespeed.io/ with value 157.3 KB max limit 97.7 KB -[2016-10-24 10:53:01] Failing budget coach.pageSummary.advice.info.domElements for https://www.sitespeed.io/ with value 215 max limit 200 -[2016-10-24 10:53:01] Failing budget coach.pageSummary.advice.info.domDepth.max for https://www.sitespeed.io/ with value 11 max limit 10 -[2016-10-24 10:53:01] Budget: 8 working and 4 failing tests +~~~shell +[2019-01-20 19:58:18] ERROR: Failing budget timings.firstPaint for https://www.sitespeed.io/documentation/ with value 462 ms max limit 100 ms +[2019-01-20 19:58:18] ERROR: Failing budget size.total for https://www.sitespeed.io/documentation/ with value 23.6 KB max limit 1000 B +[2019-01-20 19:58:18] INFO: Budget: 3 working and 2 failing tests ~~~ @@ -38,17 +36,103 @@ The report looks like this. ![Example of the budget]({{site.baseurl}}/img/budget.png) {: .img-thumbnail} -Now let's see how you configure budgets. - - ### The budget file -The current version can handle min/max values and works on the internal data structure. +In 8.0 we introduced a new way of configuring budget. You can configure default values and specific for a URL. In the budget file there are 5 couple of sections: + +* timings - are Visual and technical metrics and are configured in milliseconds (ms) +* requests - the max number of requests per type or total +* transferSize - the max transfer size (over the wire) per type or total +* thirdPatrty - max number of requests or trasnferSize for third parties +* score - minimum score for Coach advice + + +#### Simple budget file +The simplest version of a budget file that will check for SpeedIndex higher than 1000 ms looks like this: + +~~~json +{ + "budget": { + "timings": { + "SpeedIndex":1000 + } + } +} +~~~ + +#### Override per URL +All URLs that you test then needs to have a SpeedIndex faster than 1000. But if you have one URL that you know are slower? You can override budget per URL. + +~~~json +{ + "budget": { + "https://www.sitespeed.io/documentation/": { + "timings": { + "SpeedIndex": 3000 + } + }, + "timings": { + "SpeedIndex":1000 + } + } +} +~~~ + +#### Full example + +Here is an example of a fully configurued budget file. It shows you what yiou *can* configure (but you shouldn't configure all of them). + + +~~~json +{ +"budget": { + "timings": { + "firstPaint": 1000, + "fullyLoaded": 2000, + "FirstVisualChange": 1000, + "LastVisualChange": 1200, + "SpeedIndex": 1200, + "PerceptualSpeedIndex":1200, + "VisualReadiness": 200, + "VisualComplete95": 1190 + }, + "requests": { + "total": 89, + "html": 1, + "javascript": 0, + "css": 1, + "image": 50, + "font": 0 + }, + "transferSize": { + "total": 400000, + "html": 20000, + "javascript": 0, + "css": 10000, + "image": 200000, + "font": 0 + }, + "thirdParty": { + "transferSize": 0, + "requests": 0 + }, + "score": { + "accessibility": 100, + "bestpractice": 100, + "privacy": 100, + "performance": 100 + } + } +} +~~~ + +#### Budget configuration using the internal data structrure +There's also an old version of settiung a budget where you can do it for all metrics collected by sitespeed.io and works on the internal data structure. You can read more about the metrics/data structure in the [metrics section]({{site.baseurl}}/documentation/sitespeed.io/metrics/). -~~~ +~~~json { "browsertime.pageSummary": [{ "metric": "statistics.timings.firstPaint.median", @@ -98,7 +182,7 @@ You can read more about the metrics/data structure in the [metrics section]({{si Then run it like this: ~~~bash -$ docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io/ --budget.configPath myBudget.json -b chrome -n 11 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --budget.configPath myBudget.json -b chrome -n 11 ~~~ And, if the budget fails, the exit status will be > 0. You can also choose to report the budget as JUnitXML (Jenkins) or TAP. @@ -107,7 +191,7 @@ And, if the budget fails, the exit status will be > 0. You can also choose to re You can output a JUnit XML file from the budget result like this: ~~~bash -$ docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io/ --budget.configPath myBudget.json --budget.output junit -b chrome -n 5 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --budget.configPath myBudget.json --budget.output junit -b chrome -n 5 ~~~ It will create a *junit.xml* in the outputFolder. @@ -116,7 +200,7 @@ It will create a *junit.xml* in the outputFolder. If you would instead like to use TAP, you can do so like this: ~~~bash -$ docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io https://www.sitespeed.io/ --budget.configPath myBudget.json --budget.output tap -b chrome -n 5 +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io/ --budget.configPath myBudget.json --budget.output tap -b chrome -n 5 ~~~ It will create a *budget.tap* in the outputFolder. diff --git a/docs/documentation/sitespeed.io/performance-dashboard/index.md b/docs/documentation/sitespeed.io/performance-dashboard/index.md index 93245f68c..636052bee 100644 --- a/docs/documentation/sitespeed.io/performance-dashboard/index.md +++ b/docs/documentation/sitespeed.io/performance-dashboard/index.md @@ -98,7 +98,7 @@ We have a small shell script that runs the tests. It is triggered from the cron Our *run.sh* file (we read which URLs we want to test from files): ## Shell script -~~~ +~~~shell #!/bin/bash # Specify the exact version of sitespeed.io. When you upgrade to the next version, pull it down and the chage the tag DOCKER_CONTAINER=sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} @@ -128,7 +128,7 @@ docker pull $DOCKER_CONTAINER ## Crontab We trigger the script from the crontab. We run the script every hour. -~~~ +~~~shell SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 * * * * /root/runs.sh >> /tmp/sitespeed.io.log 2>&1 @@ -137,7 +137,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ## Infinite loop Another way is to just run the script in an infinite loop and then have a file that you remove (so the run stops) when you want to update your instance. This example script is on Ubuntu. -~~~ +~~~shell #!/bin/bash LOGFILE=/tmp/s.log exec > $LOGFILE 2>&1 @@ -192,20 +192,20 @@ done And make sure the script start on server restart. Edit the crontab crontab -e and add (loop.sh is the name of your loop script file): -~~~ +~~~shell @reboot rm /home/ubuntu/sitespeed.run;/home/ubuntu/loop.sh ~~~ And start it like this: -~~~ +~~~bash nohup /home/ubuntu/loop.sh & ~~~ ## default.json And our default configuration is in *default.json*: -~~~ +~~~json { "browsertime": { "connectivity": { @@ -243,7 +243,7 @@ And our default configuration is in *default.json*: ## Docker networks And we set up the following Docker networks (*startNetworks.sh*): -~~~ +~~~shell #!/bin/bash echo 'Starting Docker networks' docker network create --driver bridge --subnet=192.168.33.0/24 --gateway=192.168.33.10 --opt "com.docker.network.bridge.name"="docker1" 3g diff --git a/docs/documentation/sitespeed.io/plugins/index.md b/docs/documentation/sitespeed.io/plugins/index.md index 0b0ee5b87..7b746655a 100644 --- a/docs/documentation/sitespeed.io/plugins/index.md +++ b/docs/documentation/sitespeed.io/plugins/index.md @@ -24,7 +24,7 @@ The most basic things you can do is list configured plugins (which are currently You can list the plugins that will be used when you do a run: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --plugins.list https://en.wikipedia.org/wiki/Barack_Obama +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --plugins.list https://en.wikipedia.org/wiki/Barack_Obama ~~~ And you will get a log entry that looks something like this: @@ -41,19 +41,19 @@ The default plugins lives in the [plugin folder](https://github.com/sitespeedio/ You can remove/disable default plugins if needed. For instance you may not want to output HTML and strictly send the data to Graphite. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html ~~~ If you want to disable multiple plugins say you don't need the html or screenshots: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html --plugins.remove screenshot +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html --plugins.remove screenshot ~~~ At anytime if you want to verify that disabling worked, add the plugins.list to your command: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html --plugins.remove screenshot --plugins.list +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.remove html --plugins.remove screenshot --plugins.list ~~~ ## Add a plugin @@ -62,7 +62,7 @@ You can also add a plugin. This is great if you have plugins you created yoursel There's a plugin bundled with sitespeed.io called *analysisstorer* plugin that isn't enabled by default. It stores the original JSON data from all analyzers (from Browsertime, Coach data, WebPageTest etc) to disk. You can enable this plugin: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.add analysisstorer +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://www.sitespeed.io --plugins.add analysisstorer ~~~ If you want to run plugins that you created yourself or that are shared from others, you can either install the plugin using npm (locally) and load it by name or point out the directory where the plugin lives. @@ -73,7 +73,7 @@ If you want to run plugins that you created yourself or that are shared from oth If you run in Docker and you should. You will need to mount your plugin directory as a volume. This is the recommended best practice. Practically you should clone your repo on your server and then mount it like this. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b firefox --plugins.add /sitespeed.io/myplugin -n 1 https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -b firefox --plugins.add /sitespeed.io/myplugin -n 1 https://www.sitespeed.io/ ~~~ ### Relative using NodeJS @@ -86,7 +86,7 @@ sitespeed.io https://www.sitespeed.io --plugins.add ../my/super/plugin ### Pre-baked Docker file If you want to create an image of sitespeed.io with your plugins pre-baked for sharing you can also do so using the following Dockerfile. -~~~ +~~~docker FROM sitespeedio/sitespeed.io: ENV SITESPEED_IO_PLUGINS__ADD /my-custom-plugin @@ -111,7 +111,7 @@ docker build -t my-custom-sitespeedio . Finally you can run it the same way as mentioned above without the volume mount and without adding your plugin (that was automatically fixed in your Docker file). ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io my-custom-sitespeedio -b firefox --my-custom-plugin.option test -n 1 https://www.sitespeed.io/ +docker run --rm -v "$(pwd)":/sitespeed.io my-custom-sitespeedio -b firefox --my-custom-plugin.option test -n 1 https://www.sitespeed.io/ ~~~ Pretty cool, huh? :-) @@ -159,7 +159,7 @@ The open function is called once when sitespeed.io starts, it's in this function The *context* holds information for this specific run that generated at runtime and looks like this: -~~~ +~~~javascript { storageManager, // The storage manager is what you use to store data to disk resultUrls, @@ -193,7 +193,7 @@ When you start the application and feed it with URLs, each URL will generate a m If you want to catch it, you can do something like this: -~~~ +~~~javascript switch (message.type) { case 'url': { @@ -205,7 +205,7 @@ When you are finished analysing the URL, your plugin can then send a message wit Here's a snippet of Browsertime sending the screenshots message (the actual screenshot is in *results.screenshots*): -~~~ +~~~javascript const messageMaker = context.messageMaker; ... @@ -217,7 +217,7 @@ queue.postMessage(make('browsertime.screenshot', results.screenshots, { If you want to send messages from within your plugin, you get it from the context. -~~~ +~~~javascript const messageMaker = context.messageMaker; ~~~ @@ -241,7 +241,7 @@ You get the log object in the context object (so there's no need to require the In the [open](#opencontext-options) function you can add something like this: -~~~ +~~~javascript // Register a logger for this plugin, a unique name so we can filter the log // And save the log for later this.log = context.intel.getLogger('sitespeedio.plugin.PLUGIN_NAME'); @@ -264,7 +264,7 @@ You start by listening to the generic setup message **sitespeedio.setup**. When Sending a pug looks something like this: -~~~ +~~~javascript case 'sitespeedio.setup': { queue.postMessage( make('html.pug', { @@ -285,7 +285,7 @@ The HTML plugin will automatically pickup data sent with the types of \*.run and A message can look like this (the HTML plugin will pickup messages sent by combining the id + type): -~~~ +~~~javascript queue.postMessage( make('gpsi.pageSummary', result, { url, @@ -303,7 +303,7 @@ collect metrics. You do that by in the setup phase, send the JavaScript you want to run to sitespeed.io -~~~ +~~~javascript case 'sitespeedio.setup': { queue.postMessage( make('browsertime.scripts', { @@ -322,7 +322,7 @@ You can also let Browsertime run asynchronous scripts, follow the same pattern a You can then get the metrics back by listening on **browsertime.run** messages. -~~~ +~~~javascript case 'browsertime.run': { console.log(message.data.yourplugin); break; @@ -331,7 +331,7 @@ case 'browsertime.run': { And if you want to use it in your pug template you will find it under **pageInfo.data.browsertime.run.yourplugin**. In this example, if you want to print the title you can do like this. -~~~ +~~~javascript #{pageInfo.data.browsertime.run.yourplugin.title} ~~~ @@ -341,7 +341,7 @@ In the *sitespeedio.config* phase (where plugins can talk to each other) make su In this example we tell the budget plugin that it should collect metrics of the type *gpsi.pagesummary*. -~~~ +~~~javascript const messageMaker = context.messageMaker; ... diff --git a/docs/documentation/sitespeed.io/prepostscript/index.md b/docs/documentation/sitespeed.io/prepostscript/index.md index a4e613a1e..dec3195b0 100644 --- a/docs/documentation/sitespeed.io/prepostscript/index.md +++ b/docs/documentation/sitespeed.io/prepostscript/index.md @@ -17,106 +17,71 @@ twitterdescription: Pre/post scripts (log in the user) {:toc} # Selenium +Since sitespeed.io 8.0 the pre/post script has changed. You probably should use just [a script to navigate](../scripting/). + Before sitespeed.io loads and tests a URL you can run your own Selenium script. Do you want to access a URL and pre-load the cache or maybe you want to login as a user and then measure a URL? We use the NodeJs version of Selenium, you can find the [API documentation here](http://seleniumhq.github.io/selenium/docs/api/javascript/index.html). You need to go into the docs to see how to select the elements you need to do the magic on your page. Your script needs to follow a specific pattern to be able to run as a pre/post script. The simplest version of a script looks like this: -~~~ -module.exports = { - run(context) { - return context.runWithDriver((driver) => { - // Add your own code here - }); - } -}; +~~~javascript +module.exports = async function(context, commands) { + // add your own code here +} ~~~ Move on to read about the data that is passed in the context object and how you can use it to get hold of the Selenium objects you need to interact with the page. ## Data to the pre/post script -Your pre/post script is fed with the Selenium **driver** (that you use if you need to navigate to a page) and a batch of other objects in the context object. +Your script will get access to two objects: The *context* object that holds information about the current run and the *commands* object that has commands/shortcuts to navigate in the page, -~~~ - const context = { - url, - options, - log, - storageManager: this.storageManager, - taskData: {}, - index, - webdriver, - runWithDriver: function(driverScript) { - return browser.runWithDriver(driverScript); - } - }; -~~~ +The context object: +* *options* - All the options sent from the CLI to Browsertime. +* *log* - an instance to the log system so you can log from your navigation script. +* *index* - the index of the runs, so you can keep track of which run that is running. +* *storageManager* - The Browsertime storage manager that can help you get read/store files to disk. +* *selenium.webdriver* - The Selenium [WebDriver public API object](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html). +* *selenium.driver* - The [instantiated version of the WebDriver](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html) driving the current version of the browser. -The important objects that you can use are: -* *url* - The URL of the page that you are going to test -* *options* - The options object that is created from the CLI. Here you can get hold of all paramaters you pass on to sitespeed.io -* *log* - this is the internal log object we use in sitespeed.io to write the log output. We use [intel](https://www.npmjs.com/package/intel) for logging. -* *index* - which index of the runs (first, second etc). -* *webdriver* - the Selenium [Webdriver object](http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html) that is the way to get hold of the Selenium objects that you need. + +The commands object: +* *navigate(URL)* - Use this if you want to use the exact way as Browsertime navigates to a new URL (same settings with pageCompleteCheck etc). But that URL will not be measured automatically. +* *measure.start(URL)* - Start measuring and navigate to a new page in one go and measure. +* *measure.start(URL,alias)* - Start measuring and navigate to a new page in one go and measure. And register an alias for that URL. +* *measure.start()* - Use this when you want to start to measure a page. This will start the video and prepare everything to collect metrics. But it will not navigate to the URL. +* *measure.start(alias)* - Use this when you want to start to measure a page. This will start the video and prepare everything to collect metrics. But it will not navigate to the URL. The next URL that will be accessed will get the alias. +* *measure.stop()* - Collect metrics for a page. ## Debug/log from your script In your script you can get hold of the log object from sitespeed.io. This is super useful when you want to test your script and verify that everything works as it should. We use [intel](https://www.npmjs.com/package/intel) for logging. -~~~ -module.exports = { - run(context) { - return context.runWithDriver((driver) => { - // Simple example to add a log message - // Remember that you can log message on different levels - context.log.info('Log message from the task'); - }); - } +~~~javascript +module.exports = async function(context, commands) { + // Simple example to add a log message + // Remember that you can log message on different levels + context.log.info('Log message from the task'); }; ~~~ -If you run in Docker it can sometimes be hard to see/know what happens. To verify that your pre/post script works as they should (and the page loads as you think), you can enable a video of the full run (pre/post scripts and the test). Do that by adding: --browsertime.videoParams.combine - -Then your video will include all your steps. Perfect for debugging. - -You need to have video turned on (in Docker it is on by default) to be able to combine the video. -{: .note .note-warning} - ## Login example Create a script where you login the user. The following is an example to login the user at Wikipedia. Start by creating a file login.js with the following. -~~~ -module.exports = { - run(context) { - return context.runWithDriver((driver) => { - // Go to Wikipedias login URL - return driver.get('https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page') - .then(() => { - // You need to find the form, the login input fields and the - // password field. Just add you name and password and submit the form - // For more docs, checkout the NodeJS Selenium version - // http://seleniumhq.github.io/selenium/docs/api/javascript/index.html +~~~javascript +module.exports = async function(context, commands) { + await commands.navigate( + 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page' + ); + // Add text into an input field y finding the field by id + await commands.addText.byId('login', 'wpName1'); + await commands.addText.byId('password', 'wpPassword1'); - // we fetch the selenium webdriver from context - const webdriver = context.webdriver; - // and get hold of some goodies we want to use - const until = webdriver.until; - const By = webdriver.By; + // find the sumbit button and click it + await commands.click.byIdAndWait('wpLoginAttempt'); - // before you start, make your username and password - const userName = 'YOUR_USERNAME_HERE'; - const password = 'YOUR_PASSWORD_HERE'; - const loginForm = driver.findElement(By.name('userlogin')); - driver.findElement(By.id('wpName1')).sendKeys(userName); - driver.findElement(By.id('wpPassword1')).sendKeys(password); - const loginButton = driver.findElement(webdriver.By.id('wpLoginAttempt')); - loginButton.click(); - // we wait for something on the page that verifies that we are logged in - return driver.wait(until.elementLocated(By.id('pt-userpage')), 3000); - }); - }) - } + // we wait for something on the page that verifies that we are logged in + return commands.wait.byId('pt-userpage',3000); }; ~~~ @@ -126,55 +91,22 @@ Make sure to change the username & password if you try this on Wikipedia. And of Then run it like this: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --preScript /sitespeed.io/login.js https://en.wikipedia.org/wiki/Barack_Obama +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --preScript /sitespeed.io/login.js https://en.wikipedia.org/wiki/Barack_Obama ~~~ The script will then login the user and access https://en.wikipedia.org/wiki/Barack_Obama and measure that page. -Checkout the magic row: - -~~~ -const webdriver = context.webdriver; -~~~ - -From the context object you get a hold of the Selenium [Webdriver object](http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html) and the mechanisms for locating an element on the page. - -Note: Use the supplied *driver* object to go to a specific page. - ## Pass your own options to your pre/post scripts You can add your own parameters to the options object (by adding a parameter) and then pick them up in the pre/post script. The scripts runs in the context of browsertime, so you need to pass it on in that context. For example: you wanna pass on a password to your script, you can do that by adding --browsertime.my.password MY_PASSWORD and then in your code get hold of that with: -~~~ +~~~javascript ... // We are in browsertime context so you can skip that from your options object context.log.info(context.options.my.password); ... ~~~ -## Test a page with primed cache -One other thing you can do with a pre script is simulate a user that browsed a couple of pages and then measure the performance of a page (by default the cache is emptied when you use sitespeed.io). - -Create a pre script (pre.js): - -~~~ -module.exports = { - run(context) { - return context.runWithDriver((driver) => { - // Go to the start page of sitespeed.io - return driver.get('https://www.sitespeed.io/'); - }); - } -}; -~~~ - -And then run it like this: - -~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --preScript /sitespeed.io/pre.js -b chrome https://www.sitespeed.io/documentation/ -~~~ - -The browser will first access https://www.sitespeed.io/, this will fill the cache and then go to https://www.sitespeed.io/documentation/ where it will collect all the metrics. diff --git a/docs/documentation/sitespeed.io/s3/index.md b/docs/documentation/sitespeed.io/s3/index.md index a022fb994..cae9c8e95 100644 --- a/docs/documentation/sitespeed.io/s3/index.md +++ b/docs/documentation/sitespeed.io/s3/index.md @@ -72,7 +72,7 @@ And then you should also make sure that all the result files (HTML/videos/screen ## JSON configuration file If you use a JSON configuration file you should make sure you add this to get S3 to work: -~~~ +~~~javascript { ... "resultBaseURL": "https://your.bucket.url", diff --git a/docs/documentation/sitespeed.io/scripting/index.md b/docs/documentation/sitespeed.io/scripting/index.md new file mode 100644 index 000000000..6e685f282 --- /dev/null +++ b/docs/documentation/sitespeed.io/scripting/index.md @@ -0,0 +1,401 @@ +--- +layout: default +title: Use scripts in sitespeed.io to measure a user journey. +description: With scripts you can simulate a user visiting to miltiple pages, clicking on links, log in, adding items to the cart ... yeah do whatever you want! +keywords: selenium, web performance, sitespeed.io +nav: documentation +category: sitespeed.io +image: https://www.sitespeed.io/img/sitespeed-2.0-twitter.png +twitterdescription: Use scripts in sitespeed.io to measure a user journey. +--- +[Documentation]({{site.baseurl}}/documentation/sitespeed.io/) / Scripting + +# Scripting +{:.no_toc} + +* Lets place the TOC here +{:toc} + +# Test by scripting + +The user journey + +Test by scripting was introduced in sitespeed.io 8.0 and Browsertime 4.0 and makes it possible to measure a user journey. A user visiting multiple pages, clicking on links, log in, adding items to the cart ... yeah do whatever you want. + +Scripting work the same in Browsertime and sitespeed.io, the documentation here are for both of the tools. + +Your script will get access to two objects: The *context* object that holds information about the current run and the *commands* object that has commands/shortcuts to navigate in the page. + +The simplest version of a script looks like this: + +~~~javascript +module.exports = async function(context, commands) { + // add your own code here +} +~~~ + +Inside of that function you can use the context and commands objects. + +The context object: +* *options* - All the options sent from the CLI to Browsertime. +* *log* - an instance to the log system so you can log from your navigation script. +* *index* - the index of the runs, so you can keep track of which run that is running. +* *storageManager* - The Browsertime storage manager that can help you get read/store files to disk. +* *selenium.webdriver* - The Selenium [WebDriver public API object](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html). +* *selenium.driver* - The [instantiated version of the WebDriver](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html) driving the current version of the browser. + + +The commands object: +* *[navigate(URL)](#navigateurl)* - Use this if you want to use the exact way as Browsertime navigates to a new URL (same settings with pageCompleteCheck etc). But that URL will not be measured automatically. +* *[measure.start(URL)](#measurestarturl)* - Start measuring and navigate to a new page in one go and measure. +* *[measure.start(URL,alias)](#measurestarturl-alias)* - Start measuring and navigate to a new page in one go and measure. And register an alias for that URL. +* *[measure.start()](#measurestart)* - Use this when you want to start to measure a page. This will start the video and prepare everything to collect metrics. But it will not navigate to the URL. +* *[measure.start(alias)](#measurestartalias)* - Use this when you want to start to measure a page. This will start the video and prepare everything to collect metrics. But it will not navigate to the URL. The next URL that will be accessed will get the alias. +* *[measure.stop()](#measurestop)* - Collect metrics for a page. + +And then you have a couple of help commands: +* *[wait](#wait)* on a id to appear or wait x amountt of ms. +* *[click](#click)* on a link and/or wait for the next page to load. +* *[js](#run-javascript)* - run JavaScript in the browser. +* *[switch](#switch)* to another frame or windo. + + +## Run +You run your script by passing it to sitespeed.io and adding the parameter ```--multi```. If you have multiple scripts, you can just pass them on too. + +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} script.js script2.js script3.js --multi +~~~ + +## Examples +Here are a couple of examples on how you can use the scripting capabilities. + +### Measure the actual login step + +~~~javascript +module.exports = async function(context, commands) { + // Navigate to a URL and do not measure the URL + await commands.navigate( + 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page' + ); + + try { + // Add text into an input field, finding the field by id + await commands.addText.byId('login', 'wpName1'); + await commands.addText.byId('password', 'wpPassword1'); + + // Start the measurement and give it the alias login + // The alias will be useds when the metrics is sent to + // Graphite/InfluxDB + await commands.measure.start('login'); + + // Find the sumbit button and click it and wait for the + // page complete check to finish on the next loaded URL + await commands.click.byIdAndWait('wpLoginAttempt'); + // Stop and collect the metrics + return commands.measure.stop(); + } catch (e) { + // We try/catch so we will catch if the the input fields can't be found + // The error is automatically logged in Browsertime an rethrown here + } +}; +~~~ + +### Measure the login step and more pages + +~~~javascript +module.exports = async function(context, commands) { + // We start by navigating to the login page. + await commands.navigate( + 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page' + ); + + // When we fill in a input field/click on a link we wanna + // try/catch that if the HTML on the page changes in the feature + // sitespeed.io will automatically log the error in a user friendly + // way, and the error will be re-thrown so you can act on it. + try { + // Add text into an input field, finding the field by id + await commands.addText.byId('login', 'wpName1'); + await commands.addText.byId('password', 'wpPassword1'); + + // Start the measurement before we click on the + // submit button. Sitespeed.io will start the video recording + // and prepare everything. + await commands.measure.start('login'); + // Find the sumbit button and click it and then wait + // for the pageCompleteCheck to finish + await commands.click.byIdAndWait('wpLoginAttempt'); + // Stop and collect the measurement before the next page we want to measure + await commands.measure.stop(); + // Measure the Barack Obama page as a logged in user + await commands.measure.start( + 'https://en.wikipedia.org/wiki/Barack_Obama' + ); + // And then measure the president page + return commands.measure.start('https://en.wikipedia.org/wiki/President_of_the_United_States'); + } catch (e) { + // We try/catch so we will catch if the the input fields can't be found + // The error is automatically logged in Browsertime and re-thrown here + } +}; +~~~ + +### Measure one page after you logged in + +Testing a page after you have logged in: +First create a script that logs in the user (login.js): + +~~~javascript +module.exports = async function(context, commands) { + await commands.navigate( + 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page' + ); + + try { + await commands.addText.byId('login', 'wpName1'); + await commands.addText.byId('password', 'wpPassword1'); + // Click on the submit button with id wpLoginAttempt + await commands.click.byIdAndWait('wpLoginAttempt'); + // wait on a specific id to appear on the page after you logged in + return commands.wait.byId('pt-userpage', 10000); + } catch (e) { + // We try/catch so we will catch if the the input fields can't be found + // The error is automatically logged in Browsertime and re-thrown here +}; +~~~ + +Then access the page that you want to test: + +~~~bash +sitespeed.io --preScript login.js https://en.wikipedia.org/wiki/Barack_Obama +~~~ + +#### More complicated login example + +~~~javascript +module.exports = async function(context, command) { + await command.navigate( + 'https://example.org' + ); + try { + // Find the sign in button and click it + await command.click.byId('sign_in_button'); + // Wait some time for the page to open a new login frame + await command.wait.byTime(2000); + // Switch to the login frame + await command.switch.toFrame('loginFrame'); + // Find the usenrmane fields by xpath (just as an example) + await command.addText.byXpath( + 'peter@example.org', + '//*[@id="userName"]' + ); + // Click on the necx buttin + await command.click.byId('verifyUserButton'); + // Wait for the gui to display the password field so we can select it + await command.wait.byTime(2000); + // Wait for the actual password field + await command.wait.byId('password', 5000); + // Fill in the password + await command.addText.byId('dejh8Ghgs6ga(1217)', 'password'); + // Click the submit button + await command.click.byId('btnSubmit'); + // In your implementation it is probably better to wait for an id + await command.wait.byTime(5000); + // Measure the next page as a logged in user + return command.measure.start( + 'https://example.org/logged/in/page' + ); + } catch(e) { + // We try/catch so we will catch if the the input fields can't be found + } +}; +~~~ + +### Measure multiple pages + +Test multiple pages in a script: + +~~~javascript +module.exports = async function(context, commands) { + await commands.measure.start('https://www.sitespeed.io'); + await commands.measure.start('https://www.sitespeed.io/examples/'); + return commands.measure.start('https://www.sitespeed.io/documentation/'); +}; +~~~ + +### Log from your script + +You can log to the same log output as sitespeed.io: + +~~~javascript +module.exports = async function(context, commands) { + context.log.info('Info logging from your script'); + context.log.error('Error logging from your script'); +}; +~~~ + +### Pass your own options to your script +You can add your own parameters to the options object (by adding a parameter) and then pick them up in the script. The scripts runs in the context of browsertime, so you need to pass it on in that context. + +For example: you wanna pass on a password to your script, you can do that by adding --browsertime.my.password MY_PASSWORD and then in your code get hold of that with: + +~~~javascript +module.exports = async function(context, commands) { + // We are in browsertime context so you can skip that from your options object + context.log.info(context.options.my.password); +} +~~~ + + +## Commmands + +All commands will return a promise and you should await it to fullfil. If some command do not work, we will log that automatically and rethrow the error, so you can catch that and can act on that. + +### Measure +The measure command will prepare everything for measuring a new URL (clearing internal metrics, starting the video etc). If you give an URL to the measure command it will start to measure and navigate to that URL. + +If you do not give it a URL, it will prepare everything and start the video. So it's up to you to navigate/click on a link/submit the page. You also need to stop the measurement so that Browsertime/sitespeed.io knows that you want the metrics. + +#### measure.start(url) +Start and navigate to the URL and then automatically call the stop() function after the page has stopped navigating decided by the current pageCompleteCheck. + +#### measure.start(url, alias) +Start and navigate to the URL and then automatically call the stop() function after the page has stopped navigating decided by the current pageCompleteCheck. The page will also get the alias that will be used when you send the metrics to Graphite/InfluxDB. Use it when you have complex URLs. + +#### measure.start() +Start to measure. Browsertime/sitespeed.io will pick up the next URL and measure that. You need to call the stop() function yourself. + +#### measure.start(alias) +Start to measure. Browsertime/sitespeed.io will pick up the next URL and measure that. You need to call the stop() function yourself. The page will also get the alias that will be used when you send the metrics to Graphite/InfluxDB. Use it when you have complex URLs. + +#### measure.stop() +Stop measuring. This will collect technical metrics from the browser, stop the video recording, collect CPU data etc. + +### Click +The click command will click on links. + +All click commands have two different versions: One that will return a promise when the link has been clicked and one that will return a promise that will be fullfilled when the link has been clicked and the browser navigated to the new URL and the pageCompleteCheck says ok. + +If it do not find the link, it will throw an error, so make sure to catch if you want an alternative flow. +{: .note .note-warning} + +#### click.byName(name) +Click on element that is found by name attribute that has the given value. + +#### click.byNameAndWait(name) +Click on element that is found by name attribute that has the given value and wait for the pageLoadCompoleteCheck to happen. + +#### click.byClassName(className) +Click on element that is found by specific class name. + +#### click.byClassNameAndWait(className) +Click on element that is found by specific class name and wait for page load complete check to finish. + +#### click.byLinkText(text) +Click on link whose visible text matches the given string. + +#### click.byLinkTextAndWait(text) +Click on link whose visible text matches the given string and wait for pageCompleteCheck to finish. + +#### click.byPartialLinkText(text) +Click on link whose visible text contains the given substring. + +#### click.byPartialLinkTextAndWait(text) +Click on link whose visible text contains the given substring and wait for pageCompleteCheck to finish. + +#### click.byXpath(xpath) +Click on link that matches a XPath selector. + +#### click.byXpathAndWait(xpath) +Click on link that matches a XPath selector and wait for page load complete check to finish. + +#### click.byJs(js) +Click on a link located by evaluating a JavaScript expression. The result of this expression must be an element or list of elements. + +#### click.byJsAndWait(js) +Click on a link located by evaluating a JavaScript expression. The result of this expression must be an element or list of elements. And wait for page complete check to finish. + +#### click.byId(id) +Click on link located by the ID attribute. This locator uses the CSS selector *[id="$ID"], not document.getElementById. + +#### click.byIdAndWait(id) +Click on link located by the ID attribute. This locator uses the CSS selector *[id="$ID"], not document.getElementById. And wait for page complete check to finish. + +### Wait +There are two help commands that makes it easier to wait. Either you can wait on a specific id to appear or for x amount of milliseconds. +#### wait.byTime(ms) +Wait for x ms. + +#### wait.byId(id,maxTime) +Wait for an element with id to appear before maxTime. If the elemet do not appear within maxTime an error will be thrown. + +#### byXpath(xpath, maxTime) { +Wait for an element founmd by xpath to appear beforeYo maxTime. If the elemet do not appear within maxTime an error will be thrown. + +### Run JavaScript +You can run your own JavaScript in the browser from your script. + +#### js.run(javascript) +Run JavaScript. Will throw an error if the JavaScript fails. + +#### js.runAsync(javascript) +Run async JavaScript. Will throw an error if the JavaScript fails. + +### Navigate +Navigate/go to a URL without measuring it. + +#### navigate(url) +Navigate to a URL and do not measure it. It will use the default pageCompleteCheck. + +### Add text +You can add text to input elements. + +#### addText.byId(text, id) +Add the *text* to the element with the *id*. If the id is not found the command will throw an error. + +#### byXpath(text, xpath) +Add the *text* to the element by using *xpath*. If the xpath is not found the command will throw an error. + +### Switch +You can switch to iframes or windows if that is needed. + +If frame/window is not found, an error will be thrown. +{: .note .note-warning} + +#### toFrame(id) +Switch to a frame by its id. + +#### toWindow(name) +Switch to window by name. + +#### toParentFrame +Switch to the parent frame. + +### Use Selenium directly +You can use Selenium directly if you need to use things that are not availible through our commands. + +You get hold of the Selenium objects through the context. + The *selenium.webdriver* that is the Selenium [WebDriver public API object](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html). And *selenium.driver* that's the [instantiated version of the WebDriver](https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html) driving the current version of the browser. + +Checkout this example to see how you can use them. + +~~~javascript +module.exports = async function(context, commands) { + // we fetch the selenium webdriver from context + const webdriver = context.selenium.webdriver; + const driver = context.selenium.driver; + // before you start, make your username and password + const userName = 'YOUR_USERNAME_HERE'; + const password = 'YOUR_PASSWORD_HERE'; + const loginForm = driver.findElement(webdriver.By.css('form')); + const loginInput = driver.findElement(webdriver.By.id('wpName1')); + loginInput.sendKeys(userName); + const passwordInput = driver.findElement(webdriver.By.id('wpPassword1')); + passwordInput.sendKeys(password); + // this example skips waiting for the next page and validating that the login was successful. + return loginForm.submit(); +} +~~~ + +If you need help with Selenium, checkout [the official Selenium documentation](https://www.seleniumhq.org/docs/). diff --git a/docs/documentation/sitespeed.io/spa/index.md b/docs/documentation/sitespeed.io/spa/index.md new file mode 100644 index 000000000..36a4792c0 --- /dev/null +++ b/docs/documentation/sitespeed.io/spa/index.md @@ -0,0 +1,72 @@ +--- +layout: default +title: Test a single page application - SPA +description: Instructions on how to use scripting to test your Single Page Application. +keywords: selenium, web performance, sitespeed.io +nav: documentation +category: sitespeed.io +image: https://www.sitespeed.io/img/sitespeed-2.0-twitter.png +twitterdescription: Test a single page application - SPA +--- +[Documentation]({{site.baseurl}}/documentation/sitespeed.io/) / Single page applicatiom + +# Test a single page application +{:.no_toc} + +* Lets place the TOC here +{:toc} + +# Test by scripting +To test a single page application you probably want to measure more pages than the first page (that loads the framework). Add you do that by using the Browsertime command/scripting. Either you use our commands or Selenium scripts. + +When you test a single page application you should add the ```--spa``` parameter to your test pages, so that Browsertime/sitespeed.io knows. That will enable: +* Automatically handle URLs with #. +* End testing your page load after X seconds of no activity in the Resource Timing API. This makes sure that when you navigate to different pages, the navigation ends when everything finished loading. + + +## Metrics +Using a single page application make it harder to measure how fast a page load since since the navigation timing API will not work. Instead you can use the User Toming API and pick up visual metrics and metrics from the CPU. + +### Navigation timing metrics +The navigation timing metrics are only useful for the first page that you test. The following pages in your SPA will not populate new navigation timing metrics. + +### Visual Metrics +Visual Metrics will work fine but depending on how you navigate *First Visual Change* can be when you click your link, so focus on *Last Visual Change* instead. + +### User Timing +You need to instrument your code yourself or use a framework that do that automatically. [Read how LinkedIn](https://engineering.linkedin.com/blog/2017/02/measuring-and-optimizing-performance-of-single-page-applications) use User Timings to measure their SPA. + +### CPU metrics +If you run your tests with Chrome and enables ```--chrome.timeline``` you will also get metrics where Chrome spends it times rendering and executing JavaScript. + +## Example: Performance test Grafana +In this example we navigate and measure the start page of our Grafana installation, and then measure clicking the link to see the data for the last thirty days. + +Lets create a script file and call it *thirtydays.js*. + +~~~javascript +module.exports = async function(context, commands) { + await commands.measure.start('https://dashboard.sitespeed.io/d/000000044/page-timing-metrics?orgId=1'); + try { + await commands.click.byClassName('gf-timepicker-nav-btn'); + await commands.wait.byTime(1000); + // We give the paghe an alias that will be used if the metrics is sent to Graphite/InfluxDB + await commands.measure.start('pageTimingMetricsLast30Days'); + await commands.click.byLinkTextAndWait('Last 30 days'); + await commands.measure.stop(); + } catch (e) { + // If the GUI change and a link is not there, + // the click commands will throw an error. + // sitespeed.io will catch, log and rethrow + // and you can choose if you want to have a different + // user flow + } +}; +~~~ + +And then you run it by passing on the script file, using ```--spa``` to notify that you are testing a single page application and ```--multi``` that you test multiple pages withing one run. + +~~~bash +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} thirtydays.js --spa --multi +~~~ + diff --git a/docs/documentation/sitespeed.io/upgrade/index.md b/docs/documentation/sitespeed.io/upgrade/index.md index 47e029437..d414d8f46 100644 --- a/docs/documentation/sitespeed.io/upgrade/index.md +++ b/docs/documentation/sitespeed.io/upgrade/index.md @@ -1,11 +1,11 @@ --- layout: default -title: Upgrade from sitespeed.io 5.x to 6.x -description: This guide helps you upgrade from sitespeed.io 5.x to 6.0 +title: Upgrade from sitespeed.io 7.x to 8.0 +description: This guide helps you upgrade from sitespeed.io 7.x to 8.0 keywords: upgrading, documentation, web performance, sitespeed.io nav: documentation image: https://www.sitespeed.io/img/sitespeed-2.0-twitter.png -twitterdescription: Upgrade 5 -> 6 +twitterdescription: Upgrade 7 -> 8 --- [Documentation]({{site.baseurl}}/documentation/sitespeed.io/) / Upgrade @@ -15,72 +15,5 @@ twitterdescription: Upgrade 5 -> 6 * Lets place the TOC here {:toc} -Upgrading to 6.x from 5.x? There are a couple of important things that have changed that you should read before you do the switch. +Upgrading to 8.0 from 7.x? There are a couple of important things that have changed that you should read before you do the switch. -## Regular user -As a regular user there are a couple of changes you need to know about. Nothing will break there's a few configuration changes you should do. - -### Default 30 fps for the video -In older versions the default frames per second for the video was 60. On cloud services that could be too much, introducing unstable metrics. If you still want to use 60fps you can do that by adding ```--videoParams.framerate 60``` to your run. - -Do a test run with 30fps and check what happens to your Visual Metrics. - -### Graphite users -We have switched to Graphite 1.x by default (from Graphite 0.x). When Graphite moved to 1.0 they changed how annotations is handled. If you use 0.x version you and send annotations through sitespeed.io you need to add ```--graphite.arrayTags false``` to make it continue to work as before. - -### Video and Speed Index default in the Docker containers -In the new version we have video and Speed Index turned on by default when you run in our Docker containers. If you want to turn them off add ```--video false``` and ```--speedIndex false``` to your run. - -### npm/yarn -If you don't use our Docker containers (you should!) and install via npm/yarn, we know use latest LTS of NodeJS 8.9.1 (so you should upgrade your NodeJS version too). - -### Assets timings with more in details info -For 99.9% of the users this will not change anything but if you are sending assets timings to Graphite/InfluxDB (as we told you **not** to do) we changed so instead of getting the total time you now get: blocked, dns, connect, send, wait and receive timings [#1693](https://github.com/sitespeedio/sitespeed.io/pull/1693). - -### GPSI users -We have moved the GPSI outside of sitespeed.io and you can find it [here](https://github.com/sitespeedio/plugin-gpsi). To run in along with sitespeed.io you just follow [the instructions how to add a plugin](https://www.sitespeed.io/documentation/sitespeed.io/plugins/#add-a-plugin). We moved it outside of sitespeed.io to make the code base cleaner and with the hope that we can find a maintainer who can give it more love. - -## Plugin makers -We have made some changes to plugins to make it possible for plugins to generate HTML and to talk to each other before sitespeed.io starts to test URLs. - -### No more hooks, say hello to new messages on the queue - -In 5.X we relied on hooks for plugins, but we remove them and changed to use messages. - -In 6.x your plugin should have an *open* function (called on startup), *processMessage* (getting all messages that are passed around in the queue) and *close* (optional). - -We now have three messages sent by the queue: - - - **sitespeedio.setup** - The first message on the queue. A plugin can pickup this message and communicate with other plugins (send pugs to the HTML plugin, send JavaScript to Browsertime etc). - - **sitespeedio.summarize** (old message **summarize**) that tells the plugins that all URLs are analysed and you can now summarise the metrics. - - **sitespeedio.render** which tells the plugins to render content to disk. The HTML plugin pickup **sitespeedio.render**, render the HTML and then sends a **html.finished** message, that then other plugins can pickup. - -We changed name of the old message **summarize** to **sitespeedio.summarize**. - -This means you need to remove your hooks and act on the messages instead. - -You can check out the changes in [#1732](https://github.com/sitespeedio/sitespeed.io/pull/1732) [#1758](https://github.com/sitespeedio/sitespeed.io/pull/1758). - - -### No generic Datacollector -One of the bad design in the old 5.x code was the [DataCollector](https://github.com/sitespeedio/sitespeed.io/blob/5.x/lib/plugins/datacollector/index.js) (generic collector of data). We removed that now and that means each and every plugin needs to collect the data it needs themselves. - -You can checkout how we do in the [HTML plugin](https://github.com/sitespeedio/sitespeed.io/blob/master/lib/plugins/html/index.js) and the [Slack plugin](https://github.com/sitespeedio/sitespeed.io/blob/master/lib/plugins/slack/index.js). - -The easiest (but a little ugly) way to migrate is to move the old [DataCollector code](https://github.com/sitespeedio/sitespeed.io/blob/5.x/lib/plugins/datacollector/index.js)) to your own plugin. The better way is to cherry pick the metrics/data that your plugin needs. - -You can see the changes we did in - [#1731](https://github.com/sitespeedio/sitespeed.io/pull/1731) and [#1767](https://github.com/sitespeedio/sitespeed.io/pull/1767). - - -### StorageManager API changes - -Several parts of the [StorageManager](https://github.com/sitespeedio/sitespeed.io/blob/master/lib/core/resultsStorage/storageManager.js) API have been updated to fit better together. The following changes may break code written using the 5.x API: - -- `createDataDir(directoryName)` is now `createDirectory(...directoryNames)` and takes any number of directory names (which will be joined together) as arguments. -- `writeData(filename, data)` has reversed the order of its arguments. It is now `writeData(data, filename)`. -- `writeHtml(filename, html)` has reversed the order of its arguments. It is now `writeHtml(html, filename)`. -- `writeDataForUrl(data, filename, url, subDir)` no longer has a fifth argument indicating whether output should be gzipped. -- `writeHtmlForUrl(html, filename, url)` no longer has a fourth argument indicating whether output should be gzipped. - -Note that all compression functionality has been removed. If you need compressed output, your plugin should handle gzipping itself. See the [`harstorer` plugin](https://github.com/sitespeedio/sitespeed.io/blob/56bfc48bac7ccfe1cfe35c829b4dd11987a375e4/lib/plugins/harstorer/index.js#L19-L28) for an example. diff --git a/docs/documentation/sitespeed.io/webpagereplay/index.md b/docs/documentation/sitespeed.io/webpagereplay/index.md index ea5e2d2ca..9c5ead16c 100644 --- a/docs/documentation/sitespeed.io/webpagereplay/index.md +++ b/docs/documentation/sitespeed.io/webpagereplay/index.md @@ -51,8 +51,8 @@ You need to give Docker access to the network with `--cap-add=NET_ADMIN` so that To run a simple test: -``` -docker run --cap-add=NET_ADMIN --shm-size=1g --rm -v "$(pwd)":/sitespeed.io -e REPLAY=true -e LATENCY=100 sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 5 -b chrome https://en.wikipedia.org/wiki/Barack_Obama +```bash +docker run --cap-add=NET_ADMIN --rm -v "$(pwd)":/sitespeed.io -e REPLAY=true -e LATENCY=100 sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} -n 5 -b chrome https://en.wikipedia.org/wiki/Barack_Obama ``` Remember to verify the HAR files produced so that it looks like it should: Verify that WebPageReplay replays your website correct. If it does, then use it :) @@ -63,13 +63,13 @@ Using WebPageReplay in Docker and your Android phone only works on Linux. This i Using sitespeed.io: -``` +```bash docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --cap-add=NET_ADMIN --shm-size=1g --rm -v "$(pwd)":/sitespeed.io -e REPLAY=true -e LATENCY=100 sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} https://en.m.wikipedia.org/wiki/Barack_Obama --browsertime.chrome.android.package com.android.chrome --browsertime.xvfb false --browsertime.chrome.args ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I= --browsertime.chrome.args user-data-dir=/data/tmp/chrome -n 11 ``` Using Browsertime: -``` +```bash docker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --cap-add=NET_ADMIN --shm-size=1g --rm -v "$(pwd)":/browsertime -e REPLAY=true -e LATENCY=100 sitespeedio/browsertime:{% include version/browsertime.txt %} https://en.m.wikipedia.org/wiki/Barack_Obama --chrome.android.package com.android.chrome --xvfb false --chrome.args ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I= --chrome.args user-data-dir=/data/tmp/chrome -n 11 ``` diff --git a/docs/documentation/sitespeed.io/webpagetest/index.md b/docs/documentation/sitespeed.io/webpagetest/index.md index 64acdc106..d862d6fbb 100644 --- a/docs/documentation/sitespeed.io/webpagetest/index.md +++ b/docs/documentation/sitespeed.io/webpagetest/index.md @@ -47,14 +47,14 @@ If you need anything else adding your own CLI parameter will propagate to the We Example: So say that you want to change the user agent of your test. In the API you can do that with --useragent. Pass the same to sitespeed.io by prefixing webpagetest like so --webpagetest.useragent in the cli. ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.host my.wpt.host.com --webpagetest.useragent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36" https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.host my.wpt.host.com --webpagetest.useragent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36" https://www.sitespeed.io ~~~ ## Default configurations The default configuration for WebPageTest looks like this: -~~~ +~~~json { pollResults: 10, timeout: 600, @@ -75,7 +75,7 @@ WebPageTest has scripting capability where you can easily automate a multi-step You can create your script file (checkout [WebPageTest documentation](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/scripting) for what you can do). It can look something like this (wptScript.txt): -~~~ +~~~shell logData 0 // put any urls you want to navigate @@ -91,7 +91,7 @@ navigate news.aol.com/world Then change your URL you want test (probably the last one) to \{\{\{URL\}\}\} and then all occurrences of \{\{\{URL\}\}\} will then be replaced with the current URL that should be tested. Now run sitespeed.io with the additional parameters: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.file /sitespeed.io/wptScript.txt --webpagetest.host my.wpt.host.com http://example.org +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --webpagetest.file /sitespeed.io/wptScript.txt --webpagetest.host my.wpt.host.com http://example.org ~~~ It is also possible to pass the WebPageTest script as a string into the `--webpagetest.script` flag. You can use the `scriptToString()` method provided in [webpagetest-api](https://github.com/marcelduran/webpagetest-api/#module-1) to create a string from a JSON object. @@ -99,14 +99,14 @@ It is also possible to pass the WebPageTest script as a string into the `--webpa {% assign bashURLString = '{{{URL}}}}' %} ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.script "navigate \t www.aol.com \n navigate \t {{bashURLString}}" --webpagetest.host my.wpt.host.com http://example.org +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --webpagetest.script "navigate \t www.aol.com \n navigate \t {{bashURLString}}" --webpagetest.host my.wpt.host.com http://example.org ~~~ ### Custom metrics Hey we love custom metrics and you can fetch them using WPT. Checkout the [metrics docs](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/custom-metrics) for WPT and then create a file containing your metrics: -~~~ +~~~shell [iframe-count] return document.getElementsByTagName("iframe").length; @@ -128,7 +128,7 @@ return viewport; You can then run sitespeed.io to pick up the new custom metrics: ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.custom /sitespeed.io/myScriptFile.txt --webpagetest.host my.wpt.host.com https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --webpagetest.custom /sitespeed.io/myScriptFile.txt --webpagetest.host my.wpt.host.com https://www.sitespeed.io ~~~ ## Run WebPageTest without Browsertime @@ -136,12 +136,5 @@ docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io Sometimes you want to only collect data from WebPageTest and not from Browsertime. The best way to do that is to disable the Browsertime plugin with *--plugins.remove browsertime* ~~~bash -docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io --webpagetest.host my.wpt.host.com --plugins.remove browsertime https://www.sitespeed.io +docker run --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:{% include version/sitespeed.io.txt %} --webpagetest.host my.wpt.host.com --plugins.remove browsertime https://www.sitespeed.io ~~~ - -## Advanced dashboards - -If you use the grafana dashboards, you will notice that by default some of them can be empty. You must set to true two options - -* `webpagetest.timeline` : It activates chrome tracing, if you're running chrome. It contains super useful metrics like the Navigation Timing API and chrome specific metrics like FirstMeaningfulPaint. - diff --git a/docs/examples/index.md b/docs/examples/index.md index 65f18b66e..0a1d0a909 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -36,7 +36,7 @@ docker run --shm-size=1g --rm -v "$(pwd)":/browsertime sitespeedio/browsertime:{ It will generate a HAR file, a video and a browsertime.json that hold all the metrics. -~~~ +~~~json { "info": { "browsertime": { diff --git a/docs/img/new-dashboard-8.0.jpg b/docs/img/new-dashboard-8.0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91513418721a4bf93c795ac3c2227098b1ddd300 GIT binary patch literal 156052 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

as#pZm!6@bao+{7T z&xY0U3Z#uDsz2?VSjC8z?2LS z!<1KeO2DidJ7w^$gWd@JqHqXX1<}ar3ZSp!*~VkI+IIc6dCpqJNGcS`NrU9Hu_dI8 zS)HS%kf?2-aENn5%Juj}7@78@*1pGOt~-8yl!IUqZMo!p^H#lKWNAvghp2+HhbhwF z`P`jzk#+fO%MmWlQoG`BsVyt>E@;ldK4nSOOJXnY-2JiY6T2S{Po?Y1?1No$vnG~s zn8z7LBHrHINvOAT{Q&^go3(kjzVR;ORTz!AM3T3(o=uQ21v!+g=5$K#%4dS~>_AM! zE2Uk%NEt4p(pI;@BBnz2OiO)t29Y>5v7(+j5OLdyySHe}xr?`k`5<)JYiBy}k-iTy zNDLP6RN!75C8XINV~v*Ash*<%2j#Bo^tnk9$}!_X#u1%)i}6q@=`uc8Ufv+ z3#ZafOa!K%I_*1y(zz;9M-s!>c1cK<(m=pV&gztqw*XrWc~7tr?miKlZH~BT=NKoU zJ(7Jpx;xLTaS!e>bhx zO&Cap%77HTTn?i&{y0caECoXmtk;A#Oa;{Fr92$C_Fw_H)nynI;@o-etfXcy0lv_(>_CEC`;e#BToNzM@wY}jv`xf1`%@aX`%*_kSD zqb#TY2yJhf7AQrpvO}u>YUKI~obt#RCOnoBbT2REa!wChC zL*1xhpg;jiT7>`DhsE65+ zqN4^R{FiMS3X^C?%;=cDI%Jn8)h9%Br98`8di)1a2^Ftv=&eM{d6?dtI4Dqzq#Ps3 z-928q%&-oq@b*Q5b8_%qs_X1#4F~+@7c2Bh0{me+pK0zYwsMi{sRh=irR6rd;ptlx#Y zdim^4^85}Ed?gU_g`kXT3zVabX~BA%Ihc^@MOX$cBJ7C=jN@KFmqb{dz=BTdZbbu| zsWOqgHPM12juvM6Y#SHvs6M?>-<5gNo5qhfk^L7;&!x200DLZ??17N+oy#rR{9Vi{ zScRksFEu{|1&+Wq_cZU5oz^Fe`82PPHoaG}b%KuMLEVgrz~o$Y1}1`i2+S0Wa4IfK zb__4ZqpjkfsNpBt6RrG>IlvK4{ zC(*Q^lFkh*^b#bfvJATxdcOF14qIMZ>K)T(V$4oGkNi~VfW3tsaq4bJ0-&&EaT`~Q7tZ^cs-Vo+RF;BRQY7CQB`c{*FHbd zmZR01Ct1*RCULi=ivP2RCnXs7-A~>B3oVI9z%^>)%+nRROvQ2eVhBUihuVDtL(`Ba;cN^k>{*iK96})N-ju{m1w})Wx3N zp@nKbn3BLXC{iro7v0&Y9nd0r;ieLT@-vMEK3e&7jU8(Mg_c4!6qgaJ!l+y$ES5=G z4I)jf7C+dr2cZ*zD4OyW?1R6-)V}{>RqHP7;@=4*f!AwPtPvRj2>9q-j{!u(5u5BM zT-{|N2cj%<5Igpv3@OEo!jybfMATNgt!(>M{x!;1srstFJ3;N<)zJdmfJ{Z@bVM>m z!7Q3XtQa}X_;fJKX|BvN4JgS@ne`jIGDgV`s(e+8q4h00Ee5$h*gyz%wEUKV4j3JS znFP>VMD8*nhHfAHH^2M-7lhD}Of+FBTliP|_cEmAvw%tu%Z#(X9tpPm%3O^*Lz;G$ z0PKojv-w>1m`%BFUnhUAQspZTXM)`DA8hzoH$R&KvwkHgL-M2zrZCof{hkj(sw0Bg z;8B$__2FHQWhx0vsMvvXPJMkA`O)$jjwz?^;v@Dg~)Ox z-zb}EL4zg2JlrKc=Fxm<4k+4wi-G_7%TJ*G){%NlPSB!}tZb2J3q<2a96qd24aj^~ zSIZ^BH=N1w*PCD@ch2a|UPR`aW3?mfy`QuhCs%8iKK5u3*!q$2DS|OTCT&?x%+C}z z`9UQXTm-=TwMsP*FQX21VfcWHZBv8`$Xz(MiD=fi=I+H5%y=y6*w^Uz2k=3wU71F+ z4uwinYG!9DC~LRo=dqyP>~a6y_VC*)S*TC{iY8Z+NzWmjGDaL>Q;KdwtK>`Gk86+m z+v4U4GZk($JV}sQ^)fY&1TA%gy$YqvZXJY6d)^D%3)bGxYeU8gBz%TLdMV~<8{$u+`*%FTJ3 zxM|7jGd3ZSKY+CynpdFJvk9ZH;-SKaMT{>kJ;Rmj?FJ&yp9uBPXoc@yCmVLUwO;6R z?~@ms)62BkZL!%Z@N;}?O;KDvw?gu+yPvhWqO&ldHLCPUOokM#s+lNSV7-A~ZJDrQ zRqrcF{I-4%LO!!ttF1I>Ue4r8DHpZZtMCs-0CS8H@A*_uap3LPmt9V1*FoZ-KX5;W zXe-Ow^77-kqpc(9k{xfsAHXfCcj%U6+-EJMI`Qi+IY}b9&qH;Ra1=7CM|hopS*3<% z<8nj0v%0%CMGguQ1WjR`R~~b!8o)RP(J4?p;!%zvduzPo^sMJyBVu8jJ?DggL3ZbR z+R8i0JSix_=Dg_C*Fe@B-$0-iWiH>8tF3lcBID{n#tub6Hm$LMgHm6=l0tc6NBh>q zr-+YxnQxk^yAsxZ^jjy%T2HCYxfyQid%jd}8W{daamO?Ky^ z1EBfhvmw#Zd?^$%OLlp;6o>3bmg=28htCqlX*#yG_GVWa(Qxfc?|9nl{Warxh2~#H z;X^AwcxSI!tO1Y($*544C?dTU(po?w8^ukxP$2>xAh)%3Oi=BN^`;acGNq% z8u{9t$@Bzeg$kxlQI%cog}UW}d%V60+nT;{5vtdNQH6US1WOl_INs4iEwqH!_dc!~ zO$S~0xDE`)M2w{r7hfp{0u(Hq+%k# zXQ&@B?s$BeKC{aRrzRST$?+HI%5c46t^>Juy!jDuPo&>M?q2J_`%3g8GL>2Ti?l{e z9MO~C{ZK&`rqpj9(HKRc-_Jt+K9a6GQhQ&!*Q5RU)xx!ryS4LF#FjUUP^Ta+ zk@|NXp<=_4?Vrk8Uc1FGEnnLCa(4B;@|b3wB@gxFbIDb3)S_qG)#o}{pXqezEi`rC z65?SSh#`;TcYnL492k%u&CAdIE+TfHcW1Z!Sg2&MfWt!WAo*#V|T5;L5 z(DRi{xS{IR4|x`e6jWcbes(1>rb?W&`_bL@o7`h}WndQ-l(QRF{PXc=@%8mV)fOQP zexIR5Xefmugx7yYDmRq{hX!`lU^9FOIPkWUn;N6t_OB9Q zd3khn{Jz0q()!Zi;@@SS?z>wH+>_QNDZGo;3m_gXolj#~=GBCttw2@ZRv=W`$5@$T z>y^KtwbtFpskc=}2X71?gz1JS~2Ozm#CHAa-uER%L?d#c^@UD{u0Cpe;Vx0)1PsA}QX{0Rma(uc2 zy0o2R>xY^L={@x_wU^aroNiY&g}BHtkPigz-n2S|umG)HVK1Sp7*-oHM(Ou6*6W*!B~CLJ>A{ zWkS?ZmPv>%|5)a9i1*6XV_;l-h{Dau9acziSHyY*)isbw%hfx(ghWJD;{yhCXL`p;-$mk zUKpl=WRqB8kE0|JQHhg2OnXja_+8G!FOQBwowR?VEU3{&Y(AlL zfKN<+2|dAKmeVt}dFXx=)+97H>k0Wd`||xl$GaR=dq`B>wS%VjXd_kcwD5iBo#$9@ zFFn;{C`FFW9{>f;a6N|A5uWQ1ppt9czsB6cx41`)@FRO|03(YkF>yTWNP-Ib3 zg*Tux{V;KlL1p_z);6wOun8R@YsuTVHNjQux=j0Iy%k%a!jq=JM(ve^=e%wH#Af%B z))p*%;Jb2t%Z!fj!nongUFQ4>`IOTBZjX2IGVs{G*Vs>znXj06Cl48cAl=Qb|tLUbsq^K&4-%G0l z^QyZuz;R1vHLE-?D^+eJI*=-C+E4S)XV#xrsvBOpvuF2RptP@|#h?OSc^G$sEAA`H zjd>)>3?9zi9bQUycY|>!fYjRib6w=MMWz-1YqffwhQfYpBFv%t4C5Z4G9Ah)2eK2< zkec$Vi;Lo?Z=|$Tw#CUDTMFrRU~?B|A2SlvyqN0{#O)lW+-DfVSv?Ll3GulZY0(b7 z3%b`qJO;Yf#SzcAbid*+n%L=O>gWHxD&m3?p8ol@_Ofx0zbvqMc}HzQ@$HAEJMRI6 zo+~%AQk*7?zgf#|kAOSeUf}g1)aE3|dIvM6eCY$;tQ}vslX+s9F+LRJcp;h^C^qNA z=KS*D<9GK1Dz9xv+-65q(!$_;Rr>Q`mevtjVO8*4o~FXS2QjhRTxHiT3Ec%E>4VHa zWEUEfyW=7?5vEe zSh?TJy9l$VJqEO<0U$>h(tkMXu`5>mw~|f2uz165Wp6B(lsz;Djn>?iBtEsuQhI%# z)q()lhuCLH>1W4TNPTz30AfNxooW}&t6W?C*;Tqsyguv9MWt3zSUiq03of%;pQe%f zaU55QW@W}!ID`3?Ay05*UK}l4J5jj@HJUElU_HtroRp_Bfw-4dCsvbEHoFM3Ba|4@ z!`7gsZM<8aYU`jEAvAy$vEU4?7K6XOtz%|joRA{#T@1=nvVUGE!oC<5YsSni>Rt68 z|AXik>F+P?D|~{iB|1U{sa|Er_Dp~)Je*QCx79-y;{#d1jw;j8tudyDIf0gj8Q*39 zv!c&6`t8Kky>|2);TDb<5s@?S8CuekMpjlD6Z1SI)c^`_^TF7=(==%8;d(St!;DBm zU=rBiW3As*gF>#e73L#bX$IQAe1iK^R>mln(9`SBH8h7s#wq@KeB;vp?|yBtxP7r~ z!$NJNfR8W!|H1v1!fB4{_C0`U_@oyl@BaXvz56o;P@x21V`1aq;t=BD;NxNe001m( zN&pTOhX{~@TG^1D)1F3HRLQ`|KXwTurs9Aov-1m3HFk`N8$JMw2ey7j{y_r>u&}YP z6tNznqsOBcKG`fxygLe&J-KZ0N``&kQKL&efMpUgVh$= z$;OVEXL8tv8i zeHfHu*Z)rq1)y+9{7$fEncVQHRy+5}^hfc2*+hKm{6*@)raqfVH?q6Zb5)ly%VxGO ziZ5;&?xfxCEZW!HfshQWxAHj~VxuzukaCUnN?SPwZ_k7h0RsJBLm~+-EpituB#yh@ zNqyAzru2)=Va+io?DA_lZK8~JHS$knXy16}##93Qx+qb|l`TqN!aTD_a;?J?BP zMg(#)sj{nUmG^5eQ&cg-Ayw0=c^2Qdt=ETcTdMK7IH2~TaBa^+f87hN%wH9cMThbEfadA&_#{)!39ti~q5az)ZIvX(uOT<7jK9m5 zpLY6<47`>K7>=w*ZAKkRRJ3<63{=cs^%%AuvbKQ z9m1Er))(i!c6DvHmX6a3WlUdv450rq5mkqizh_HthI5MPyq$YKFZhffrOI|FmO&(E zl_`vEksqJq$8^qp{)DIoGW7PWriB63s!EyTN1vF?(_cm-U&W;~UZSHLE)yvAiq4YE zgc1-_&i~SP=hUA98R`2csz}(?*|$EHY|(I1K z$l}{{hI5O%H`kbm@tWT!8?Ith5Rqr{^Tm5LTxcUd>N4^Vpc9(_=&plGv4orCdGCC) z3bpC!%FcRf>iE7?6`+hN$WhCpJuy=ppn*4Y>7+!~#)~Z|H|ebe!Cn~GSZQPFadXXT zL^NA!Td-0b|2wI5WaECY#WQwdqfnL+afWlVbo0uvYFJTLPF3KrZD_*gJS5;icf;j# z^%k6t?ppZsiP`0L=ULkKW8RoxoUOd2O%973JNFQ0pW7t?T})>mW(~G>NaRCC7oAmI zl$>&-FT_4ZMLET&sfWv09PIjknJ*mQpxCI?@7K4tnaxo!hcJt2MBGlF;^nz^kW7Hq z+G|;PxtF|XlzRM~T(y{Gk-B^Lk8S*b<<(0!o&QjPJ$BF9ow)*mlGkT-C)|fR;ootlvu{ue!7!Sv13F$$~lKYEOE9 zQ`;!#$xa01Y-|aPF<}2QO%@)*3xS&en0#ZxP004hEYi#fzUi2w$?TSd)a;uXF5FEn zbe5D{n^Z-pL6Cc0(I4wnQJ|kDG_x#yW@0~}CafQt+-N%h~J)agnoLcqY%t43JqML-=+F>^661+m_f==ynG z=9}889VFW7kmu=Gicm!{Hd%>(vf~SL@-kG8W6?cHtwd}nE>7+Z)~XrS49Msxdv!+v zH>&K6m;JODfDf4i$yXOl3e4I2K5td*x0qVg>N@VZ zR*%LF|HohSw|@YfDfus^n#nV)I0-QXUiRQ-!kGcSrX1jc^d;m_#D;p+lV;|{uWpD# z;Q?F4A3%GVM>NIa^V^YMqxyHRT?8AI7#TN+1;h32=_!+&3G)#;`6?xYFH}DCXb7Aq zQfcT8gLRfV)J`!Z9dqDm{yOh=OyJ5^Tf{o|MWpnrx<-w*C0l_x*}W-RN9t zUBScxesU-NGnjLGdGi3Z=`ngT_v*lGr{^2vbGbgBCsW6AkMw1~YjyY){YX(w!U2Y{ z?uM2;pZGZ7Y17aYco`)X@CP6!kEtvErmOe*;}^_c0cqPiio>ZXjBC|9HonUqPw~&n zm09M5(|owmZr6ncOJav)PGoIzzSxt#OG<4vm7G>cx1l(U>GgiYxl9*VmIq6;LN&t;a zEGuN@iCpcKwBz@yzz3W@E`~7E{$6V+l%>6v<{`G~6V5icfeF(n<3hUa2Gy{AEAZ2J6>x$F?TIP4C~?*)pHP{5eZX zO}E=-e73)TaXm1*q9sqRY@HqFFD_`Y@qY}k-gFT*Z_mO z`(lf`ySuv&zPP))yE`m{ySqCqwzxYizAWzYDZg)Hi&kko1j}dYV8m!W z?y);o%f)ZCEotypU9ey?yRHA3EZ>~&z$d3+-5Bs6% zwcm1bJ2z~4lwrYJm||=G7Jife_>ZwV6TL)nx-X!ymIX0j3BYE^^pvmc4nX_2itg0nD|&3DrGmg_Nv>{7>0=H8_xl6)wW>5%K_R3kAy)==Li zth5d|hyF%2ZJ`a(`QKL-koLXKSHxB@eis62Yo6fJjAg#ypwDt)2Kj-cU~GXET7`D0 zrU9TfJra%~8W>eubTmAw8Ak_vKi}OhzfYKq<5z{s?|-Vzop)V1^l9>ZjC7FeuwFT; z4!;apYyHM)&SM3!s(!N_u)@KkVYWmdq(-nmuxtIMS=u$@7=;HUddV>hQ#w)!0R(q8 zZPgIy<$c{bekDASO`3{twc)T(#th&X5%Su7>4%o=TZ z|NhieZ6A-_6|=#NXe04-NT*n}0?fFQa<{Y|k+Du$H=p|5ThfUak(RNrwXgH{=SAqg zzAVgif`n%G-=~;?;XJ=~dm|56ZLDAMXEdDU);cLv?1aBy$*F1q?N*_sz9Sqm+M_QM$roao{$5`l0`&3b`@V?b1E?Bw3bT$CIPdtgUytOBRVqeDO-ky5j}I$ zG%Gqi?rtX}Mb6HXkcoJ7;eI}*X zoEKcYt`J<{Q_GV>c`zpwKPCm&Q8o=a!{2c`I3=|xa;|J(*Vgu>7Fb&8?tN+Xh}$$B zWktaNG=3ywOmU@I!JFu;#g4WnYo=lxltR>aW8t#2+L-KyQO@~Tz)G^k(cpw>hYm=n zv6LQWAsR9mR(#D-mRm%idhV+*h&ENin+)klcpwBqY8^t=hcoUw*H+V}u=82!ssC`+ zyouMeR980kEOHJYFr@5mYvkn#&c5i_9dxyx-M=aHZ?s!*G0C_8jx9>TZMedjl|K?e zCt$q`xF1`=F(E+G$Nh)h!ZY{&;4=-J{Sw>4GMzb#ki z$=kdtXKnD0EjK>r1c=paaP6E4M>jp-jwqooP9Lfr@dk6+Y=CSt@npv{C+qaJwSFns zf;`)TIE#=(Za6aWaL3q-RGn^^TuPKU!AjCtA#~e)-xwyo-)*1vbrSepKj$dRKABm= zrj43TCxoP7A}KxR0FYsx+S-AfI!P9fDQ3 zgCMADO^9hxRHuE`bx13);Jv0uJxxOCX!_li<9YG)`BW^0lI8G%c%gdlNzj#d%=T!K z)}Vcm%cR}Yc@S>Ztntu^2L3izNl{eBuSoGHI;Ey!6X)5ou6w6r)?y9gpZW%FkVM-4 zyff>MCWPQyZrKOx=Kt%MtJjmK#-TP|7ny3r4uayCsw7x(kSeAdU>S9KC1G3F>+3)8 zpkhKr@2rD3TxSLzl^tD)W1bLTr>#()(`HR0TkE4eOj9eVa|ZKyxPt);A;G0A>Eyj! z&j|D_Or*(}?E8}c^vzrW3vfA7lnL%lTilHDL?^zc8{b$wvG3RyA{g^JB$H!I-KvGn z?O>KBz~@TG#$EqzzBnn(JZtFSqVJL>^jRGBQ6nCKEyAeAgj}(vG}H}4k}Pzb990xb z8fqMT)}n*3X{s*%-_rV`IPp5tAM>GU!l8cefo{QtR+D+4&ac9hRU~3@Em-9H!?rh8 zF7-GQ7dWL>ydUzxfM7j)_w`#h&}GMTIKJkLVa z%jO~!Z?Ohr3e7T9z_*Y-tja=Fj?Xu462~K)wvZ?0*%+iq9t3M-nuOB*#U#UW zESCcy3(CtyAem)9vcm(tG^?Q#H>iuiNN1l%mbHott0Bxs`Q#zBO@6Z2g=bE7=FIE)HJ1ddIB_AmNcj(Klw3T(vy6Y?Mw-*DA1Q%NuTkk*BNyYfb8uTw#^NFILAH_C@>zqOS z{yR@s8v zRoWf=nRl`^=mwu38LJwv2;d^v%kgw06OO*(ek9S90(*_y3w-lb^_}Jy>l53)Cpw;; zC^4yu#~_1ZMZ+W|7gaTJ{$EI+nA#W8=ajt9ZfqJkIub~f?-Q|H7oVPXVBbs_o%Y;VAQf))2FM90s!Ho~EWF7P74KoL z0IGOuQu5c4Y{kgyc!H`}Sql)(L3s;X_cl9TGy?tEr|vc2TN;y|(X`f7S+>wEp2?Mh z^!_5Auuv0!vVk^YL7XO1Zl=n_iYqbRpRa*2sME3Xt^{~P>r?_2rfB3-dY@4psq}h^ z`A+SuNTN88z3MB~L0;)qZusqPEF;^Onl0YCuiN6^?9K4WSGifiA>=#9tVBTQnm`T^ z$Z`xXOrNDS%v%JZxp&EK-+L$o4fqEfcMp^K1KrxeY|du)HcjvN7=74PDmmO zIX)KP>LU=voX`@IDvp9pB9~iCk;)^4ngzz|AZLSlH z^M@?=AJOc0C>ai?tbF7C*BXMvMTsOEw1=vx?}!9iePjpOqd+6;%Lgqxb9k>O`D8h3n0(C z^`RA*w2f7$H809|^AY^b)TY{xANVx_z^<`YU>9S^NQfG*yf6|!# zuU`<#$NYC7$*#5jxY{k0m)7jA@f6GC{p4PgwE+OzRhn>{d#hJ|I|o4p$>{1zK(KHK zVN)>iBZ!)^DsVE2@r#8$b-lTaI}?;JQO}f-I;b*#?Db05FsAtP;(GgoUJFGD?m%Jz za2`Q9sz|)}^Tfh`Fbw`D8IgFZi{AMAlny&sZiSB#s=fN?+}xIWdM&HN2~3)Fd% zMsqR?lyD~U@tEgv2(d7+MGmzqsWpKjjoon-s(yTrq{6v54efk8V=3KA2Ysx7tNv7- zmfUKFYfJX{kOJne9;^P8#I5*#4+<_Y%^mTQ9H4bRZBMZIDTm5d63(PQDnfuFsevsW z^_b#Ed;q4oK07b^@@Y$v5G#e4E?RbJPjjW8tP+5%h?^s=NjG4qLXeq}rP2Ao`YUr> z^^M80sJseNkY{_ZN;u7`d-roaSEZZSw&rl ztTS9$<7?JSClv){n$#Yt**ot@qk@|mpX^Bqo0B@BA!Q;nPm$AI2%-zw5eR`4G^ZE{ z21jeeW5s7tQ1-NUR-Cv)fMhj+keMhLRmWKI7+60M4y&rWGF?QZy9YGFp?0kil9$zZ zNhxmWFF)%0aYCTK*Locdkp6(0wsx(w_9SgRc>Bs1(&fhEok4S;Hu+arQvZVd$0coi z1-a;^@T!QBt##;8_<4wD&ySi-Si<=(;_F%Fe3>|oUma#FY!TvvuRh7x7nzoFIR@Gm!7ajc@N z+HRViMTO%eHX{k#8Yv;Ryf;!R-U=K69Lh9grGs0zyplaa#(VK5t@X25X-~umWQFA< z7DN&u5Y_@h$qWP+wqme4&8N&_j@rlH){ZvcsBLYO>{-39BQT>R>tM)iepyqm z1b+ug;C;$N7tU0F2f58H(Q=@~^ zjW*28^$=ETHGl`+lWH@%nOgSRIoxQMsc0uiz_S|#Mlw~RfMAs(C zvgB=;-qCag%~4R+9?!%7jZI{V;NY_)MIZaKgQGWO#&BfXG2sYYZT0}$<;`P5jgKz( zr;voPRm8nG#<$8Nf)9BnbAQ-@TRj%w z&e{_l3{G)yL*4K0&~y_C-A7)5f;_S{85#3|U}QtX#u0v4Hz^$`X9JK%4>0sR1A{6h0(cm7bblCw*D@Bq&OeE8)aON`vhGPv z!Hosw9x?)PF~0c#Wo#T5eCzKso#f_KPXxet9wk=`1k{|+i7v0w5idNC%B>LJbL6vA zgYV;^FqFKbg|$SfAW__d3KT9EFJv}0GH#^qY@;D(sP}Tdinh2!w~KMNt?eR(`*hyI zSyKvmkba6+=4K3OV}vWE8tkaBghY5`l(f4c-uEDLT%H@6gP)L02^6!VP5+3Opox+i z=7B%LBSvW8JAFDPAyfVlkh4jy5HH5Z0KTH4sJ2?VBi$U7e<%#y{>))*|LF_dW%>m? zDm*42B!b}Qgpbd3Qbpf&Jh*nx2%+RzvXo&Fl{_FTVs3^&YZlPZ!xr>IKQZ~tkIM&l zamg2p^uCLmA|%gXPC!wteEGZ4B~RH>LJ)=@lW~{;_!(GMak;#HDNwb-k2A@Dlwg|RGWDX*jj$(c%pl_O8*$;U!Tjbwne3AuT;g&|m zhJuTTHMusd^$el1c`{tK!&FjZLJmCdwbIf1@9#Wrw7;2VZMeDuwdOG*9<5@@T$FF6 zFE7(}JPw3Yf6FJXaP@6?oqe>pEIxrUcO9<|{O|AX^FD;PUET*qTu0Qfy|y}?{^iJ8 zQS+>OP|-L?Y7vI*N4k8Kk9VUBJ6#FO|qd+kKToRaA98*5JUI6_j2P%qU521XVWtgOrIAU$>_ah-u#!z{x@O zUf7Lz#Q5gYN89HP_vJo8`aX%({-N`Gm^}&B2WI87f8@{cO=V%!$N8xNf{vbIBEj;= z*x4^F_g53ahz{|;2m?T9;8#QNe>4&3WUQiSU+n{FaB|^1i%R35$o{pHanQ~GNe%eI zJcDj8hJEs$9Sz`J(?&r%=0WJrEfA!H@lzx5CF&JvXl*LseYvY_?6bIHkGbLqmY4qiZd_ioNckec%&*8-h1x3 zV&IR+9E%pJ$ApxcPOc^il(nDlR*6|#P@AS~k5{t%%yTyv9rN2eMd-qcJb*=q zWc7^CrtSDNU`6AmP6)YK8Yvt{Q4bWmJLO{1pxUNw+!jwUhrV^EiX81q858msTG*wj zEe3?-qD)*HEd6y1Q>Qpcj4e{H@DaY3s+v}No~t?K$~5FVo|8jqXfE@M=8^4?fwAov z;PF7$WDRZ07FLt06-2(%0F^1m0S7NBP?6{! zw(vy$o2m}e6;)Z9*aAf>NG0S3p^7}}562LpY!#Y2E!jD#m9okw%e|%A9<~l2S?e}p zT9T-Hb4t-IU9&15TpV!_ixKy;#`-oB5e5!*Tow6XTM-LWE?Q=>uC@op458!<=aWP$BCd)lB@I@sj}z&|qnKUP&xXPVPOV)TUSt>i zje)HMwMp=mmFWSJw|+BM7Tk<$WxAk8RCv*tR*=n9&RIPys@R1Gs!oOjPlT>yG&U0S zF@jOUz{xSjwr@mfH=3;Hp!*3%*`H#GAEpFV|6&IQtLs~eDpBd4I-+%~MHMa}@pH2J zen?B|Z9re5Xu8>1(uy!v-2lMw)pbW74cMBR)fM8FxQxW)iVDlEgW2%Ui zEK0*wH7YEsh^s$cFX+4P>coM2OND83@&>&(wPdD`MtxELZZl7ns-0|NymS1Q`4kA@ z>Bhg;Y}t%=A==JZ)3ublx)|^rt7n&IA72cvk~VGPR$E6E#fw2uC59EMOc|MWn=T;U z^Iluzb&B(#a_h>)7FIJ{v8x-Rks0G4L)dfcNwk=(wC2$6F}#Z9=oOvg93s@cd+-UH zqT6ddx7VJ`I5mDt5~U$fhb;u@W#B;;W@-c zh|_p)Av;*E71XU@zlBljPU6K)c|>uM^A>X#IAOSO+E?7!n5TPa9QiEd>a$0(*fDw#wiy))RPnkA)u0g}2c$mC z$;rps<>v$ezOiay2Dc2~Xx0ChCLVVEP+AL?RnNRved%j^&~yOppy@TN^Q zxg#8Y$xYNu<`ozFU7h9~KZvFzgT(Ygn+U2U&r|%dk zIx4uMz><#2vOu|wC|VW(GAergLcko9F_GGsNey4lEbA)YSXT`K>=*xKh~Rm;Y+2w>|yEY2!`qmxs8}&h?~wrPtn>Yanm);^0)Z z`rBg3`dPqYK|#x6BvU+w&*d`qT=8TW9Zo%eumgs8lWwepMgsIhq`qrd$x z5*~!>y+7WRuQtza&zC+w%4TJ6{Jh<5bpQ6HIvP2Ua1J%ON1pndB>6n^dKk%m__hMY zNHFd%h7V4JQqx}QgrP2oK+e23HN8A85jI9B{ufU|w!t}vcj`yfyf==^FMUK^*n2Pi zJf?UH+NjC7+Q?UfrEZIn!ni^`f&Bpl8m#-Q24sn_LVZmBmQPm?3fi)*Zk63D?JmPq2C-UH43SgHR^!ERp}n328?qmo=8)_)qXU zO7H?4A@OX?>vQ5HNz!FnOF zZ72~Lz4mnE6)Uq)U@@%kA_Yj{2BY_|9uY2N9+&Z@oI!u2dDG))k;38&tGDh}U^e*<5Mho!;A z9@e}Jp=B)=t+MApZ{d0bRO#}GP8?g?HC#x!8eha>fC>cCOlQ7F+R4~--2!W?r}V9M z&spoW@Xp*4$Ut1YW#bjJ{i&-m*Oxqh@;1GjLc}Y5uVhev@Pj9&jU>X7wtLvZcEoZ_j+E>iG$tAcpyda4qqNZ)4u}Q0|>&2S6q^4At;vTzN@E)(^q7OjVL=mN%XqlybnZbyZ)< z6YST?ZP=gG+*OHK(P9&O&68`hNN`K&b1bts8@3?Ge|EiLBBO_n)7HEHg5kqwhqRCN zqa*mOxqVyTSEXF;3fNWsd9M87XL}s)6Uq_P_Wkc!S6eH)h`9KFcZ;@LzXjg@V%{y7 z^Wh#CV(;fMAo>qbmGChAS}ffC5K-XihSGE~6HxJ4WaZZWz@T4zSaShRkkt+A;5S_siHy4=) zIq+}wleP?ZK1K#f$MLrt>py4+7`STdAT)+fFQQ*osmCYaHJu)Y|u zib4@zUg2T#o^A6$XHZdA>06d9qBMJZQ@T_=h_Zu_1JM3Mm`zsIf-8UHs<2vq&UgPG zU|?~yy6%BSnao)%>=Z31T&h$v_{;5DZeb&whKCWdGH7j`1*LxT6!su8y|GFvYgtg& zajE%dkD?&jLr~El1np~CM2q0XAQmv)J!u-?1IC=?J5`5%I!9?5hY9i!BBMFq1i&+I zQM(e)Nu$sW(VRdaoRbVEJdfQ+sZe@pYos4Me#2R&$W$m4v-5I|h!GAOpc-oO%_dCH z?7#-zuI9YvLf_w~=7fV>#1~DyJGRp_jORhpIwnn1!-F^Z6Rxs!tV?+K^P@QCiub<;G9udgXwYu%1&sVj=C0$>Vcyb z*&P+%w$AIXNy0|9x`w?EsX`U^hH;-e2STrX0p>^ z)0o_(c!AZkL6`109#Ci@(^-cBv)*iEiXn`nk?bn6RVh$KYnmIU$8N7EJEEZ}K3yd{ zdydYjJ$SLq6!Ddz_rM0$Kzve%v=bX9NA5b<%skYB%)n#Q!0fyRY3OtSh{8% zZbhHkh7#OzW0QoU9m85LLKQSDE`j4x$RLOJ8`veqMEploQ zn{uOI9AL3x1WifOF;;2Z3<4+2D;ABvaQ_j5er4Gan z5aBDUDN{wJnBFyxk$l#44a%6ZU-14toEFA6O|b3uZ)W;N!=aLQH5P-87 zk^5%;>|M%{Ut9wj9x6GWSsD&qHK;{fF2{oIDV+iD-mDto)NMmc%77pAZ@f30rk)$SI%b{*B2><}77%Erf7A+#-9r$&67);DA(6Gqp$zaaivA)| z;`0S75VEUX8@9r3MUmQ(SO*d4yygKL42!h8DF4)2k3yzQ6h~r+%&jX@&mZs@^C!*X*?5gE?ITR$(7&=#x6VowblX6Z(dqIFP)adx# zUsEwd@6(%^Kvd4-ko~iC znRjp!+Mo|}{Udk*xBJ?pu8Et;423WlnO%wo%ifejP&AW!AibiNFbV8xqeHjlYQ|dO z54v#csGg?7sfkXXn8u6Hdv&~3%(*62kIS11{#(J95l&8pm~2gfsQp7eQ{{XCw7zkA zf*d23lg_-I3Au+5QwgJoK1DOo)HF0nNTCT$>qa*U-AKnQKTV~Fi9`yWBLYAXg!|I_ zqq&;IEz2;E_By^_Tj`F7HA6>AVfOHnw$OYcz{LSnG=NrZpSkaSMDoPo+H2hs6WWJu?OvT=wN3xIx7g`hJm7h#pB+ar z^gKf8Nt_WU+bUT7L;cpr9GVztWvktY6w_%+^6de3$th5r$U{j(d35$_GvZUaTXna^ z`K!{g?*827ad?9Nc++_9ukW2~tlxyS@cZq|tCoayE@< zOcO(H)1jFeS60@oX?-{FTvt-$5Xb=y} zke^b7Xr|vG+*&-|7Ir1Ma?wo`-ogEwqasG#LBuNG9o3?_f9?FR&B}9lOmNy&_PW|R z;d!g-bufK3YHi9hV)&wz-=E?)fp$M8%TAbw2YuYkOd?2BrKH)P(b!Q*g9+>gZPFVegq45lv(^={9o0Z;@u4d-?RV=oM1#BYH{?a1Cq|nR#1Wwsxn2-Hc!zf*ulRfh}$DhVn5{6l!^&xaa$4>lU0ut!D3pZq# zWkDb!BZ+dBL0cydyWKtJ`^wo|LN0SrDdGZf`OPYYcc~&{ur99B@@zk zEDOqTM`U~CQa89YnoWsL87;5!EJf%8f{|;A3h8K708Z1uuP%m`63D*}nt*@MQx6Xm zF)&wbg^?(Cz}zJRI#RB#zUrl`RI@(U7M%%{ip%i z_DY(&{EWk*=axLGZ(4yNPp0J^QVZI);og_3NQWvNs#-G#x9BxzJ8>E=tGjW~HAu_^ zYgh|El|t7zU`s{r-=Rz`kcrfgNZjuAQV@2k$Yb^DXpuF_GFm|!><&3B4x^bum1~Mz zLt9CID~RBz#p~*LjN$qnm0V}Ml>W`+-+=7*#!>xTJuTjIyA5YEoyRO`+gX=t6~vvj_DNC z3SKj&BhXZ-bkts9P@>FN`wm$)%%50;#8?#07*SN*zLn$MusOUX{*`+~#OWh{CZ>bn z(9dVtFKZEYmu0Mdq`Dl{HIc#69e2dmO=ZAOH8BkEf#GUk=rTf;A#F}WYJe^X*`)4Y zSjw&d$PH9v+13G(8?9F?k$$8H%S9yZISz$ORjV`%+PkiO!b^p0^x4<>836~tA~8h( z8XoYu9MgrsE8X&fMY}rj*!Si19@?lPuJ170N4y@Y6;qTdPnr7n~fGua%adnj#SQx-R8aqr76V4pDo z5cd43FXqMvuOk2_P~t&I!)|@}Zt0^yDY&T>%c^e}EsJ9?D*!8Le2sS1O~)ZdsK9yT3`F&@{nzL^Iv45&S+cjd9@3DaNxrZCxt8bM^!-<*r-2TXU z)br2wb?3Y7jvwf3r}z2cFKGI?b8)QW@8jOVn}l+p^~X~kv7eZ3*1l5e!I9HT9SMii zr{J?+$=UGp)2nYEt`MsCVh{TT$kA|g`ebS+@Y@~F;cAQXh3fD`^E#?-;%>{lS%NSp zpVM>ayYKbp?+*O^cI3!JT@as_(R%?Akr7F30q(;moxOTJ^{BTrd(F;sSI@TZo%l{u+#C|>`$ZI1G9+FpIiR{xM%MCh(6+_xnJ0N;H z2I>szn4=b51usdv9D9;27aiD$dZq?6Iuqp_&fdge%dh-i7QX8w7GX8b6d*mqIA0}O zvUE9E31@07OVR@uhy1Y=*QH7jfZq?to6FHx%wowq>v)!k#~}1Xe2jc|=Dv?}v*oqn z>*M72Ebdu*YhzjZJj66hJ@%W~VVoz{yNF(~bMcdQFpoEYR!Xh$EZE($V1L?7eJ;Sy z=Xw8~WRLs}c~P|xT>@7+EW4iBM~nXvB(C|LYU*c-wjc!G z{FIyeoC7+$8b3Bnau=5lb&pyNA@GXLbrIz5T*d4E)Z=--3AiiIoB6&;jNiTUAHWm2 z-Zd?%deoHWp}J>J1yU&{;75tw!D4!p#anN{dk)F6JWOFPp$krOL&lh z7oQivs2d27$2>Er0FHJII#P@A^raj5j5&;$H>==^ztg*CvJIsd?)#BFn?&XnIlgj!Aj>qsX;vSh&b+`tBQww0-qvUVyV7=P3xLD#Y%W|8B&`U z9703}XEPn)AdcVtd%WBtV)l~ThSSA`0N&i{5Yi^$eF!i^1!p>y?+xsUX~m|(#NVB2E`#VbVoJ>{cBjVV_^UwO0P1gG^DPL9o@*ummH0mgya1| zV!@drLegN0suZhOxqlUdu{Sj<9a$3Ym6ZRGuro zC^;+9b`XXWe_sP@^4IO(W}jD6F(6g8NMn=}tyXik#~6hoIftg209qqjE5O+_I%X0; z7iFedb(1Z!X75(vZZ}jd|5~YeF1}*Km{Hk-?qpZR0_BM=fk*&lU33adfMFBuJ-!7^ zNZzOgMi86PwzAry`Q4~(h&5k~^=)Y6*Cq$bA9D++M*;dJ;2R| zUdCVOkqqs-S!myKA;&fl92@!!QY* zW5A1uXgcpZ6JD#XHj}A}nJFYQP@{D}`#$8Z!RDV8x=3pXW&8(>;pDj?93!!Umt?E? z-n1PTO6d2t9dUI<5*TP$y+L%Dv^?4za}NiNUTUUX1q>G31wii{r-cV=MSRgw4yX;g zNDW8Tul>~_kMUBQuGytFe25iFk6c95I{9!|^>k4i6{e`Fo;~G>IjYz+xl-TGpFMy> zD}Svu-C6!p5StOSLhT#tNQb3Isfa5gR9(^wUf>5A)w2y&{~@?e3JHzqJ>XhFpwB|o zji{~Q$;0%5{Eb+v4ZWVr+@m2V8ryF}?17tCgM-sd2e5*6t+1Iw@G{0$+u+2N$;GPZ zN=L$-#v`Tdh->5Opw&=kw^@nwRw_2$GFGRx_nrzUE}s)!inTQf;}T6$+LQxL7F)=i z=oK9z<8dBKF7gDyDoBcth@Y6xZ>XfA{0ES#TSi1lh5Uynh+;6Z zLm+~6YMd4V2VY%FIODLaGR^m7%GOdD!a5_|QGz&}1^e}HS3sCeyxoS7o+}jdvZ`2+ zx*PHbwXnK>B_?>w11>2-(L8kOJ5A)c}zYe<>4Bnk1VT8*mC?yb5jpgFVEc>T%$ z*`!HY?6SgL?}6!QS+?nXm)65UEI^H{(hPK~9OGYK8hlNAm_yh(utQ=lzKriM(MWHc z>(EMV$HK@$hQ+#+RV9xJ_!W@|;+evnXv(Q2K1sV9BV zlgpaiq9JsV!Rc$-gY1Sh0nYUJ;!7V&fe{N8TYe@TJYY_Q2(1F+)GDki!8X-OhX-02$@}i&iB* zmMuB-yJ~XRTokU{3RPWrqn=0baVtZ*9+`-+wl=|FtJL|At^BgC0UUpBq|fb z+>#=pg{nbI&==q1(yn)@n&YhjlM0S)dE=lAjRrd>#ugGML4w7n7$=G@HVS8|qoph_ zCbOC58&m2Az}>s1`t2U$Cp}m4d=zv-5@cc%I7r26^Q_B%1AOm*0J+w&9*6d0^*2Vm z+Rp91^Pku=NBufdilBeaBHvr_9SB93=+UCNWdQYtVyzN_%~oIrHAHBsTIFv(L*mH8 z&;dHH4h6okcn#4A8>I+>ylU-^+)4??s=pqnb@t$0;mv_xg6#s{*B9UB1A?y{J!|K5 zI*m%TQn~-v18wL3ED|}TluMs!=8lm6e_j3m*wDy8%?F*XTMH=`^~Lq&u|H~NR@n4t z-#6=UcY_h}kee9oW>sj5Z&yCI-1)+_Jp2vBeh?yn`YKSh|F3^roc}_3saF6e@Y_2v zbL-5S;`yrp4vT1tvtYLM-D!(*-oK8gZ&I@G(iPW$_HdXt*Fzdn z;Aw@>%Lp|mBFu7h_VCR8FKCgm%E5O=oUbro&T)6GkJyjuY%4?e=n84Yvx57~kG+8I zu7LK^dFc1gfT7t$g;gl-)o-^CzU2*L;S_h5tUqD=Qy()`$4h5=1)uQ+c11eu;p4o0 zmpFLryk}E)LzW+Fl+*eMQR81Yg_uCjeg$Y7j&%?FT*6EBDRx?;TT~`1p>(Z?DtRSX zXMQa*Y4|^yk5Q2om{Y&Y;g-uCNt;+A>Q+`fXA>=a?5zn%@A6td5}QVpa@y2{KEOA! z@JUZET8mZk2;+YXVXEbp90M;pfpj1)elcYP7tIZ#XmOwJrR^>0^xUF3GRtR<1d(mm zrxji_*5QvqZgL-66Y@oSv^8Hvt6?luyE@W}0LBufcC)~Rb)}zv2#{{Z0Eh>+(<}}J z_KiA1FL8(sy!wC3>;_*kyG5Ki7f;yrZcd+XTbrr%ZoY9lZ*0ZICvV*a0zOZ5*fIAB z?*u(g=bnbCftUww*~L>E_Gbh=E`LTfO4E(3(_h}UK=u0f9rn-2znRJjTAVn^dT+M= zYMia-Y7-v?9Ohnew!dOR{V`#~*L38%6^uGvY5y^rG#cp1lWydY^Mv0qn_|EB=VJTY zA$Q+|kj&Y(u=aSp&%Sy+Og#}_{%Xng6=L0FF6MK*A+Iy%o5u8s!SP4k@pwOEZA93! n(35l6GkoV*ErH^GOvJk_0 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.length)return;if(!(w instanceof s)){if(m&&b!=t.length-1){h.lastIndex=k;var _=h.exec(e);if(!_)break;for(var j=_.index+(d?_[1].length:0),P=_.index+_[0].length,A=b,x=k,O=t.length;O>A&&(P>x||!t[A].type&&!t[A-1].greedy);++A)x+=t[A].length,j>=x&&(++b,k=x);if(t[b]instanceof s)continue;I=A-b,w=e.slice(k,x),_.index-=k}else{h.lastIndex=0;var _=h.exec(w),I=1}if(_){d&&(p=_[1]?_[1].length:0);var j=_.index+p,_=_[0].slice(p),P=j+_.length,N=w.slice(0,j),S=w.slice(P),C=[b,I];N&&(++b,k+=N.length,C.push(N));var E=new s(u,f?n.tokenize(_,f):_,y,_,m);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(t,C),1!=I&&n.matchGrammar(e,t,a,b,k,!0,u),i)break}else if(i)break}}}}},tokenize:function(e,t){var a=[e],r=t.rest;if(r){for(var l in r)t[l]=r[l];delete t.rest}return n.matchGrammar(e,a,t,0,0,!1),a},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},/\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/],number:/\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,"function":/[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)[^\s()][^()]*?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/,inside:Prism.languages.javascript},{pattern:/(\(\s*)[^\s()][^()]*?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)[^\s()][^()]*?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript; +!function(e){var t={variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[\w#?*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|[\s;|&])(?:alias|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|hash|head|help|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logout|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tail|tar|tee|test|time|timeout|times|top|touch|tr|traceroute|trap|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip|zypper)(?=$|[\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,lookbehind:!0},"boolean":{pattern:/(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a.string=e.languages.bash.string,a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a["boolean"]=e.languages.bash["boolean"],a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation,e.languages.shell=e.languages.bash}(Prism); +Prism.languages.docker={keyword:{pattern:/(^\s*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)/im,lookbehind:!0},string:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,comment:/#.*/,punctuation:/---|\.\.\.|[:[\]{}\-,|>?]/},Prism.languages.dockerfile=Prism.languages.docker; +Prism.languages.json={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,"boolean":/\b(?:true|false)\b/,"null":/\bnull\b/},Prism.languages.jsonp=Prism.languages.json; +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var t=[],e={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var o;o="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?(e=document.createElement("button"),e.type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a"),e.href=a.url):e=document.createElement("span"),e.textContent=a.text,e},t.push(e[n]=o)},o=Prism.plugins.toolbar.hook=function(a){var o=a.element.parentNode;if(o&&/pre/i.test(o.nodeName)&&!o.parentNode.classList.contains("code-toolbar")){var r=document.createElement("div");r.classList.add("code-toolbar"),o.parentNode.insertBefore(r,o),r.appendChild(o);var i=document.createElement("div");i.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(t=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return e[t]||n})),t.forEach(function(t){var e=t(a);if(e){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(e),i.appendChild(n)}}),r.appendChild(i)}};a("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var n,a,o=e.getAttribute("data-label");try{a=document.querySelector("template#"+o)}catch(r){}return a?n=a.content:(e.hasAttribute("data-url")?(n=document.createElement("a"),n.href=e.getAttribute("data-url")):n=document.createElement("span"),n.textContent=o),n}}),Prism.hooks.add("complete",o)}}(); +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.ClipboardJS||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.ClipboardJS)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}();