gbserver/gb-automation/src/web.rs

74 lines
2.2 KiB
Rust
Raw Normal View History

2024-12-23 17:36:12 -03:00
use chromiumoxide::browser::{Browser, BrowserConfig};
2024-12-24 10:09:14 -03:00
use chromiumoxide::element::Element;
2024-12-23 17:36:12 -03:00
use chromiumoxide::page::Page;
use futures_util::StreamExt;
use gb_core::{Error, Result};
use tracing::instrument;
2024-12-22 20:56:52 -03:00
pub struct WebAutomation {
2024-12-23 17:36:12 -03:00
browser: Browser,
2024-12-22 20:56:52 -03:00
}
impl WebAutomation {
#[instrument]
pub async fn new() -> Result<Self> {
2024-12-24 10:09:14 -03:00
let config = BrowserConfig::builder()
.build()
.map_err(|e| Error::internal(e.to_string()))?;
let (browser, mut handler) = Browser::launch(config)
2024-12-22 20:56:52 -03:00
.await
2024-12-23 17:36:12 -03:00
.map_err(|e| Error::internal(e.to_string()))?;
2024-12-24 10:09:14 -03:00
2024-12-22 20:56:52 -03:00
tokio::spawn(async move {
while let Some(h) = handler.next().await {
if let Err(e) = h {
2024-12-23 17:36:12 -03:00
tracing::error!("Browser handler error: {}", e);
2024-12-22 20:56:52 -03:00
}
}
});
2024-12-23 17:36:12 -03:00
Ok(Self { browser })
2024-12-22 20:56:52 -03:00
}
#[instrument(skip(self))]
pub async fn new_page(&self) -> Result<Page> {
2024-12-24 10:09:14 -03:00
let params = chromiumoxide::cdp::browser_protocol::target::CreateTarget::new()
.url("about:blank");
self.browser.new_page(params)
2024-12-22 20:56:52 -03:00
.await
2024-12-24 10:09:14 -03:00
.map_err(|e| Error::internal(e.to_string()))
2024-12-22 20:56:52 -03:00
}
#[instrument(skip(self))]
pub async fn navigate(&self, page: &Page, url: &str) -> Result<()> {
page.goto(url)
.await
2024-12-24 10:09:14 -03:00
.map_err(|e| Error::internal(e.to_string()))
2024-12-22 20:56:52 -03:00
}
#[instrument(skip(self))]
pub async fn get_element(&self, page: &Page, selector: &str) -> Result<Element> {
2024-12-24 10:09:14 -03:00
page.find_element(selector)
2024-12-22 20:56:52 -03:00
.await
2024-12-24 10:09:14 -03:00
.map_err(|e| Error::internal(e.to_string()))
2024-12-22 20:56:52 -03:00
}
#[instrument(skip(self))]
2024-12-23 17:36:12 -03:00
pub async fn screenshot(&self, page: &Page, _path: &str) -> Result<Vec<u8>> {
2024-12-24 10:09:14 -03:00
let params = chromiumoxide::cdp::browser_protocol::page::CaptureScreenshot::new();
page.screenshot(params)
2024-12-22 20:56:52 -03:00
.await
2024-12-24 10:09:14 -03:00
.map_err(|e| Error::internal(e.to_string()))
2024-12-22 20:56:52 -03:00
}
#[instrument(skip(self))]
pub async fn wait_for_selector(&self, page: &Page, selector: &str) -> Result<()> {
2024-12-23 17:36:12 -03:00
page.find_element(selector)
2024-12-22 20:56:52 -03:00
.await
2024-12-23 17:36:12 -03:00
.map_err(|e| Error::internal(e.to_string()))?;
2024-12-22 20:56:52 -03:00
Ok(())
}
}