#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod browser;
pub mod browser_context;
pub mod cookies;
pub mod element;
pub mod error;
#[cfg(feature = "expect")]
pub mod expect;
pub(crate) mod expert;
pub mod frame;
pub mod input;
pub(crate) mod isolated_world;
#[cfg(feature = "monitor")]
pub mod monitor;
pub mod network_idle;
pub mod pdf;
pub(crate) mod preferences;
pub mod query;
pub mod request;
pub mod screenshot;
pub mod storage;
pub mod tab;
pub mod traits;
pub(crate) mod url_matcher;
pub mod window;
pub use browser::{Browser, BrowserBuilder, Channel, PermissionType};
pub use browser_context::BrowserContext;
pub use cookies::{Cookie, CookieJar, CookiePriority, CookieSourceScheme, SameSite};
pub use element::Element;
pub use element::actions::ClickOptions;
pub use error::{BrowserError, Result, ZendriverError};
pub use frame::Frame;
pub use input::{Key, KeyModifiers, KeySequence, MouseButton, SpecialKey};
pub use pdf::PdfBuilder;
pub use query::{AriaRole, BoundingBox, FindBuilder, PageBox};
pub use request::{RequestBuilder, Response};
pub use screenshot::{Format, ScreenshotBuilder};
pub use storage::Storage;
pub use tab::{
FrameResourceMatch, ReadyState, ReloadOptions, ScrollOptions, Tab, UserAgentOverride,
};
pub use traits::{Evaluable, Queryable};
pub use window::{WindowBounds, WindowState};
pub use zendriver_stealth::{Persona, PersonaBuilder, Seed, Strategy, Surface};
pub use zendriver_transport::{CallError, Connection, SessionHandle, TransportError};
#[cfg(feature = "interception")]
pub use zendriver_interception::{
AbortReason, InterceptBuilder, InterceptHandle, InterceptionError, PausedRequest, RequestInfo,
RequestOverrides, RequestStage, ResourceType, ResponseInfo, ResponseOverrides,
};
#[cfg(feature = "cloudflare")]
pub use zendriver_cloudflare::{ClearanceOutcome, CloudflareBypass, CloudflareError};
#[cfg(feature = "imperva")]
pub use zendriver_imperva::{
CaptchaChallenge, CaptchaKind, CaptchaSolution, CookieSnapshot, DetectionSnapshot,
ImpervaBypass, ImpervaError, ImpervaSurface, detect_surface,
};
#[cfg(feature = "imperva")]
pub use zendriver_imperva::ClearanceOutcome as ImpervaClearanceOutcome;
#[cfg(feature = "datadome")]
pub use zendriver_datadome::{
DataDomeBypass, DataDomeChallenge, DataDomeError, DataDomeSolution, DataDomeSurface,
detect_surface as datadome_detect_surface,
};
#[cfg(feature = "datadome")]
pub use zendriver_datadome::ClearanceOutcome as DataDomeClearanceOutcome;
pub use url_matcher::UrlMatcher;
#[cfg(feature = "monitor")]
pub use monitor::{
FrameDirection, MonitorBuilder, MonitoredRequest, MonitoredResponse, NetworkEvent,
NetworkExchange, NetworkMonitor,
};
#[cfg(feature = "expect")]
pub use expect::request::{MatchedRequest, RequestExpectation};
#[cfg(feature = "expect")]
pub use expect::response::{MatchedResponse, ResponseExpectation};
#[cfg(feature = "expect")]
pub use expect::dialog::{DialogExpectation, DialogType, MatchedDialog};
#[cfg(feature = "expect")]
pub use expect::download::{
DownloadExpectation, DownloadProgressState, DownloadState, MatchedDownload,
};
#[cfg(feature = "fetcher")]
pub use zendriver_fetcher::{
Channel as FetcherChannel, Fetcher, FetcherError, FetcherPhase, FetcherProgress, Platform,
VersionSpec,
};
pub mod stealth {
pub use zendriver_stealth::{
Fingerprint, Persona, PersonaBuilder, Platform, Seed, StealthProfile, Strategy, Surface,
UserAgentMetadata,
};
}
pub async fn start() -> Result<Browser> {
Browser::builder().launch().await
}
#[cfg(test)]
#[allow(dead_code)]
mod auto_trait_assertions {
use super::*;
fn assert_send_sync<T: Send + Sync>() {}
#[test]
fn public_surface_is_send_sync() {
assert_send_sync::<Browser>();
assert_send_sync::<BrowserBuilder>();
assert_send_sync::<Channel>();
assert_send_sync::<PermissionType>();
assert_send_sync::<Tab>();
assert_send_sync::<Element>();
assert_send_sync::<Frame>();
assert_send_sync::<Storage>();
assert_send_sync::<CookieJar>();
assert_send_sync::<Cookie>();
assert_send_sync::<SameSite>();
assert_send_sync::<BoundingBox>();
assert_send_sync::<PageBox>();
assert_send_sync::<AriaRole>();
assert_send_sync::<Format>();
assert_send_sync::<MouseButton>();
assert_send_sync::<Key>();
assert_send_sync::<SpecialKey>();
assert_send_sync::<KeyModifiers>();
assert_send_sync::<ClickOptions>();
assert_send_sync::<ReloadOptions>();
assert_send_sync::<ScrollOptions>();
assert_send_sync::<UserAgentOverride>();
assert_send_sync::<ReadyState>();
assert_send_sync::<FrameResourceMatch>();
assert_send_sync::<WindowBounds>();
assert_send_sync::<WindowState>();
assert_send_sync::<ZendriverError>();
assert_send_sync::<BrowserError>();
}
#[test]
fn url_matcher_is_send_sync() {
assert_send_sync::<UrlMatcher>();
}
#[cfg(feature = "expect")]
#[test]
fn expect_surface_is_send_sync() {
assert_send_sync::<MatchedRequest>();
assert_send_sync::<RequestExpectation>();
assert_send_sync::<MatchedResponse>();
assert_send_sync::<ResponseExpectation>();
assert_send_sync::<MatchedDialog>();
assert_send_sync::<DialogExpectation>();
assert_send_sync::<DialogType>();
assert_send_sync::<MatchedDownload>();
assert_send_sync::<DownloadExpectation>();
assert_send_sync::<DownloadState>();
assert_send_sync::<DownloadProgressState>();
}
#[cfg(feature = "monitor")]
#[test]
fn monitor_surface_is_send_sync() {
assert_send_sync::<NetworkEvent>();
assert_send_sync::<NetworkExchange>();
assert_send_sync::<MonitoredRequest>();
assert_send_sync::<MonitoredResponse>();
assert_send_sync::<FrameDirection>();
assert_send_sync::<MonitorBuilder>();
assert_send_sync::<NetworkMonitor>();
}
#[cfg(feature = "interception")]
#[test]
fn interception_surface_is_send_sync() {
assert_send_sync::<InterceptBuilder>();
assert_send_sync::<InterceptHandle>();
assert_send_sync::<InterceptionError>();
assert_send_sync::<PausedRequest>();
assert_send_sync::<RequestInfo>();
assert_send_sync::<RequestOverrides>();
assert_send_sync::<ResponseInfo>();
assert_send_sync::<RequestStage>();
assert_send_sync::<ResourceType>();
assert_send_sync::<AbortReason>();
}
#[cfg(feature = "cloudflare")]
#[test]
fn cloudflare_surface_is_send_sync() {
assert_send_sync::<CloudflareBypass>();
assert_send_sync::<CloudflareError>();
assert_send_sync::<ClearanceOutcome>();
}
#[cfg(feature = "imperva")]
use crate::{
CaptchaChallenge, CaptchaKind, CaptchaSolution, CookieSnapshot, DetectionSnapshot,
ImpervaBypass, ImpervaClearanceOutcome, ImpervaError, ImpervaSurface,
};
#[cfg(feature = "imperva")]
#[test]
fn imperva_surface_is_send_sync() {
assert_send_sync::<ImpervaBypass<'_>>();
assert_send_sync::<ImpervaError>();
assert_send_sync::<ImpervaSurface>();
assert_send_sync::<CaptchaKind>();
assert_send_sync::<CaptchaChallenge>();
assert_send_sync::<CaptchaSolution>();
assert_send_sync::<CookieSnapshot>();
assert_send_sync::<DetectionSnapshot>();
assert_send_sync::<ImpervaClearanceOutcome>();
}
#[cfg(feature = "datadome")]
#[allow(unused_imports)]
use crate::{DataDomeBypass, DataDomeClearanceOutcome, DataDomeError, DataDomeSurface};
#[cfg(feature = "datadome")]
#[test]
fn datadome_surface_is_send_sync() {
assert_send_sync::<DataDomeBypass<'_>>();
assert_send_sync::<DataDomeError>();
assert_send_sync::<DataDomeSurface>();
assert_send_sync::<DataDomeClearanceOutcome>();
}
#[cfg(feature = "fetcher")]
#[test]
fn fetcher_surface_is_send_sync() {
assert_send_sync::<Fetcher>();
assert_send_sync::<FetcherError>();
assert_send_sync::<FetcherPhase>();
assert_send_sync::<FetcherProgress>();
assert_send_sync::<Platform>();
assert_send_sync::<VersionSpec>();
assert_send_sync::<FetcherChannel>();
}
#[test]
fn stealth_surface_is_send_sync() {
assert_send_sync::<stealth::Fingerprint>();
assert_send_sync::<stealth::Platform>();
assert_send_sync::<stealth::StealthProfile>();
assert_send_sync::<stealth::UserAgentMetadata>();
}
}