playwright-rs 0.12.0

Rust bindings for Microsoft Playwright
Documentation
// Coverage — Chromium-only code coverage collection
//
// See: https://playwright.dev/docs/api/class-coverage

use crate::error::Result;
use crate::protocol::page::Page;

/// Options for `Coverage::start_js_coverage`.
///
/// See: <https://playwright.dev/docs/api/class-coverage#coverage-start-js-coverage>
#[derive(Debug, Default, Clone)]
pub struct StartJSCoverageOptions {
    /// Whether to reset coverage on every navigation.
    ///
    /// Defaults to `true`.
    pub reset_on_navigation: Option<bool>,

    /// Whether to report anonymous scripts generated by the page.
    ///
    /// Defaults to `false`.
    pub report_anonymous_scripts: Option<bool>,
}

/// Options for `Coverage::start_css_coverage`.
///
/// See: <https://playwright.dev/docs/api/class-coverage#coverage-start-css-coverage>
#[derive(Debug, Default, Clone)]
pub struct StartCSSCoverageOptions {
    /// Whether to reset coverage on every navigation.
    ///
    /// Defaults to `true`.
    pub reset_on_navigation: Option<bool>,
}

/// A byte-offset range within a CSS stylesheet.
///
/// Used in [`CSSCoverageEntry`].
#[derive(Debug, Clone, serde::Deserialize)]
pub struct CoverageRange {
    /// Start byte offset (inclusive).
    pub start: usize,
    /// End byte offset (exclusive).
    pub end: usize,
}

/// A byte-offset range with hit count within a JavaScript function.
///
/// Used in [`JSFunctionCoverage`].
#[derive(Debug, Clone, serde::Deserialize)]
pub struct JSCoverageRange {
    /// Start byte offset (inclusive).
    #[serde(rename = "startOffset")]
    pub start_offset: usize,
    /// End byte offset (exclusive).
    #[serde(rename = "endOffset")]
    pub end_offset: usize,
    /// Number of times this range was executed.
    pub count: i64,
}

/// Per-function coverage data within a [`JSCoverageEntry`].
#[derive(Debug, Clone, serde::Deserialize)]
pub struct JSFunctionCoverage {
    /// The function name (empty string for anonymous functions).
    #[serde(rename = "functionName")]
    pub function_name: String,
    /// Whether this is block-level coverage (true) or function-level (false).
    #[serde(rename = "isBlockCoverage")]
    pub is_block_coverage: bool,
    /// Covered byte-offset ranges within this function.
    pub ranges: Vec<JSCoverageRange>,
}

/// A JavaScript coverage entry returned by `Coverage::stop_js_coverage`.
///
/// See: <https://playwright.dev/docs/api/class-coverage#coverage-stop-js-coverage>
#[derive(Debug, Clone, serde::Deserialize)]
pub struct JSCoverageEntry {
    /// The URL of the script.
    pub url: String,
    /// The V8 script ID.
    #[serde(rename = "scriptId")]
    pub script_id: String,
    /// The script source text.
    pub source: Option<String>,
    /// Per-function coverage data.
    pub functions: Vec<JSFunctionCoverage>,
}

/// A CSS coverage entry returned by `Coverage::stop_css_coverage`.
///
/// See: <https://playwright.dev/docs/api/class-coverage#coverage-stop-css-coverage>
#[derive(Debug, Clone, serde::Deserialize)]
pub struct CSSCoverageEntry {
    /// The URL of the stylesheet.
    pub url: String,
    /// The stylesheet source text.
    pub text: Option<String>,
    /// Byte-offset ranges of used CSS rules.
    pub ranges: Vec<CoverageRange>,
}

/// Provides JavaScript and CSS code coverage collection (Chromium only).
///
/// Access via [`Page::coverage`].
///
/// Coverage collection is only supported in Chromium. Calling these methods on
/// Firefox or WebKit will return an error.
///
/// See: <https://playwright.dev/docs/api/class-coverage>
#[derive(Clone)]
pub struct Coverage {
    page: Page,
}

impl Coverage {
    pub(crate) fn new(page: Page) -> Self {
        Self { page }
    }

    /// Starts collecting JavaScript coverage.
    ///
    /// Must be called before navigating to the page(s) you want to measure.
    ///
    /// # Errors
    ///
    /// Returns error if coverage is already started, if the browser is not
    /// Chromium, or if the RPC call fails.
    ///
    /// See: <https://playwright.dev/docs/api/class-coverage#coverage-start-js-coverage>
    pub async fn start_js_coverage(&self, options: Option<StartJSCoverageOptions>) -> Result<()> {
        self.page.coverage_start_js(options).await
    }

    /// Stops JavaScript coverage collection and returns the entries.
    ///
    /// # Errors
    ///
    /// Returns error if coverage was not started or if the RPC call fails.
    ///
    /// See: <https://playwright.dev/docs/api/class-coverage#coverage-stop-js-coverage>
    pub async fn stop_js_coverage(&self) -> Result<Vec<JSCoverageEntry>> {
        self.page.coverage_stop_js().await
    }

    /// Starts collecting CSS coverage.
    ///
    /// # Errors
    ///
    /// Returns error if coverage is already started, if the browser is not
    /// Chromium, or if the RPC call fails.
    ///
    /// See: <https://playwright.dev/docs/api/class-coverage#coverage-start-css-coverage>
    pub async fn start_css_coverage(&self, options: Option<StartCSSCoverageOptions>) -> Result<()> {
        self.page.coverage_start_css(options).await
    }

    /// Stops CSS coverage collection and returns the entries.
    ///
    /// # Errors
    ///
    /// Returns error if coverage was not started or if the RPC call fails.
    ///
    /// See: <https://playwright.dev/docs/api/class-coverage#coverage-stop-css-coverage>
    pub async fn stop_css_coverage(&self) -> Result<Vec<CSSCoverageEntry>> {
        self.page.coverage_stop_css().await
    }
}