use crate::protocol::locator::{
get_by_alt_text_selector, get_by_label_selector, get_by_placeholder_selector,
get_by_role_selector, get_by_test_id_selector, get_by_text_selector, get_by_title_selector,
};
use crate::protocol::{AriaRole, Frame, GetByRoleOptions, Locator, Page};
use std::sync::Arc;
#[derive(Clone)]
pub struct FrameLocator {
frame: Arc<Frame>,
selector: String,
page: Page,
}
impl FrameLocator {
pub(crate) fn new(frame: Arc<Frame>, frame_selector: String, page: Page) -> Self {
let selector = format!("{} >> internal:control=enter-frame", frame_selector);
Self {
frame,
selector,
page,
}
}
pub fn locator(&self, selector: &str) -> Locator {
Locator::new(
Arc::clone(&self.frame),
format!("{} >> {}", self.selector, selector),
self.page.clone(),
)
}
pub fn frame_locator(&self, selector: &str) -> FrameLocator {
FrameLocator {
frame: Arc::clone(&self.frame),
selector: format!(
"{} >> {} >> internal:control=enter-frame",
self.selector, selector
),
page: self.page.clone(),
}
}
pub fn owner(&self) -> Locator {
let owner_selector = self
.selector
.strip_suffix(" >> internal:control=enter-frame")
.unwrap_or(&self.selector)
.to_string();
Locator::new(Arc::clone(&self.frame), owner_selector, self.page.clone())
}
pub fn first(&self) -> FrameLocator {
self.nth(0)
}
pub fn last(&self) -> FrameLocator {
self.nth(-1)
}
pub fn nth(&self, index: i32) -> FrameLocator {
let owner_selector = self
.selector
.strip_suffix(" >> internal:control=enter-frame")
.unwrap_or(&self.selector);
FrameLocator {
frame: Arc::clone(&self.frame),
selector: format!(
"{} >> nth={} >> internal:control=enter-frame",
owner_selector, index
),
page: self.page.clone(),
}
}
pub fn get_by_text(&self, text: &str, exact: bool) -> Locator {
self.locator(&get_by_text_selector(text, exact))
}
pub fn get_by_label(&self, text: &str, exact: bool) -> Locator {
self.locator(&get_by_label_selector(text, exact))
}
pub fn get_by_placeholder(&self, text: &str, exact: bool) -> Locator {
self.locator(&get_by_placeholder_selector(text, exact))
}
pub fn get_by_alt_text(&self, text: &str, exact: bool) -> Locator {
self.locator(&get_by_alt_text_selector(text, exact))
}
pub fn get_by_title(&self, text: &str, exact: bool) -> Locator {
self.locator(&get_by_title_selector(text, exact))
}
pub fn get_by_test_id(&self, test_id: &str) -> Locator {
self.locator(&get_by_test_id_selector(test_id))
}
pub fn get_by_role(&self, role: AriaRole, options: Option<GetByRoleOptions>) -> Locator {
self.locator(&get_by_role_selector(role, options))
}
}
impl std::fmt::Debug for FrameLocator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("FrameLocator")
.field("selector", &self.selector)
.finish()
}
}