Skip to content

stevepryde/thirtyfour

Repository files navigation

Crates.io docs.rs Build Status code coverage

thirtyfour

Thirtyfour is a Selenium / WebDriver library for Rust, for automated website UI testing.

Documentation is available as the Thirtyfour book, llms.txt, and llms-full.txt.

Features

  • All W3C WebDriver and WebElement methods supported
  • Create new browser session directly via WebDriver (e.g. chromedriver)
  • Create new browser session via Selenium Standalone or Grid
  • Find elements (via all common selectors e.g. Testid, Id, Class, CSS, Tag, XPath)
  • Send keys to elements, including key-combinations
  • Execute Javascript
  • Action Chains
  • Get and set cookies
  • Switch to frame/window/element/alert
  • Shadow DOM support
  • Alert support
  • Capture / Save screenshot of browser or individual element as PNG
  • Chrome DevTools Protocol (CDP) — typed commands plus optional WebSocket-based event subscription via the cdp-events feature
  • WebDriver BiDi (W3C bidirectional protocol) — typed commands and event subscription cross-browser, opt-in via the bidi feature
  • Powerful query interface (the recommended way to find elements) with explicit waits and various predicates
  • Component Wrappers (similar to Page Object Model)

Feature Flags

  • rustls-tls: (Default) Use rustls to provide TLS support (via reqwest).
  • native-tls: Use native TLS (via reqwest).
  • component: (Default) Enable the Component derive macro (via thirtyfour_macros) and export Component / ElementResolver from the prelude.
  • cdp: (Default) Typed Chrome DevTools Protocol commands.
  • cdp-events: WebSocket-backed CDP event subscription.
  • bidi: WebDriver BiDi (W3C) — typed commands and event subscription via WebDriver::bidi(). Opt in by calling caps.enable_bidi() before starting the session.

Example (async):

To run this example:

cargo run --example tokio_async
use thirtyfour::prelude::*;

#[tokio::main]
async fn main() -> WebDriverResult<()> {
     let caps = DesiredCapabilities::chrome();
     let driver = WebDriver::managed(caps).await?;

     // Navigate to https://wikipedia.org.
     driver.goto("https://wikipedia.org").await?;
     let elem_form = driver
         .query(By::Id("search-form"))
         .desc("Wikipedia search form")
         .single()
         .await?;

     // Querying from an element scopes the search to its subtree.
     let elem_text = elem_form
         .query(By::Id("searchInput"))
         .desc("Wikipedia search input")
         .single()
         .await?;

     // Type in the search terms.
     elem_text.send_keys("selenium").await?;

     // Click the search button.
     let elem_button = elem_form
         .query(By::Css("button[type='submit']"))
         .desc("Wikipedia search button")
         .single()
         .await?;
     elem_button.click().await?;

     // Wait for the unique article heading before checking the title.
     driver
         .query(By::ClassName("firstHeading"))
         .desc("Wikipedia article heading")
         .single()
         .await?;
     assert_eq!(driver.title().await?, "Selenium - Wikipedia");

     // Always explicitly close the browser.
     driver.quit().await?;

     Ok(())
}

Prefer stable selectors

When you control the application under test, give important elements stable data-testid hooks and select them with By::Testid:

let save_button = driver
    .query(By::Testid("settings-save"))
    .desc("settings save button")
    .single()
    .await?;

Prefer app-owned test IDs first, then stable semantic CSS selectors. Match visible text when the copy itself is part of the behavior you are testing, and use XPath only when CSS cannot reasonably express the target. The Wikipedia example above uses the stable selectors that third-party page actually exposes.

See the Element Queries chapter for the full selector guidance.

Minimum Supported Rust Version

Rust 1.88.

LICENSE

This work is dual-licensed under MIT or Apache 2.0. You can choose either license if you use this work.

See the NOTICE file for more details.

SPDX-License-Identifier: MIT OR Apache-2.0

About

Selenium WebDriver client for Rust, for automated testing of websites

Topics

Resources

Stars

1.4k stars

Watchers

10 watching

Forks

Packages

 
 
 

Contributors