110 lines
26 KiB
HTML
110 lines
26 KiB
HTML
<!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="https://www.sitespeed.io/img/ico/sitespeed.io-144.png"><meta name="author" content="Peter Hedenskog"><meta name="description" content="Tutorials and documentation for scripting in Browsertime and sitespeed.io"><meta name="keywords" content="scripting, tutorial, sitespeed.io, browsertime, web performance"><title>Tutorial: Tips and tricks</title><!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(baseURL=(baseURL="https://www.sitespeed.io/documentation/sitespeed.io/scripting/").replace(/https?:\/\//i,"")).substr(baseURL.indexOf("/"))</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><style>article ul{list-style:disc}</style><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="light"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">sitespeed.io scripting</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-tutorials"><div>Tutorials</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="tutorial-01-Introduction.html">Introduction</a></div><div class="sidebar-section-children"><a href="tutorial-02-Running-Scripts.html">Running and managing scripts</a></div><div class="sidebar-section-children"><a href="tutorial-03-Measurement-Commands.html">Measure</a></div><div class="sidebar-section-children"><a href="tutorial-04-Interact-with-the-page.html">Interact with the page</a></div><div class="sidebar-section-children"><a href="tutorial-05-Interact-Browser.html">Interact with the browser</a></div><div class="sidebar-section-children"><a href="tutorial-06-Error-handling.html">Error handling</a></div><div class="sidebar-section-children"><a href="tutorial-07-Debugging-Scripts.html">Debugging scripts</a></div><div class="sidebar-section-children"><a href="tutorial-08-Setting-Up-IntelliSense.html">Code completion and IntelliSense</a></div><div class="sidebar-section-children"><a href="tutorial-09-Examples.html">Examples</a></div><div class="sidebar-section-children"><a href="tutorial-10-Selenium.html">Running Selenium code</a></div><div class="sidebar-section-children"><a href="tutorial-11-Chrome-Devtools-Protocol.html">Chrome Devtools Protocol (CDP)</a></div><div class="sidebar-section-children"><a href="tutorial-12-Android.html">Android devices</a></div><div class="sidebar-section-children"><a href="tutorial-13-Tips-and-tricks.html">Tips and tricks</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Actions.html">Actions</a></div><div class="sidebar-section-children"><a href="AddText.html">AddText</a></div><div class="sidebar-section-children"><a href="AndroidCommand.html">AndroidCommand</a></div><div class="sidebar-section-children"><a href="Bidi.html">Bidi</a></div><div class="sidebar-section-children"><a href="Cache.html">Cache</a></div><div class="sidebar-section-children"><a href="ChromeDevelopmentToolsProtocol.html">ChromeDevelopmentToolsProtocol</a></div><div class="sidebar-section-children"><a href="ChromeTrace.html">ChromeTrace</a></div><div class="sidebar-section-children"><a href="Click.html">Click</a></div><div class="sidebar-section-children"><a href="ClickAndHold.html">ClickAndHold</a></div><div class="sidebar-section-children"><a href="Commands.html">Commands</a></div><div class="sidebar-section-children"><a href="ContextClick.html">ContextClick</a></div><div class="sidebar-section-children"><a href="Debug.html">Debug</a></div><div class="sidebar-section-children"><a href="DoubleClick.html">DoubleClick</a></div><div class="sidebar-section-children"><a href="Element.html">Element</a></div><div class="sidebar-section-children"><a href="GeckoProfiler.html">GeckoProfiler</a></div><div class="sidebar-section-children"><a href="JavaScript.html">JavaScript</a></div><div class="sidebar-section-children"><a href="Measure.html">Measure</a></div><div class="sidebar-section-children"><a href="Meta.html">Meta</a></div><div class="sidebar-section-children"><a href="MouseMove.html">MouseMove</a></div><div class="sidebar-section-children"><a href="Navigation.html">Navigation</a></div><div class="sidebar-section-children"><a href="Screenshot.html">Screenshot</a></div><div class="sidebar-section-children"><a href="Scroll.html">Scroll</a></div><div class="sidebar-section-children"><a href="Select.html">Select</a></div><div class="sidebar-section-children"><a href="Set.html">Set</a></div><div class="sidebar-section-children"><a href="SingleClick.html">SingleClick</a></div><div class="sidebar-section-children"><a href="StopWatch.html">StopWatch</a></div><div class="sidebar-section-children"><a href="Switch.html">Switch</a></div><div class="sidebar-section-children"><a href="Wait.html">Wait</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"><div class="navbar-item"><a id="" href="." target="">Start</a></div><div class="navbar-item"><a id="" href="https://www.sitespeed.io/documentation/sitespeed.io/" target="">Back to documentation</a></div></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section><header><h2>Tips and tricks</h2></header><article><p>Here are some tips and tricks that can make your scripting better.</p><h3 id="include-the-script-in-the-html-result">Include the script in the HTML result</h3><p>If you wanna keep of what script you are running, you can include the script into the HTML result with <code>--html.showScript</code>. You will then get a link to a page that show the script.</p><p><img src="https://www.sitespeed.io/img/script-link.png" alt="Page to page"></p><h3 id="getting-correct-visual-metrics">Getting correct Visual Metrics</h3><p>Visual metrics is the metrics that are collected using the video recording of the screen. In most cases that will work just out of the box. One thing to know is that when you go from one page to another page, the browser keeps the layout of the old page. That means that your video will start with the first page (instead of white) when you navigate to the next page.</p><p>It will look like this: <img src="https://www.sitespeed.io/img/filmstrip-multiple-pages.jpg" alt="Page to page"></p><p>This is perfectly fine in most cases. But if you want to start white (the metrics somehow isn't correct) or if you click a link and that click changes the layout and is caught as First Visual Change, there are workarounds.</p><p>If you just want to start white and navigate to the next page you can just clear the HTML between pages:</p><pre class="prettyprint source lang-javascript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default async function (context, commands) {
|
|
await commands.measure.start('https://www.sitespeed.io');
|
|
// Renove the HTML and make sure the background is white
|
|
await commands.js.run('document.body.innerHTML = ""; document.body.style.backgroundColor = "white";');
|
|
return commands.measure.start('https://www.sitespeed.io/examples/');
|
|
};
|
|
</code></pre><p>If you want to click a link and want to make sure that the HTML doesn't change when you click the link, you can try to hide the HTML and then click the link.</p><pre class="prettyprint source lang-javascript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default async function (context, commands) {
|
|
await commands.measure.start('https://www.sitespeed.io');
|
|
// Hide everything
|
|
// We do not hide the body since the body needs to be visible when we do the magic to find the staret of the
|
|
// navigation by adding a layer of orange on top of the page
|
|
await commands.js.run('for (let node of document.body.childNodes) { if (node.style) node.style.display = "none";}');
|
|
// Start measurning
|
|
await commands.measure.start();
|
|
// Click on the link and wait on navigation to happen
|
|
await commands.click.bySelectorAndWait('body > nav > div > div > div > ul > li:nth-child(2) > a');
|
|
return commands.measure.stop();
|
|
};
|
|
</code></pre><h3 id="pass-your-own-options-to-your-script">Pass your own options to your script</h3><p>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 in via that context.</p><p>For example: you wanna pass on a password to your script, you can do that by adding <code>--browsertime.my.password MY_PASSWORD</code> and then in your code get a hold of that with:</p><pre class="prettyprint source lang-JavaScript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default 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);
|
|
};
|
|
</code></pre><p>If you use a configuration file you can pass on options like this:</p><pre class="prettyprint source lang-json"><code>{
|
|
"browsertime": {
|
|
"my": {
|
|
"password": "paAssW0rd"
|
|
}
|
|
}
|
|
}
|
|
</code></pre><h3 id="getting-values-from-your-page">Getting values from your page</h3><p>In some scenarios you want to do different things dependent on what shows on your page. For example: You are testing a shop checkout and you need to verify that the item is in stock. You can run JavaScript and get the value back to your script.</p><p>Here's an simple example, IRL you will need to get something from the page:</p><pre class="prettyprint source lang-javascript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default async function (context, commands) {
|
|
// We are in browsertime context so you can skip that from your options object
|
|
const secretValue = await commands.js.run('return 12');
|
|
// if secretValue === 12 ...
|
|
}
|
|
</code></pre><p>If you want to have different flows depending on a element exists you can do something like this:</p><pre class="prettyprint source lang-javascript"><code>...
|
|
const exists = await commands.js.run('return (document.getElementById("nonExistsingID") != null) ');
|
|
if (exists) {
|
|
// The element with that id exists
|
|
} else {
|
|
// There's no element with that id
|
|
}
|
|
</code></pre><h3 id="test-one-page-that-need-a-much-longer-page-complete-check-than-others">Test one page that need a much longer page complete check than others</h3><p>If you have one page that needs some special handling that maybe do a couple of late and really slow AJAX requests, you can catch that with your on wait for the page to finish.</p><pre class="prettyprint source lang-javascript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default async function (context, commands) {
|
|
// First test a couple pages with default page complete check
|
|
await commands.measure.start('https://<page1>');
|
|
await commands.measure.start('https://<page2>');
|
|
await commands.measure.start('https://<page3>');
|
|
|
|
// Then we have a page that we know need to wait longer, start measuring
|
|
await command.measure.start('MySpecialPage');
|
|
// Go to the page
|
|
await commands.navigate('https://<myspecialpage>');
|
|
// Then you need to wait on a specific element or event. In this case
|
|
// we wait for a id to appear but you could also run your custom JS
|
|
await commands.wait.byId('my-id', 20000);
|
|
// And then when you know that page has loaded stop the measurement
|
|
// = stop the video, collect metrics etc
|
|
return commands.measure.stop();
|
|
};
|
|
</code></pre><h3 id="test-the-same-page-multiple-times-within-the-same-run">Test the same page multiple times within the same run</h3><p>If you for some reason want to test the same URL within the same run multiple times, it will not work out of the box since the current version create the result files using the URL. For example testing https://www.sitespeed.io/ two times, will break since the second access will try to overwrite the first one.</p><p>But there is a hack you can do. If you add a dummy query parameter (and give the page an alias) you can test them twice.</p><pre class="prettyprint source lang-javascript"><code>/**
|
|
* @param {import('browsertime').BrowsertimeContext} context
|
|
* @param {import('browsertime').BrowsertimeCommands} commands
|
|
*/
|
|
export default async function (context, commands) {
|
|
await commands.measure.start('https://www.sitespeed.io/', 'HomePage');
|
|
|
|
// Do something smart that then make you need to test the same URL again
|
|
// ...
|
|
|
|
return commands.navigate('https://www.sitespeed.io/?dummy', 'BackToHomepage');
|
|
};
|
|
</code></pre><h3 id="using-setup-and-teardown-in-the-same-script">Using setUp and tearDown in the same script</h3><p>This is a feature used by Mozilla and was created years ago. Nowadays you can probably just do everything in one script.</p><p>Scripts can also directly define the <code>--preScript</code> and <code>--postScript</code> options by implementing a <em>setUp</em> and/or a <em>tearDown</em> function. These functions will get the same arguments than the test itself. When using this form, the three functions are declared in <em>module.exports</em> under the <em>setUp</em>, <em>tearDown</em> and <em>test</em> keys. This works for commons JS files.</p><p>Here's a minimal example:</p><pre class="prettyprint source lang-JavaScript"><code>async function setUp(context, commands) {
|
|
// do some useful set up
|
|
};
|
|
|
|
async function perfTest(context, commands) {
|
|
// add your own code here
|
|
};
|
|
|
|
async function tearDown(context, commands) {
|
|
// do some cleanup here
|
|
};
|
|
|
|
module.exports = {
|
|
setUp: setUp,
|
|
tearDown: tearDown,
|
|
test: perfTest
|
|
};
|
|
</code></pre></article></section><footer class="footer" id="PeOAagUepe"><div class="wrapper">© <a href="https://www.sitespeed.io">sitespeed.io</a> 2024</div></footer></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">sitespeed.io scripting</a><div class="mobile-nav-links"><div class="navbar-item"><a id="" href="." target="">Start</a></div><div class="navbar-item"><a id="" href="https://www.sitespeed.io/documentation/sitespeed.io/" target="">Back to documentation</a></div></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-tutorials"><div>Tutorials</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="tutorial-01-Introduction.html">Introduction</a></div><div class="sidebar-section-children"><a href="tutorial-02-Running-Scripts.html">Running and managing scripts</a></div><div class="sidebar-section-children"><a href="tutorial-03-Measurement-Commands.html">Measure</a></div><div class="sidebar-section-children"><a href="tutorial-04-Interact-with-the-page.html">Interact with the page</a></div><div class="sidebar-section-children"><a href="tutorial-05-Interact-Browser.html">Interact with the browser</a></div><div class="sidebar-section-children"><a href="tutorial-06-Error-handling.html">Error handling</a></div><div class="sidebar-section-children"><a href="tutorial-07-Debugging-Scripts.html">Debugging scripts</a></div><div class="sidebar-section-children"><a href="tutorial-08-Setting-Up-IntelliSense.html">Code completion and IntelliSense</a></div><div class="sidebar-section-children"><a href="tutorial-09-Examples.html">Examples</a></div><div class="sidebar-section-children"><a href="tutorial-10-Selenium.html">Running Selenium code</a></div><div class="sidebar-section-children"><a href="tutorial-11-Chrome-Devtools-Protocol.html">Chrome Devtools Protocol (CDP)</a></div><div class="sidebar-section-children"><a href="tutorial-12-Android.html">Android devices</a></div><div class="sidebar-section-children"><a href="tutorial-13-Tips-and-tricks.html">Tips and tricks</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Actions.html">Actions</a></div><div class="sidebar-section-children"><a href="AddText.html">AddText</a></div><div class="sidebar-section-children"><a href="AndroidCommand.html">AndroidCommand</a></div><div class="sidebar-section-children"><a href="Bidi.html">Bidi</a></div><div class="sidebar-section-children"><a href="Cache.html">Cache</a></div><div class="sidebar-section-children"><a href="ChromeDevelopmentToolsProtocol.html">ChromeDevelopmentToolsProtocol</a></div><div class="sidebar-section-children"><a href="ChromeTrace.html">ChromeTrace</a></div><div class="sidebar-section-children"><a href="Click.html">Click</a></div><div class="sidebar-section-children"><a href="ClickAndHold.html">ClickAndHold</a></div><div class="sidebar-section-children"><a href="Commands.html">Commands</a></div><div class="sidebar-section-children"><a href="ContextClick.html">ContextClick</a></div><div class="sidebar-section-children"><a href="Debug.html">Debug</a></div><div class="sidebar-section-children"><a href="DoubleClick.html">DoubleClick</a></div><div class="sidebar-section-children"><a href="Element.html">Element</a></div><div class="sidebar-section-children"><a href="GeckoProfiler.html">GeckoProfiler</a></div><div class="sidebar-section-children"><a href="JavaScript.html">JavaScript</a></div><div class="sidebar-section-children"><a href="Measure.html">Measure</a></div><div class="sidebar-section-children"><a href="Meta.html">Meta</a></div><div class="sidebar-section-children"><a href="MouseMove.html">MouseMove</a></div><div class="sidebar-section-children"><a href="Navigation.html">Navigation</a></div><div class="sidebar-section-children"><a href="Screenshot.html">Screenshot</a></div><div class="sidebar-section-children"><a href="Scroll.html">Scroll</a></div><div class="sidebar-section-children"><a href="Select.html">Select</a></div><div class="sidebar-section-children"><a href="Set.html">Set</a></div><div class="sidebar-section-children"><a href="SingleClick.html">SingleClick</a></div><div class="sidebar-section-children"><a href="StopWatch.html">StopWatch</a></div><div class="sidebar-section-children"><a href="Switch.html">Switch</a></div><div class="sidebar-section-children"><a href="Wait.html">Wait</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html> |