browsertime
Version:
Get performance metrics from your web page using Browsertime.
274 lines (247 loc) • 7.94 kB
JavaScript
import { Actions } from './command/actions.js';
import { AddText } from './command/addText.js';
import { Click } from './command/click.js';
import { Element } from './command/element.js';
import { Wait } from './command/wait.js';
import { Measure } from './command/measure.js';
import { JavaScript } from './command/javaScript.js';
import { Switch } from './command/switch.js';
import { Screenshot } from './command/screenshot.js';
import { Set } from './command/set.js';
import { Cache } from './command/cache.js';
import { Meta } from './command/meta.js';
import { Watch as StopWatch } from './command/stopWatch.js';
import { Select } from './command/select.js';
import { Debug } from './command/debug.js';
import { Bidi } from './command/bidi.js';
import { AndroidCommand } from './command/android.js';
import { ChromeDevelopmentToolsProtocol } from './command/chromeDevToolsProtocol.js';
import { ChromeTrace } from './command/chromeTrace.js';
import {
SingleClick,
DoubleClick,
ClickAndHold,
ContextClick,
MouseMove
} from './command/mouse/index.js';
import { Scroll } from './command/scroll.js';
import { Navigation } from './command/navigation.js';
import { GeckoProfiler } from '../../firefox/geckoProfiler.js';
import { GeckoProfiler as GeckoProfilerCommand } from './command/geckoProfiler.js';
/**
* Represents the set of commands available in a Browsertime script.
* @hideconstructor
*/
export class Commands {
constructor(
browser,
engineDelegate,
index,
result,
storageManager,
pageCompleteCheck,
context,
videos,
screenshotManager,
scriptsByCategory,
asyncScriptsByCategory,
postURLScripts,
options
) {
const measure = new Measure(
browser,
index,
pageCompleteCheck,
result,
engineDelegate,
storageManager,
videos,
scriptsByCategory,
asyncScriptsByCategory,
postURLScripts,
context,
screenshotManager,
options
);
const browserProfiler = new GeckoProfiler(browser, storageManager, options);
// Profiler
this.profiler = new GeckoProfilerCommand(
browserProfiler,
browser,
index,
options,
result
);
const cdp = new ChromeDevelopmentToolsProtocol(
engineDelegate,
options.browser
);
/**
* Manages Chrome trace functionality, enabling custom profiling and trace collection in Chrome.
* @type {ChromeTrace}
*/
this.trace = new ChromeTrace(engineDelegate, index, options, result);
/**
* Provides functionality to perform click actions on elements in a web page using various selectors.
* @type {Click}
*/
this.click = new Click(browser, pageCompleteCheck);
/**
* Provides functionality to control page scrolling in the browser.
* @type {Scroll}
*/
this.scroll = new Scroll(browser, options);
/**
* Provides functionality to add text to elements on a web page using various selectors.
* @type {AddText}
*/
this.addText = new AddText(browser);
/**
* Provides functionality to wait for different conditions in the browser.
* @type {Wait}
*/
this.wait = new Wait(browser, pageCompleteCheck);
/**
* Provides functionality for measuring a navigation.
* @type {Measure}
*/
this.measure = measure;
/**
* Navigates to a specified URL and handles additional setup for a page visit.
* @async
* @example await commands.navigate('https://www.example.org');
* @type {Function}
* @param {string} url - The URL to navigate to.
* @throws {Error} Throws an error if navigation or setup fails.
* @returns {Promise<void>} A promise that resolves when the navigation and setup are
*/
this.navigate = measure._navigate.bind(measure);
/**
* Provides functionality to control browser navigation such as back, forward, and refresh actions.
* @type {Navigation}
*/
this.navigation = new Navigation(browser, pageCompleteCheck);
/**
* Add a text that will be an error attached to the current page.
* @example await commands.error('My error message');
* @param {string} message - The error message.
* @type {Function}
*/
this.error = measure._error.bind(measure);
/**
* Mark this run as an failure. Add a message that explains the failure.
* @example await commands.markAsFailure('My failure message');
* @param {string} message - The message attached as a failure
* @type {Function}
*/
this.markAsFailure = measure._failure.bind(measure);
/**
* Executes JavaScript in the browser context.
* @type {JavaScript}
*/
this.js = new JavaScript(browser, pageCompleteCheck);
/**
* Switches context to different frames, windows, or tabs in the browser.
* @type {Switch}
*/
this.switch = new Switch(
browser,
pageCompleteCheck,
measure._navigate.bind(measure)
);
/**
* Sets values on HTML elements in the page.
* @type {Set}
*/
this.set = new Set(browser);
/**
* Stopwatch utility for measuring time intervals.
* @type {StopWatch}
*/
this.stopWatch = new StopWatch(measure);
/**
* Manages the browser's cache.
* @type {Cache}
*/
this.cache = new Cache(browser, options.browser, cdp);
/**
* Adds metadata to the user journey.
* @type {Meta}
*/
this.meta = new Meta();
/**
* Takes and manages screenshots.
* @type {Screenshot}
*/
this.screenshot = new Screenshot(screenshotManager, browser, index);
/**
* Use the Chrome DevTools Protocol, available in Chrome and Edge.
* @type {ChromeDevelopmentToolsProtocol}
*/
this.cdp = cdp;
/**
*
* Use WebDriver Bidi. Availible in Firefox and in the future more browsers.
* @type {Bidi}
*/
this.bidi = new Bidi(engineDelegate, options.browser);
/**
* Provides commands for interacting with an Android device.
* @type {AndroidCommand}
*/
this.android = new AndroidCommand(options);
/**
* Provides debugging capabilities within a browser automation script.
* It allows setting breakpoints to pause script execution and inspect the current state.
* @type {Debug}
*/
this.debug = new Debug(browser, options);
/**
* Interact with the page using the mouse.
* @type {Object}
*/
this.mouse = {
/**
* Move the mouse cursor to elements or specific positions on a web page.
* @type {MouseMove}
*/
moveTo: new MouseMove(browser),
/**
* Perform a context click (right-click) on elements in a web page.
* @type {ContextClick}
*/
contextClick: new ContextClick(browser),
/**
* Provides functionality to perform a single click action on elements or at specific positions in a web page.
* @type {SingleClick}
*/
singleClick: new SingleClick(browser, pageCompleteCheck),
/**
* Provides functionality to perform a double-click action on elements in a web page.
* @type {DoubleClick}
*/
doubleClick: new DoubleClick(browser, pageCompleteCheck),
/**
* Provides functionality to click and hold elements on a web page using different strategies.
* @type {ClickAndHold}
*/
clickAndHold: new ClickAndHold(browser)
};
/**
* Interact with a select element.
* @type {Select}
*/
this.select = new Select(browser);
/**
* Selenium's action sequence functionality.
* @type {Actions}
* @see https://www.selenium.dev/documentation/webdriver/actions_api/
*/
this.action = new Actions(browser);
/**
* Get Selenium's WebElements.
* @type {Element}
*/
this.element = new Element(browser);
}
}